GD_Pygame/gd_pygame.py
2024-02-27 20:39:19 +01:00

106 lines
3.4 KiB
Python

#!/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()