-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgame.py
More file actions
111 lines (89 loc) · 2.99 KB
/
game.py
File metadata and controls
111 lines (89 loc) · 2.99 KB
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
import pygame
import resources
from constants import *
from pygame.time import Clock
from hiscores import Hiscores
from state.game_state import GameStateManager
from state.menu_state import MenuState
from input_handler import InputHandler
from threading import Thread, Lock
class Game:
def __init__(self):
self.input = InputHandler()
self.state_manager = GameStateManager()
self.hiscores = Hiscores(resources.get_hiscores(HISCORES_FILENAME))
self.logic_clock = Clock()
self.render_clock = Clock()
self.renderer = Thread(target=self.render_loop, args=())
self.renderer.daemon = True
self.rendering = Lock()
self.running = False
self.screen = None
self.canvas = None
def start(self):
# Set running to true
self.running = True
# Init the game
self.init()
# Start the renderer
self.renderer.start()
# Start running the game loop
self.logic_loop()
def stop(self):
# Set running to false
self.running = False
def init(self):
# Init mixer for sound specifications
pygame.mixer.pre_init(frequency=44100, size=-16, channels=2, buffer=512)
# Init pygame
pygame.init()
pygame.display.set_caption(GAME_TITLE)
# Set screen size
self.screen = pygame.display.set_mode((GAME_WIDTH * GAME_SCALE, GAME_HEIGHT * GAME_SCALE), pygame.DOUBLEBUF)
# Set canvas size
self.canvas = pygame.Surface((GAME_WIDTH, GAME_HEIGHT)).convert()
# Init the Input handler
self.input.init()
# Change to play state
self.state_manager.set_state(MenuState(self))
def render_loop(self):
while self.running:
# Tick the clock
self.render_clock.tick(GAME_MAX_FPS)
# Render game
with self.rendering:
self.render()
def logic_loop(self):
while self.running:
# Let the clock do the math
delta = self.logic_clock.tick(1000)
# Catch events
self.input.catch_events()
# Update game
self.update(delta)
# Quit pygame
pygame.quit()
def update(self, delta):
# Update input handler
self.input.update()
# Quit game if close is clicked
if self.input.quit:
self.stop()
# Update the game with delta given from clock
self.state_manager.update(delta)
def render(self):
# Clear screen
self.canvas.fill((255, 255, 255))
# Render game state manager on canvas
self.state_manager.render(self.canvas)
# Scale the canvas to the screen
scale_canvas = pygame.transform.scale(self.canvas, (self.screen.get_size()))
# Blit canvas to screen
self.screen.blit(scale_canvas, (0, 0))
# Render screen
pygame.display.flip()
def main():
# Start new game
Game().start()
if __name__ == '__main__':
main()