From 61976e40aa30ab88415325fb6490ffb84da3488d Mon Sep 17 00:00:00 2001 From: Kristofers Solo Date: Tue, 2 Jan 2024 15:40:14 +0200 Subject: [PATCH] feat(game): create main menu --- src/py2048/game.py | 10 ++++-- src/py2048/screens/elements/label.py | 6 ++-- src/py2048/screens/menu.py | 53 ++++++++++++++++++++++++++++ src/py2048/screens/settings.py | 0 4 files changed, 63 insertions(+), 6 deletions(-) create mode 100644 src/py2048/screens/menu.py create mode 100644 src/py2048/screens/settings.py diff --git a/src/py2048/game.py b/src/py2048/game.py index 82aca3e..29d624a 100644 --- a/src/py2048/game.py +++ b/src/py2048/game.py @@ -7,6 +7,7 @@ from .board import Board from .config import Config from .logger import setup_logger from .screens.header import Header +from .screens.menu import Menu from .utils import Direction @@ -20,6 +21,7 @@ class Game: pygame.display.set_caption("2048") self.board = Board() self.header = Header() + self.menu = Menu() self.score = 0 def run(self) -> None: @@ -31,13 +33,14 @@ class Game: def _update(self) -> None: """Update the game.""" - self.board.update() + # self.board.update() def _render(self) -> None: """Render the game.""" self.screen.fill(Config.COLORSCHEME.BG) - self.board.draw(self.screen) - self.header.draw(self.screen, self.score) + # self.board.draw(self.screen) + # self.header.draw(self.screen, self.score) + self.menu.draw(self.screen) pygame.display.flip() def _hande_events(self) -> None: @@ -56,6 +59,7 @@ class Game: self.move_down() elif event.key == pygame.K_q: self.exit() + self.menu._handle_events(event) def move_up(self) -> None: self.score += self.board.move(Direction.UP) diff --git a/src/py2048/screens/elements/label.py b/src/py2048/screens/elements/label.py index 68228b4..2115895 100644 --- a/src/py2048/screens/elements/label.py +++ b/src/py2048/screens/elements/label.py @@ -12,7 +12,7 @@ class Label: font_family: str font_color: ColorScheme font_size: int - font: pygame.font.Font = field(init=False) + font: pygame.Font = field(init=False) rendered_text: pygame.Surface = field(init=False) rect: pygame.Rect = field(init=False) @@ -30,5 +30,5 @@ class Label: self.text = new_text self._draw_text() - def draw(self, screen): - screen.blit(self.rendered_text, self.position) + def draw(self, surface: pygame.Surface) -> None: + surface.blit(self.rendered_text, self.position) diff --git a/src/py2048/screens/menu.py b/src/py2048/screens/menu.py new file mode 100644 index 0000000..0120258 --- /dev/null +++ b/src/py2048/screens/menu.py @@ -0,0 +1,53 @@ +import pygame +from loguru import logger +from py2048.config import Config + +from .elements.button import Button + + +class Menu: + def __init__(self): + self.buttons = [ + Button( + "Play", + Config.FONT_FAMILY, + Config.FONT_SIZE, + Config.COLORSCHEME.LIGHT_TEXT, + (Config.SCREEN_WIDTH / 2 - 50, Config.SCREEN_HEIGHT / 2 - 100), + 100, + 50, + self.play, + Config.COLORSCHEME.BOARD_BG, + Config.COLORSCHEME.BLOCK_0, + ), + Button( + "Exit", + Config.FONT_FAMILY, + Config.FONT_SIZE, + Config.COLORSCHEME.LIGHT_TEXT, + (Config.SCREEN_WIDTH / 2 - 50, Config.SCREEN_HEIGHT / 2), + 100, + 50, + self.exit, + Config.COLORSCHEME.BOARD_BG, + Config.COLORSCHEME.BLOCK_0, + ), + ] + + def _handle_events(self, event: pygame.event.Event) -> None: + if event.type == pygame.MOUSEMOTION: + for button in self.buttons: + button.check_hover(event.pos) + elif event.type == pygame.MOUSEBUTTONDOWN: + for button in self.buttons: + button.check_click(event.pos) + + def draw(self, surface: pygame.Surface) -> None: + for button in self.buttons: + button.draw(surface) + + def play(self) -> None: + logger.debug("Play") + + def exit(self) -> None: + logger.debug("Exit") diff --git a/src/py2048/screens/settings.py b/src/py2048/screens/settings.py new file mode 100644 index 0000000..e69de29