refactor(game): Label

This commit is contained in:
Kristofers Solo 2024-01-02 23:32:31 +02:00
parent 624401d27b
commit 65653457ed
4 changed files with 61 additions and 30 deletions

View File

@ -36,7 +36,7 @@ class Game:
"""Render the game.""" """Render the game."""
self.screen.fill(Config.COLORSCHEME.BG) self.screen.fill(Config.COLORSCHEME.BG)
self.board.draw(self.screen) self.board.draw(self.screen)
self.header.draw(self.screen, 0) self.header.draw(self.screen, 2048)
# self.menu.draw(self.screen) # self.menu.draw(self.screen)
pygame.display.flip() pygame.display.flip()

View File

@ -16,6 +16,8 @@ class UIElement(ABC, metaclass=ABCMeta):
position: Position, position: Position,
bg_color: str, bg_color: str,
font_color: str, font_color: str,
font_size: int = Config.FONT.size,
font_family: str = Config.FONT.family,
size: Size = Size(50, 50), size: Size = Size(50, 50),
text: str = "", text: str = "",
border_radius: int = 0, border_radius: int = 0,
@ -30,11 +32,15 @@ class UIElement(ABC, metaclass=ABCMeta):
self.border_width = border_width self.border_width = border_width
self.position = position self.position = position
self.x, self.y = self.position self.x, self.y = self.position
self.font = pygame.font.SysFont(Config.FONT.family, Config.FONT.size) self.font = pygame.font.SysFont(font_family, font_size)
@abstractmethod @abstractmethod
def draw(self, surface: pygame.Surface) -> None: def draw(self, surface: pygame.Surface) -> None:
"""Draw the element on the given surface.""" """Draw the element."""
@abstractmethod
def update(self) -> None:
"""Update the element."""
@abstractmethod @abstractmethod
def _draw_background(self, surface: pygame.Surface) -> None: def _draw_background(self, surface: pygame.Surface) -> None:

View File

@ -1,34 +1,57 @@
import pygame import pygame
from attrs import define, field from loguru import logger
from py2048 import Config from py2048 import Config
from py2048.utils import Position, Size
from .abc import UIElement
@define class Label(UIElement):
class Label: def __init__(self, *args, **kwargs) -> None:
text: str super().__init__(*args, **kwargs)
position: tuple[int, int]
bg_color: str
font_family: str
font_color: str
font_size: int
font: pygame.Font = field(init=False)
rendered_text: pygame.Surface = field(init=False)
rect: pygame.Rect = field(init=False)
def __attrs_post_init__(self): self.image = self._create_surface()
self.font = pygame.font.SysFont(self.font_family, self.font_size) self.rect = self.image.get_rect()
self._draw_text() self.rect.topleft = self.position
def draw(self, surface: pygame.Surface) -> None: def draw(self, surface: pygame.Surface) -> None:
surface.blit(self.rendered_text, self.position) """Draw the element on the given surface."""
# self._draw_background(surface)
def update(self, new_text: str) -> None:
self.text = new_text
self._draw_text() self._draw_text()
def update(self) -> None:
"""Update the sprite."""
self._draw_background(self.image)
self._draw_text()
self.image.blit(self.rendered_text, self.position)
def _draw_background(self, surface: pygame.Surface) -> None:
"""Draw a background for the given surface."""
rect = (0, 0, *self.size)
pygame.draw.rect(
surface, self.bg_color, rect, border_radius=Config.TILE.border.radius
) # background
pygame.draw.rect(
surface,
(0, 0, 0, 0),
rect,
border_radius=Config.TILE.border.radius,
width=Config.TILE.border.width,
) # border
def _draw_text(self) -> None: def _draw_text(self) -> None:
"""Draw the text of the element."""
self.rendered_text = self.font.render( self.rendered_text = self.font.render(
self.text, True, self.font_color, self.bg_color self.text, True, self.font_color, self.bg_color
) )
self.rect = self.rendered_text.get_rect(topleft=self.position) self.image.blit(
self.rendered_text,
self.rendered_text.get_rect(center=self.image.get_rect().center),
)
def _create_surface(self) -> pygame.Surface:
"""Create a surface for the element."""
surface = pygame.Surface(self.size, pygame.SRCALPHA)
self._draw_background(surface)
return surface

View File

@ -2,7 +2,7 @@ import pygame
from py2048 import Config from py2048 import Config
from py2048.objects import Label from py2048.objects import Label
from py2048.utils import Position from py2048.utils import Position, Size
class Header: class Header:
@ -11,15 +11,17 @@ class Header:
def draw(self, screen: pygame.Surface, score: int) -> None: def draw(self, screen: pygame.Surface, score: int) -> None:
"""Draw the header.""" """Draw the header."""
self.score = Label( self.label = Label(
text=f"{score}", text=f"{score}",
position=Position(10, 10), size=Size(50, 50),
position=Position(0, 0),
bg_color=Config.COLORSCHEME.BOARD_BG, bg_color=Config.COLORSCHEME.BOARD_BG,
font_family=Config.FONT.family,
font_color=Config.COLORSCHEME.DARK_TEXT, font_color=Config.COLORSCHEME.DARK_TEXT,
font_size=Config.FONT.size, font_size=16,
).draw(screen) )
self.label.draw(screen)
def update(self, score: int) -> None: def update(self, score: int) -> None:
"""Update the header.""" """Update the header."""
self.Label.text = f"{score}" self.label.text = f"SCORE\n{score}"
self.label.update()