#!/usr/bin/python3 import pygame from pygame._sdl2 import Window from dataclasses import dataclass from wobbl_tools.data_file import load_dataclass_json, save_dataclass_json from ui import UI @dataclass class Settings: fps: int = 60 window_size: tuple = (1000, 600) class GDPygame: def __init__(self): pygame.init() self.screen = pygame.display.set_mode((1000, 600), pygame.RESIZABLE) pygame.display.set_caption("Game") self.window = Window.from_display_module() self.loading_surface = self.generate_loading_surface() self.screen.blit(self.loading_surface, (0, 0)) pygame.display.update() self.settings = load_dataclass_json(Settings, "settings.json") setattr(self.settings, "save", lambda: save_dataclass_json(self.settings, "settings.json")) self.fps = self.settings.fps self.ui = UI(self) # colors self.gray = (20, 20, 20) self.blue = (10, 10, 140) # pygame objects self.clock = pygame.time.Clock() self.mouse = pygame.mouse self.pusab = pygame.font.Font("PUSAB.otf") self.floor_texture = pygame.image.load("assets/textures/floors/floor_01.png") # textures self.floor_texture = pygame.transform.scale(self.floor_texture, (self.floor_texture.get_width() * 4, self.floor_texture.get_height() * 4)) self.background_texture = pygame.image.load("assets/textures/backgrounds/background_01.png") self.background_texture = pygame.transform.scale(self.background_texture, (self.background_texture.get_width() * ((self.screen.get_height() - self.floor_texture.get_height()) // self.background_texture.get_height()), self.screen.get_height() - self.floor_texture.get_height())) # properly scale the background # loading finished self.window.size = self.settings.window_size self.running = True def generate_loading_surface(self): default_font = pygame.font.Font("PUSAB.otf", 32) loading_text = default_font.render("Loading...", True, (240, 240, 240)) w, h = self.screen.get_size() loading_surface = pygame.Surface((w, h), flags=pygame.SRCALPHA) loading_surface.fill((40, 40, 40)) loading_surface.blit(loading_text, (w // 2 - loading_text.get_width() // 2, h // 2 - loading_text.get_height() // 2)) return loading_surface def loop(self): self.screen.fill(self.gray) self.ui.draw() self.get_events() if not self.running: return if self.loading_surface.get_alpha() > 0: # make the loading screen fade out self.screen.blit(self.loading_surface, (0, 0)) self.loading_surface.set_alpha(self.loading_surface.get_alpha() - 4) pygame.display.update() self.clock.tick(self.fps) def get_events(self): for event in pygame.event.get(): if event.type == pygame.QUIT: self.exit() return elif event.type == pygame.VIDEORESIZE: # when the window gets resized self.window_update(event.size) def exit(self): self.running = False self.settings.save() print("Bye!") def window_update(self, size): self.settings.window_size = size if __name__ == "__main__": geometry_dash = GDPygame() while geometry_dash.running: geometry_dash.loop()