import random import pygame from level.LevelManager import LevelManager from level.elements.LoadedLevel import LoadedLevel from physics import ConstantsParser from physics.SpriteManager import SpriteManager, DrawLayers from physics.TickData import TickData from physics.sprites.PlayerSprite import PlayerSprite from sprite.PositionScale import PositionScale from sprite.Sprite import Sprite from sprite.SpritesheetManager import SpritesheetManager from sprite.StaticSprite import StaticSprite from ui_elements.ClickEvent import ClickEvent from ui_elements.KeyManager import KeyManager from ui_elements.LevelMenu import LevelMenu from ui_elements.TextLabel import TextLabel what_to_run = 'menu' 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) if what_to_run == 'menu': screen_transform = PositionScale((0, 0), (1.5, 1.5)) screen_height = 12 * 40 * 1.5 screen_width = 12 * 71 * 1.5 pygame.init() screen = pygame.display.set_mode((screen_width, screen_height)) 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) 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) def load_next_level(selected_level): generated_level.destroy_level() generated_level.load_level(selected_level) level_menu.level_select_listener = lambda selected_level: load_next_level(selected_level) for level_text_label in level_menu.level_text_labels: sprite_manager.add_ui_element(DrawLayers.UI, level_text_label) # for testing last_click_pos = (0, 0) 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) for event in click_events: for layer in sprite_manager.layers: for sprite in sprite_manager.layers[layer]: last_click_pos = event.world_position if sprite.get_bounding_box().contains_point(last_click_pos): sprite.click(event) for event in pygame_events: if event.type == pygame.QUIT: pygame.quit() quit() # elif event.type == pygame.MOUSEBUTTONDOWN: # generated_level.load_level(parsed_levels_manager.levels[0]) screen.fill((0, 0, 0)) # level_menu.draw(screen, screen_transform) sprite_manager.tick(TickData(apply_frame_rate(1), pygame_events, key_manager, click_events, screen_transform)) sprite_manager.draw(screen, screen_transform) # print bounding boxes of menu labels for testing # for text_label in level_menu.level_text_labels: # bound_box = text_label.get_bounding_box() # # transformed_pos = transform_world_to_screen((bound_box.x, bound_box.y), screen_transform) # # rect = pygame.Rect(transformed_pos[0], transformed_pos[1], bound_box.width, bound_box.height) # rect = pygame.Rect(bound_box.x, bound_box.y, bound_box.width, bound_box.height) # # if text_label.text == 'level-01': # pygame.draw.rect(screen, (255, 0, 0), rect, 1) # # rect = pygame.Rect(last_click_pos[0], last_click_pos[1], 5, 5) # pygame.draw.rect(screen, (0, 255, 0), rect, 1) pygame.display.update() elif what_to_run == 'level': screen_transform = PositionScale((0, 0), (1.5, 1.5)) pygame.init() screen = pygame.display.set_mode((12 * ConstantsParser.CONFIG.level_size[0] * screen_transform.scale[0], 12 * ConstantsParser.CONFIG.level_size[1] * screen_transform.scale[1])) 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) generated_level.load_level(parsed_levels_manager.levels[2]) 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) calculated_frame_rate_text = TextLabel("0 FPS", 2, 2, 70, alignment="left") calculated_frame_rate_text.position_scale.scale = (0.3, 0.3) sprite_manager.add_ui_element(DrawLayers.UI, calculated_frame_rate_text) while True: clock.tick(frame_rate) calculated_frame_rate_text.text = f"{round(clock.get_fps())} FPS" 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() 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) pygame.display.update() elif what_to_run == 'physics': screen_transform = PositionScale((0, 0), (4, 4)) pygame.init() screen = pygame.display.set_mode((600, 500)) pygame.display.set_caption("PM GAME") clock = pygame.time.Clock() frame_rate = 59.52 spritesheet_manager = SpritesheetManager("data/sprites", "data/sprites/sprites.json") sprite_manager = SpriteManager() key_manager = KeyManager() # test_1_sprite = DynamicSprite(spritesheet_manager.get_sheet("test_1")) # test_1_sprite.position_scale = PositionScale((10, -100), (1, 1)) # sprite_manager.add_ui_element(DrawLayers.OBJECTS, test_1_sprite) # test_3_sprite = DynamicSprite(spritesheet_manager.get_sheet("test_1")) # test_3_sprite.position_scale = PositionScale((130, 100), (1, 1)) # test_3_sprite.motion = (-9, -10) # sprite_manager.add_ui_element(DrawLayers.OBJECTS, test_3_sprite) # test_2_sprite = StaticSprite(spritesheet_manager.get_sheet("test_1")) # test_2_sprite.position_scale = PositionScale((10, 80), (1, 1)) # sprite_manager.add_ui_element(DrawLayers.OBJECTS, test_2_sprite) for x in range(0, 8): floor_sprite = StaticSprite(spritesheet_manager.get_sheet("test_1")) floor_sprite.position_scale = PositionScale((x * 16, 100), (1, 1)) sprite_manager.add_ui_element(DrawLayers.OBJECTS, floor_sprite) for x in range(0, 8): floor_sprite = StaticSprite(spritesheet_manager.get_sheet("test_1")) floor_sprite.position_scale = PositionScale((x * 16, 0), (1, 1)) sprite_manager.add_ui_element(DrawLayers.OBJECTS, floor_sprite) for x in range(0, 6): floor_sprite = StaticSprite(spritesheet_manager.get_sheet("test_1")) floor_sprite.position_scale = PositionScale((0, x * 16), (1, 1)) sprite_manager.add_ui_element(DrawLayers.OBJECTS, floor_sprite) for x in range(0, 6): floor_sprite = StaticSprite(spritesheet_manager.get_sheet("test_1")) floor_sprite.position_scale = PositionScale((130, x * 16), (1, 1)) sprite_manager.add_ui_element(DrawLayers.OBJECTS, floor_sprite) 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) text_1 = TextLabel("Frame: 0", 2, 110, 50, alignment="left") text_1.position_scale.scale = (0.1, 0.1) sprite_manager.add_ui_element(DrawLayers.UI, text_1) ghost_character.debug_label = text_1 frame_counter = 0 while True: clock.tick(frame_rate) skip = False 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() if key_manager.is_keymap_down(KeyManager.KEY_RIGHT): skip = False if skip: continue frame_counter += 1 # text_1.set_text(f"Frame: {frame_counter}") 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) pygame.display.update() elif what_to_run == 'textlabel': screen_transform = PositionScale((0, 0), (4, 4)) pygame.init() screen = pygame.display.set_mode((800, 800)) pygame.display.set_caption("PM GAME") clock = pygame.time.Clock() 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 while True: clock.tick(5) for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() screen.fill((0, 0, 110)) test1.draw(screen, screen_transform) test2.draw(screen, screen_transform) test3.draw(screen, screen_transform) pygame.display.update() elif what_to_run == 'sprite': screen_transform = PositionScale((0, 0), (4, 4)) pygame.init() screen = pygame.display.set_mode((300, 300)) pygame.display.set_caption("PE GAME") clock = pygame.time.Clock() spritesheet_manager = SpritesheetManager("data/sprites", "data/sprites/sprites.json") test_1_sprite = Sprite(spritesheet_manager.get_sheet("test_1")) test_2_sprite = Sprite(spritesheet_manager.get_sheet("test_1")) test_1_sprite.position_scale = PositionScale((10, 10), (1, 1)) test_2_sprite.position_scale = PositionScale((60, 60), (1, 1)) # test_1_sprite.dump("debug.png") while True: clock.tick(5) for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() screen.fill((0, 0, 0)) test_1_sprite.tick(1) test_1_sprite.draw(screen, screen_transform) test_2_sprite.tick(1) test_2_sprite.draw(screen, screen_transform) pygame.display.update() if random.randint(1, 10) == 1: test_1_sprite.set_animation_state(random.choice(["walk_r", "walk_l", "idle", "other_test"])) print(test_1_sprite.animation_state)