-
Notifications
You must be signed in to change notification settings - Fork 0
/
game_manager.py
126 lines (110 loc) · 4.48 KB
/
game_manager.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
"""Contain game manager."""
import pygame
import pygame_gui # type: ignore
from cringario_util import terminate
from config_parser import timer
from game_mode import SingleplayerGameMode, MultiplayerGameMode
from windows_manager import (
gui_manager, window_manager,
)
class GameManager:
"""Class controls game mode initialization, game cycle, windows."""
def __init__(self, screen):
"""
Initialize main display.
:param screen: screen where game is going.
"""
self.screen = screen
self.level_map = None
self.game = None
self.game_mode = None
self.is_game_started = False
self.esc_count = 0
def _game_cycle(self):
"""Run game cycle.Draw gui, level."""
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
terminate()
if event.type == pygame.KEYDOWN and self.is_game_started:
if pygame.key.get_pressed()[pygame.K_ESCAPE]:
self.esc_count += 1
self.check_buttons(event)
gui_manager.process_events(event)
if self.esc_count % 2 == 1:
self.game.is_freeze = True
window_manager.pause_game()
else:
if self.game is not None:
self.game.is_freeze = False
window_manager.unpause_game()
self.run_game()
self.draw_gui()
pygame.display.flip()
def draw_gui(self):
"""Draw gui by gui_manager."""
time_delta = timer.tick(60) / 1000
gui_manager.update(time_delta)
gui_manager.draw_ui(self.screen)
def create_game(self):
"""Create a game mode depending on the pressed key."""
if self.game_mode == 'singleplayer':
self.game = SingleplayerGameMode(
self.screen,
self.level_map,
)
elif self.game_mode == 'multiplayer':
self.game = MultiplayerGameMode(
self.screen,
self.level_map,
)
def check_buttons(self, event):
"""Check pressed buttons and run their logic."""
if event.type == pygame.USEREVENT:
if event.user_type == pygame_gui.UI_BUTTON_PRESSED:
if (event.ui_element ==
window_manager.pause_window.cancel_button):
window_manager.pause_window.kill()
self.esc_count += 1
if (event.ui_element ==
window_manager.pause_window.confirm_button):
self.esc_count += 1
self.__init__(self.screen)
window_manager.start_window.show()
if (event.ui_element ==
window_manager.pause_window.close_window_button):
window_manager.pause_window.kill()
self.esc_count += 1
if (event.ui_element ==
window_manager.start_window.single_play_button):
window_manager.start_window.hide()
window_manager.level_select_window.show()
self.game_mode = 'singleplayer'
if (event.ui_element ==
window_manager.start_window.competitive_play_button):
window_manager.start_window.hide()
window_manager.level_select_window.show()
self.game_mode = 'multiplayer'
if (event.ui_element ==
window_manager.score_window.back_button):
window_manager.score_window.hide()
window_manager.start_window.show()
for level in window_manager.level_select_window.level_buttons:
if event.ui_element == level:
self.level_map = level.level_map
window_manager.level_select_window.hide()
self.is_game_started = True
def run_game(self):
"""Control game existence."""
if self.is_game_started:
if not self.game:
self.create_game()
self.game.draw()
if self.game.is_game_over():
self.game = None
self.is_game_started = False
window_manager.score_window.show()
def run(self):
"""Run game cycle."""
self._game_cycle()