202 lines
7 KiB
Python
202 lines
7 KiB
Python
|
|
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()
|
||
|
|
|