feat(game): add Button element

This commit is contained in:
Kristofers Solo 2024-01-02 15:40:05 +02:00
parent ca9e19be2a
commit b0240d1b10

View File

@ -0,0 +1,60 @@
import sys
import pygame
from attrs import define, field
from py2048.color import ColorScheme
from py2048.config import Config
@define
class Button:
text: str = field()
font_family: str = field()
font_size: int = field()
font_color: ColorScheme = field()
position: tuple[int, int] = field()
width: int = field()
height: int = field()
action = field()
bg_color: ColorScheme = field()
hover_color: ColorScheme = field()
font: pygame.Font = field(init=False)
rendered_text: pygame.Surface = field(init=False)
rect: pygame.Rect = field(init=False)
is_hovered: bool = field(init=False, default=False)
def __attrs_post_init__(self) -> None:
"""Initialize the button."""
self.font = pygame.font.SysFont(self.font_family, self.font_size)
self._draw_text()
def _draw_text(self) -> None:
"""Draw the text on the button."""
self.rendered_text = self.font.render(
self.text, True, self.font_color, self.bg_color
)
self.rect = pygame.Rect(
self.position[0], self.position[1], self.width, self.height
)
def check_hover(self, mouse_pos: tuple[int, int]) -> None:
"""Check if the mouse is hovering over the button."""
self.is_hovered = self.rect.collidepoint(mouse_pos)
def check_click(self, mouse_pos: tuple[int, int]) -> None:
"""Check if the button is clicked."""
if self.rect.collidepoint(mouse_pos) and self.action:
self.action()
def draw(self, surface: pygame.Surface) -> None:
"""Draw the button on the given surface."""
if self.is_hovered:
self._draw_rect(surface, self.hover_color)
else:
self._draw_rect(surface, self.bg_color)
surface.blit(self.rendered_text, self.position)
def _draw_rect(self, surface: pygame.Surface, color: ColorScheme) -> None:
"""Draw the button rectangle."""
pygame.draw.rect(surface, self.bg_color, self.rect)