Refactor the main loop

This commit is contained in:
Nguyễn Gia Phong 2020-09-06 14:40:55 +07:00
parent feafd6ca4c
commit f83d2d0013
2 changed files with 42 additions and 36 deletions

View File

@ -212,39 +212,42 @@ class Slacker:
self.width = min(self.width, MAX_WIDTH[self.y])
self.speed = MAX_SPEED + self.y*SPEED_DIFF + randrange(5)
def main_loop(self, loop=True):
"""The main loop."""
while loop:
if self.game_state == INTRO:
for event in pygame.event.get():
if event.type == pygame.QUIT:
loop = False
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
self.game_state = PLAYING
elif event.key in (pygame.K_ESCAPE, pygame.K_q):
loop = False
def handle_intro(self):
"""Handle events in intro."""
for event in pygame.event.get():
if event.type == pygame.QUIT: return False
if event.type != pygame.KEYDOWN: continue
if event.key in (pygame.K_ESCAPE, pygame.K_q): return False
if event.key == pygame.K_SPACE: self.game_state = PLAYING
return True
elif self.game_state == PLAYING:
for event in pygame.event.get():
if event.type == pygame.QUIT:
loop = False
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
self.key_hit()
elif event.key in (pygame.K_ESCAPE, pygame.K_q):
self.__init__()
# Yes, this is a cheat.
elif event.key == pygame.K_0:
self.width += self.width < BOARD_WIDTH
elif event.key in range(pygame.K_1, pygame.K_9+1):
self.speed_ratio = (pygame.K_9-event.key+1) / 5.0
self.update_movement()
def handle_playing(self):
"""Handle events in game."""
for event in pygame.event.get():
if event.type == pygame.QUIT: return False
if event.type != pygame.KEYDOWN: continue
if event.key == pygame.K_SPACE:
self.key_hit()
elif event.key in (pygame.K_ESCAPE, pygame.K_q):
self.__init__()
# Yes, these are cheats.
elif event.key == pygame.K_0:
self.width += self.width < BOARD_WIDTH
elif event.key in range(pygame.K_1, pygame.K_9+1):
self.speed_ratio = (pygame.K_9-event.key+1) / 5.0
self.update_movement()
return True
elif self.game_state in (LOSE, WIN):
for event in pygame.event.get():
if event.type == pygame.QUIT:
loop = False
elif event.type == pygame.KEYDOWN:
self.__init__(restart=True)
self.update_screen()
def handle_ending(self):
"""Handle events in ending screens."""
for event in pygame.event.get():
if event.type == pygame.QUIT: return False
if event.type == pygame.KEYDOWN: self.__init__(restart=True)
return True
def handle_events(self):
"""Handle queued events."""
if self.game_state == INTRO: return self.handle_intro()
if self.game_state == PLAYING: return self.handle_playing()
if self.game_state in (LOSE, WIN): return self.handle_ending()
return False

View File

@ -2,8 +2,11 @@ from slacker_game import Slacker
def main():
"""Run game."""
with Slacker() as slacker:
slacker.main_loop()
for i in iter(slacker.handle_events, False):
slacker.update_screen()
if __name__ == '__main__': main()
if __name__ == '__main__':
main()