2023-03-24 17:41:48 +01:00
|
|
|
import random
|
|
|
|
|
|
|
|
import pygame
|
|
|
|
|
2023-03-25 15:41:32 +01:00
|
|
|
from level.LevelManager import LevelManager
|
2023-03-26 15:14:06 +02:00
|
|
|
from level.elements.LoadedLevel import LoadedLevel
|
2023-03-27 14:38:52 +02:00
|
|
|
from physics import ConstantsParser
|
2023-03-26 09:51:11 +02:00
|
|
|
from physics.SpriteManager import SpriteManager, DrawLayers
|
2023-03-26 12:46:41 +02:00
|
|
|
from physics.TickData import TickData
|
2023-03-26 17:01:28 +02:00
|
|
|
from physics.sprites.PlayerSprite import PlayerSprite
|
2023-03-25 15:41:32 +01:00
|
|
|
from sprite.PositionScale import PositionScale
|
|
|
|
from sprite.Sprite import Sprite
|
2023-03-28 12:30:12 +02:00
|
|
|
from sprite.SpritesheetManager import SpritesheetManager
|
2023-03-25 15:41:32 +01:00
|
|
|
from sprite.StaticSprite import StaticSprite
|
2023-03-26 11:13:34 +02:00
|
|
|
from ui_elements.ClickEvent import ClickEvent
|
2023-03-26 15:01:58 +02:00
|
|
|
from ui_elements.KeyManager import KeyManager
|
2023-03-27 15:11:35 +02:00
|
|
|
from ui_elements.LevelMenu import LevelMenu
|
2023-03-25 15:41:32 +01:00
|
|
|
from ui_elements.TextLabel import TextLabel
|
2023-03-24 17:41:48 +01:00
|
|
|
|
2023-03-28 16:47:24 +02:00
|
|
|
what_to_run = 'level'
|
2023-03-25 17:18:43 +01:00
|
|
|
|
2023-03-28 16:47:24 +02:00
|
|
|
WIDTH = 12 * 71 * 1.5
|
|
|
|
HEIGHT = 12 * 40 * 1.5
|
|
|
|
|
|
|
|
# Background to test for level design
|
2023-03-28 19:35:42 +02:00
|
|
|
test_background_castle = pygame.transform.scale(pygame.image.load('data/sprites/castle_bg.png'), (WIDTH, HEIGHT))
|
2023-03-28 16:47:24 +02:00
|
|
|
# test_background_cave = pygame.transform.scale(pygame.image.load('data/sprites/cave_bg.png'), (WIDTH, HEIGHT))
|
2023-03-29 12:29:00 +02:00
|
|
|
#test_background_tutorial = pygame.transform.scale(pygame.image.load('data/sprites/tutorial_bg.png'), (WIDTH, HEIGHT))
|
2023-03-25 17:18:43 +01:00
|
|
|
|
2023-03-28 19:35:42 +02:00
|
|
|
|
|
|
|
|
2023-03-25 17:18:43 +01:00
|
|
|
def apply_frame_rate(number: float):
|
|
|
|
"""
|
|
|
|
this function calculates a factor that will be multiplied with the
|
|
|
|
physics of the game to provide a constant speed
|
|
|
|
:param number: The number to scale by the factor
|
|
|
|
:return: The scaled number
|
|
|
|
"""
|
|
|
|
return number / (frame_rate / 30)
|
|
|
|
|
2023-03-24 17:41:48 +01:00
|
|
|
|
2023-03-27 15:11:35 +02:00
|
|
|
if what_to_run == 'menu':
|
|
|
|
screen_transform = PositionScale((0, 0), (1.5, 1.5))
|
|
|
|
|
2023-03-27 17:48:28 +02:00
|
|
|
screen_height = 12 * 40 * 1.5
|
|
|
|
screen_width = 12 * 71 * 1.5
|
2023-03-28 16:47:24 +02:00
|
|
|
|
2023-03-27 15:11:35 +02:00
|
|
|
pygame.init()
|
2023-03-27 17:48:28 +02:00
|
|
|
screen = pygame.display.set_mode((screen_width, screen_height))
|
2023-03-27 15:11:35 +02:00
|
|
|
pygame.display.set_caption("PM GAME")
|
|
|
|
clock = pygame.time.Clock()
|
|
|
|
frame_rate = 30
|
|
|
|
|
|
|
|
spritesheet_manager = SpritesheetManager("data/sprites", "data/sprites/sprites.json")
|
|
|
|
sprite_manager = SpriteManager()
|
|
|
|
key_manager = KeyManager()
|
|
|
|
|
|
|
|
parsed_levels_manager = LevelManager('data/levels')
|
|
|
|
parsed_levels_manager.load_from_config('data/levels/levels.json')
|
|
|
|
|
|
|
|
generated_level = LoadedLevel(sprite_manager, spritesheet_manager)
|
|
|
|
|
2023-03-27 17:48:28 +02:00
|
|
|
level_menu_width = screen_width / 2
|
|
|
|
level_menu_height = screen_height / 2
|
|
|
|
level_menu = LevelMenu(parsed_levels_manager.levels, 0, 0, level_menu_width, level_menu_height, 3)
|
2023-03-28 14:51:17 +02:00
|
|
|
show_menu = False
|
|
|
|
|
2023-03-28 12:45:22 +02:00
|
|
|
|
|
|
|
def load_next_level(selected_level):
|
2023-03-28 14:51:17 +02:00
|
|
|
global show_menu
|
2023-03-28 12:45:22 +02:00
|
|
|
generated_level.destroy_level()
|
|
|
|
generated_level.load_level(selected_level)
|
2023-03-28 14:51:17 +02:00
|
|
|
destroy_menu()
|
|
|
|
show_menu = False
|
2023-03-28 12:45:22 +02:00
|
|
|
|
2023-03-27 15:11:35 +02:00
|
|
|
|
2023-03-28 14:51:17 +02:00
|
|
|
def destroy_menu():
|
|
|
|
global level_text_label
|
|
|
|
for level_text_label in level_menu.level_text_labels:
|
|
|
|
sprite_manager.remove_ui_element(level_text_label)
|
2023-03-28 16:59:29 +02:00
|
|
|
sprite_manager.remove_ui_element(level_menu.background)
|
2023-03-27 15:11:35 +02:00
|
|
|
|
2023-03-28 14:51:17 +02:00
|
|
|
|
|
|
|
level_menu.level_select_listener = lambda selected_level: load_next_level(selected_level)
|
2023-03-28 12:30:12 +02:00
|
|
|
|
2023-03-27 15:11:35 +02:00
|
|
|
while True:
|
|
|
|
clock.tick(frame_rate)
|
|
|
|
|
|
|
|
pygame_events: list[pygame.event.Event] = pygame.event.get()
|
|
|
|
key_manager.update_key_events(pygame_events)
|
|
|
|
click_events: list[ClickEvent] = ClickEvent.create_events(pygame_events, screen_transform)
|
|
|
|
|
2023-03-27 18:37:30 +02:00
|
|
|
for event in click_events:
|
|
|
|
for layer in sprite_manager.layers:
|
|
|
|
for sprite in sprite_manager.layers[layer]:
|
2023-03-28 14:51:17 +02:00
|
|
|
if sprite.get_bounding_box().contains_point(event.world_position):
|
2023-03-27 18:37:30 +02:00
|
|
|
sprite.click(event)
|
|
|
|
|
2023-03-27 15:11:35 +02:00
|
|
|
for event in pygame_events:
|
|
|
|
if event.type == pygame.QUIT:
|
|
|
|
pygame.quit()
|
|
|
|
quit()
|
2023-03-28 14:51:17 +02:00
|
|
|
if key_manager.is_keymap_down(KeyManager.KEY_ESCAPE):
|
|
|
|
if show_menu:
|
|
|
|
show_menu = False
|
|
|
|
destroy_menu()
|
|
|
|
else:
|
|
|
|
show_menu = True
|
2023-03-28 16:59:29 +02:00
|
|
|
sprite_manager.add_ui_element(DrawLayers.UI, level_menu.background)
|
2023-03-28 14:51:17 +02:00
|
|
|
for level_text_label in level_menu.level_text_labels:
|
|
|
|
sprite_manager.add_ui_element(DrawLayers.UI, level_text_label)
|
2023-03-27 15:11:35 +02:00
|
|
|
|
|
|
|
screen.fill((0, 0, 0))
|
|
|
|
sprite_manager.tick(TickData(apply_frame_rate(1), pygame_events, key_manager, click_events, screen_transform))
|
|
|
|
sprite_manager.draw(screen, screen_transform)
|
2023-03-28 12:30:12 +02:00
|
|
|
|
2023-03-27 15:11:35 +02:00
|
|
|
pygame.display.update()
|
|
|
|
|
|
|
|
elif what_to_run == 'level':
|
2023-03-26 15:14:06 +02:00
|
|
|
screen_transform = PositionScale((0, 0), (1.5, 1.5))
|
|
|
|
|
|
|
|
pygame.init()
|
2023-03-27 17:48:28 +02:00
|
|
|
screen = pygame.display.set_mode((12 * ConstantsParser.CONFIG.level_size[0] * screen_transform.scale[0],
|
2023-03-28 17:34:58 +02:00
|
|
|
12 * ConstantsParser.CONFIG.level_size[1] * screen_transform.scale[1]),
|
2023-03-28 19:35:42 +02:00
|
|
|
flags=pygame.HWSURFACE | pygame.DOUBLEBUF,
|
|
|
|
vsync=1,
|
|
|
|
depth=1)
|
2023-03-28 16:47:24 +02:00
|
|
|
|
2023-03-26 15:14:06 +02:00
|
|
|
pygame.display.set_caption("PM GAME")
|
|
|
|
clock = pygame.time.Clock()
|
2023-03-28 20:08:52 +02:00
|
|
|
frame_rate = 30
|
2023-03-26 15:14:06 +02:00
|
|
|
|
|
|
|
spritesheet_manager = SpritesheetManager("data/sprites", "data/sprites/sprites.json")
|
|
|
|
sprite_manager = SpriteManager()
|
|
|
|
key_manager = KeyManager()
|
|
|
|
|
|
|
|
parsed_levels_manager = LevelManager('data/levels')
|
|
|
|
parsed_levels_manager.load_from_config('data/levels/levels.json')
|
|
|
|
|
|
|
|
generated_level = LoadedLevel(sprite_manager, spritesheet_manager)
|
2023-03-29 12:29:00 +02:00
|
|
|
generated_level.load_level(parsed_levels_manager.levels[9])
|
2023-03-26 17:01:28 +02:00
|
|
|
ghost_character = PlayerSprite(spritesheet_manager.get_sheet("ghost_character"))
|
|
|
|
ghost_character.position_scale = PositionScale((90, 50), (1, 1))
|
|
|
|
sprite_manager.add_ui_element(DrawLayers.OBJECTS, ghost_character)
|
|
|
|
|
2023-03-27 14:38:52 +02:00
|
|
|
calculated_frame_rate_text = TextLabel("0 FPS", 2, 2, 70, alignment="left")
|
2023-03-27 12:54:09 +02:00
|
|
|
calculated_frame_rate_text.position_scale.scale = (0.3, 0.3)
|
|
|
|
sprite_manager.add_ui_element(DrawLayers.UI, calculated_frame_rate_text)
|
2023-03-26 17:01:28 +02:00
|
|
|
|
2023-03-28 19:35:42 +02:00
|
|
|
left_sprite = None
|
|
|
|
right_sprite = None
|
|
|
|
|
2023-03-26 15:14:06 +02:00
|
|
|
while True:
|
|
|
|
clock.tick(frame_rate)
|
2023-03-28 16:47:24 +02:00
|
|
|
|
2023-03-27 14:38:52 +02:00
|
|
|
calculated_frame_rate_text.text = f"{round(clock.get_fps())} FPS"
|
2023-03-26 15:14:06 +02:00
|
|
|
|
|
|
|
pygame_events: list[pygame.event.Event] = pygame.event.get()
|
|
|
|
key_manager.update_key_events(pygame_events)
|
|
|
|
click_events: list[ClickEvent] = ClickEvent.create_events(pygame_events, screen_transform)
|
|
|
|
|
|
|
|
for event in pygame_events:
|
|
|
|
if event.type == pygame.QUIT:
|
|
|
|
pygame.quit()
|
|
|
|
quit()
|
|
|
|
|
2023-03-28 19:35:42 +02:00
|
|
|
for event in click_events:
|
|
|
|
for layer in sprite_manager.layers:
|
|
|
|
for sprite in sprite_manager.layers[layer]:
|
|
|
|
if sprite.get_bounding_box().contains_point(event.world_position):
|
|
|
|
if event.is_click_down(ClickEvent.CLICK_LEFT):
|
|
|
|
left_sprite = sprite
|
|
|
|
if event.is_click_down(ClickEvent.CLICK_RIGHT):
|
|
|
|
right_sprite = sprite
|
2023-03-25 17:18:43 +01:00
|
|
|
|
2023-03-28 19:35:42 +02:00
|
|
|
if left_sprite is not None and right_sprite is not None:
|
|
|
|
print(left_sprite.get_bounding_box().distance(right_sprite.get_bounding_box()))
|
|
|
|
left_sprite = None
|
|
|
|
right_sprite = None
|
2023-03-25 15:41:32 +01:00
|
|
|
|
|
|
|
screen.fill((0, 0, 0))
|
2023-03-28 19:35:42 +02:00
|
|
|
# Playground to test background on any level
|
|
|
|
screen.blit(test_background_castle, (0, 0))
|
2023-03-25 15:41:32 +01:00
|
|
|
|
2023-03-26 15:01:58 +02:00
|
|
|
sprite_manager.tick(TickData(apply_frame_rate(1), pygame_events, key_manager, click_events, screen_transform))
|
2023-03-26 09:51:11 +02:00
|
|
|
sprite_manager.draw(screen, screen_transform)
|
2023-03-25 15:41:32 +01:00
|
|
|
pygame.display.update()
|
|
|
|
|
|
|
|
|
|
|
|
elif what_to_run == 'textlabel':
|
|
|
|
screen_transform = PositionScale((0, 0), (4, 4))
|
|
|
|
|
|
|
|
pygame.init()
|
2023-03-25 18:13:59 +01:00
|
|
|
screen = pygame.display.set_mode((800, 800))
|
2023-03-25 15:41:32 +01:00
|
|
|
pygame.display.set_caption("PM GAME")
|
|
|
|
clock = pygame.time.Clock()
|
|
|
|
|
2023-03-26 09:51:11 +02:00
|
|
|
test1 = TextLabel("Das ist ein Test", 100, 0, 50, alignment="left")
|
|
|
|
test2 = TextLabel("Das ist ein Test", 100, 50, 50, alignment="left")
|
|
|
|
test3 = TextLabel("Das ist ein Test", 100, 20, 50, alignment="left")
|
|
|
|
|
|
|
|
test1.position_scale.scale = (0.2, 0.2)
|
|
|
|
test2.position_scale.scale = (0.4, 0.4)
|
|
|
|
test3.position_scale.scale = (0.2, 0.2)
|
|
|
|
|
|
|
|
test3.visible = False
|
2023-03-25 15:41:32 +01:00
|
|
|
|
|
|
|
while True:
|
|
|
|
clock.tick(5)
|
|
|
|
|
|
|
|
for event in pygame.event.get():
|
|
|
|
if event.type == pygame.QUIT:
|
|
|
|
pygame.quit()
|
|
|
|
|
2023-03-25 18:13:59 +01:00
|
|
|
screen.fill((0, 0, 110))
|
|
|
|
|
|
|
|
test1.draw(screen, screen_transform)
|
|
|
|
test2.draw(screen, screen_transform)
|
|
|
|
test3.draw(screen, screen_transform)
|
2023-03-25 15:41:32 +01:00
|
|
|
|
|
|
|
pygame.display.update()
|