YAP/main.py
Carlo Ghisolfi c2f76d4222 First commit
2026-10-04 19:17:16 +02:00

201 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()