From a96b1cc5a904839883acfd6335bce84bf9c01ddd Mon Sep 17 00:00:00 2001 From: "Waylon S. Walker" Date: Sat, 17 Jun 2023 10:33:48 -0500 Subject: [PATCH] wip --- learn_sql_model/game/game.py | 121 ++++++++++++++++++++++++++++++++++- 1 file changed, 118 insertions(+), 3 deletions(-) diff --git a/learn_sql_model/game/game.py b/learn_sql_model/game/game.py index 1e741a3..51dfab7 100644 --- a/learn_sql_model/game/game.py +++ b/learn_sql_model/game/game.py @@ -17,13 +17,114 @@ my_font = pygame.font.SysFont("Comic Sans MS", 30) config = get_config() +screen_sizes = [ + (480, 360), # 360p + (640, 480), # VGA + (800, 600), # SVGA + (1024, 768), # XGA + (1280, 720), # HD 720p + (1366, 768), # HD 1366x768 + (1600, 900), # HD+ 1600x900 + (1920, 1080), # Full HD 1080p + (2560, 1440), # 2K / QHD 1440p + (3840, 2160) # 4K / UHD 2160p +] + + +class Menu: + def __init__(self, game): + + self.game = game + self.menu_width = min(max(200, self.game.screen.get_width() + * 0.8), self.game.screen.get_width()) + self.menu_height = min(max(200, self.game.screen.get_height() + * 0.8), self.game.screen.get_height()) + self.x = (self.game.screen.get_width() - self.menu_width) / 2 + self.y = (self.game.screen.get_height() - self.menu_height) / 2 + self.color = (100, 100, 100) + self.is_menu_open = False + self.surface = pygame.Surface((self.menu_width, self.menu_height)) + self.font = pygame.font.SysFont("", 50) + self.screen_size_index = False + + def render(self): + if self.is_menu_open: + self.surface.fill(self.color) + # put text in the menu surface + text = self.font.render("Menu", True, (0, 0, 0)) + self.surface.blit(text, (0, 0)) + text = self.font.render("Screen Size", True, (0, 0, 0)) + self.surface.blit(text, (0, 60)) + text = self.font.render( + f'{self.game.screen.get_width()}x{self.game.screen.get_height()}', True, (25, 25, 25)) + self.surface.blit(text, (10, 120)) + + self.game.screen.blit(self.surface, (self.x, self.y)) + + def get_mouse_pos(self): + 'get mouse position relative to self.surface' + x, y = pygame.mouse.get_pos() + return x - self.x, y - self.y + + def handle_click(self): + print('checking click on menu') + pos = self.get_mouse_pos() + print(pos) + if pos[1] > 120 and pos[1] < 180 and pos[0] > 0 and pos[0] < self.menu_width: + if self.screen_size_index is False: + self.screen = pygame.display.set_mode(screen_sizes[0]) + self.screen_size_index = 0 + if self.screen_size_index == len(screen_sizes) - 1: + self.screen_size_index = 0 + else: + self.screen_size_index += 1 + self.screen = pygame.display.set_mode(screen_sizes[self.screen_size_index]) + + +class Hamburger: + def __init__(self, game): + + self.game = game + self.menu_width = 50 + self.bar_height = self.menu_width / 4 + self.bar_spacing = self.menu_width / 20 + self.menu_height = self.bar_height * 3 + self.bar_spacing * 2 + self.x = self.game.screen.get_width() - self.menu_width - 20 + self.y = 20 + self.color = (100, 100, 100) + self.menu = Menu(self.game) + self.rect = pygame.Rect(self.x, self.y, self.menu_width, + self.menu_height) + self.surface = pygame.Surface( + (self.menu_width, self.menu_height)) + + def render(self): + pygame.draw.rect(self.surface, self.color, + (0, 0, self.menu_width, self.bar_height),) + pygame.draw.rect(self.surface, self.color, + (0, self.bar_height + self.bar_spacing, self.menu_width, self.bar_height),) + pygame.draw.rect(self.surface, self.color, + (0, 2 * (self.bar_height + self.bar_spacing), self.menu_width, self.bar_height),) + + self.game.screen.blit(self.surface, (self.x, self.y)) + + self.menu.render() + + def handle_click(self): + pos = pygame.mouse.get_pos() + + if self.rect.collidepoint(pos): + self.menu.is_menu_open = not self.menu.is_menu_open + self.menu.handle_click() + class Client: def __init__(self): hero = HeroFactory().build(size=50, x=100, y=100) self.hero = HeroCreate(**hero.dict()).post() - self.screen = pygame.display.set_mode((800, 600)) + # self.screen = pygame.display.set_mode((800, 600)) + self.screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN) pygame.display.set_caption("Learn SQL Model") self.clock = pygame.time.Clock() self.running = True @@ -35,10 +136,11 @@ class Client: self.moving_right = False self.ticks = 0 self.others = [] + self.hamburger = Hamburger(self) atexit.register(self.quit) - @property + @ property def ws(self): def connect(): self._ws = create_connection( @@ -82,6 +184,15 @@ class Client: if self.moving_right: self.hero.x += speed + if self.hero.x < 0 + self.hero.size: + self.hero.x = 0 + self.hero.size + if self.hero.x > self.screen.get_width() - self.hero.size: + self.hero.x = self.screen.get_width() - self.hero.size + if self.hero.y < 0 + self.hero.size: + self.hero.y = 0 + self.hero.size + if self.hero.y > self.screen.get_height() - self.hero.size: + self.hero.y = self.screen.get_height() - self.hero.size + if self.ticks % 5 == 0 or self.ticks == 0: console.print("updating") update = HeroUpdate(**self.hero.dict(exclude_unset=True)) @@ -115,6 +226,7 @@ class Client: ) # update the screen + self.hamburger.render() pygame.display.flip() def handle_events(self): @@ -162,6 +274,9 @@ class Client: self.moving_left = False if event.key == pygame.K_d: self.moving_right = False + if event.type == pygame.MOUSEBUTTONDOWN: + if event.button == 1: # Left mouse button + self.hamburger.handle_click() def check_events(self): pass @@ -173,7 +288,7 @@ class Client: game_app = Typer() -@game_app.command() +@ game_app.command() def run(): client = Client() client.run()