from datetime import timedelta import pygame # project modules from constants import * from levelstate import Level from levelstate import LevelState from new_gui import * import db_utils from gamestate import * from levelstate import Direction # ----------------------------------------------------------------------------------- # Play state Loop # ----------------------------------------------------------------------------------- def play(game_state, events): # for ease of use levelstate = game_state.level_state player = levelstate.player # Event polling for event in events: if event.type == pygame.QUIT: game_state.running = False elif event.type == pygame.KEYDOWN: # Controls if event.key == pygame.K_LCTRL: player.change_power() if event.key == pygame.K_LSHIFT: levelstate.change_player() player = levelstate.player if event.key == pygame.K_ESCAPE: game_state.state = State.PAUSE game_state.pause_start = pygame.time.get_ticks() # Movement if event.key == pygame.K_a: player.x = levelstate.try_move(Direction.HORIZ, player.x, player.y, -player.speed) elif event.key == pygame.K_d: player.x = levelstate.try_move(Direction.HORIZ, player.x, player.y, player.speed) elif event.key == pygame.K_w: player.y = levelstate.try_move(Direction.VERT, player.x, player.y, -player.speed) elif event.key == pygame.K_s: player.y = levelstate.try_move(Direction.VERT, player.x, player.y, player.speed) # update level state levelstate.update() # update sprites levelstate.all_sprites.update() # bg levelstate.draw(screen) # Timer Text time = timedelta(milliseconds=game_state.elapsed) levelstate.draw_gui(screen, time, small_font) # rendering of all the sprites levelstate.all_sprites.draw(screen) # ----------------------------------------------------------------------------------- # Pause state Loop # ----------------------------------------------------------------------------------- def pause_menu(game_state, events, mouse): # getting menu object menu = game_state.pause_menu # Display the menu menu.draw(screen, mouse, title_font, small_font) # Event polling handled by the menu for event in events: value = menu.handle_event(event, mouse) # Actions based on what has been done in the interaction with the menu if value == "playing": game_state.state = State.PLAY game_state.paused_time += pygame.time.get_ticks() - game_state.pause_start game_state.pause_start = None elif value == "select_level": game_state.level_state = None game_state.state = State.SELECT elif value == "quit_game": game_state.running = False # ----------------------------------------------------------------------------------- # Menu state Loop # ----------------------------------------------------------------------------------- def start_menu(game_state, events, mouse): menu = game_state.start_menu menu.draw(screen, mouse, title_font, small_font) for event in events: value = menu.handle_event(event, mouse) if value == "quit_game": game_state.running = False elif value == "select_level": game_state.state = State.SELECT elif value == "delete": db_utils.reset_db() # ----------------------------------------------------------------------------------- # Select state Loop # ----------------------------------------------------------------------------------- def select_level(game_state, events, mouse): menu = game_state.select_menu menu.draw(screen, mouse, title_font, small_font) # Event polling for event in events: value = menu.handle_event(event, mouse) if value == "quit_game": game_state.running = False elif value == "menu": game_state.state = State.MENU # The select level buttons have 2 values, the path and if the level is unlocked # This is way there is the check for a tuple elif value != None and isinstance(value, tuple): completed = int(value[1]) level_path = value[0] if completed == 1: game_state.level_state = LevelState(Level(level_path)) game_state.state = State.PLAY # Start timer game_state.play_start = pygame.time.get_ticks() game_state.paused_time = 0 game_state.elapsed = 0 break # ----------------------------------------------------------------------------------- # Complete state Loop # ----------------------------------------------------------------------------------- def completed_menu(game_state, events, mouse): menu = game_state.completed_menu menu.draw(screen, mouse, title_font, small_font) for event in events: value = menu.handle_event(event, mouse) if value == "quit_game": game_state.running = False elif value == "select_level": game_state.level_state = None game_state.state = State.SELECT elif value == "retry": game_state.state = State.PLAY game_state.level_state = LevelState(game_state.level_state.level) # Start timer game_state.play_start = pygame.time.get_ticks() game_state.paused_time = 0 game_state.elapsed = 0 # ----------------------------------------------------------------------------------- # PYGAME SETUP # ----------------------------------------------------------------------------------- pygame.init() screen = pygame.display.set_mode((WIDTH, HEIGHT)) clock = pygame.time.Clock() # Graphic assets title_font = pygame.font.Font('assets/ARCO.ttf', 35) small_font = pygame.font.Font('assets/ARCO.ttf', 20) background = pygame.transform.scale_by(pygame.image.load('assets/background.png').convert_alpha(), SCALE_FACTOR) # Db Init db_utils.init_db() # GameState setup game_state = GameState() # MAIN LOOP while game_state.running: screen.blit(background, (0, 0)) events = pygame.event.get() mouse = pygame.mouse.get_pos() if game_state.state == State.MENU: start_menu(game_state, events, mouse) elif game_state.state == State.PLAY: play(game_state, events) elif game_state.state == State.PAUSE: pause_menu(game_state, events, mouse) elif game_state.state == State.SELECT: select_level(game_state, events, mouse) elif game_state.state == State.COMPLETE: completed_menu(game_state, events, mouse) # update game_state game_state.update(pygame.time.get_ticks()) pygame.display.flip() clock.tick(FPS) pygame.quit()