diff --git a/src/game/screens/game.py b/src/game/screens/game.py index 42026f0..1dcd05d 100644 --- a/src/game/screens/game.py +++ b/src/game/screens/game.py @@ -4,13 +4,14 @@ import pygame from loguru import logger from utils import CONFIG, Figure, GameMode -from .base import BaseScreen +from .base import BaseScreen, SceenElement +from .pause import Pause from .preview import Preview from .score import Score from .tetris import Tetris -class Game(BaseScreen): +class Game(BaseScreen, SceenElement): """ Game class. @@ -33,16 +34,16 @@ class Game(BaseScreen): def __init__(self, game_mode: GameMode, settings: dict[str, Any]) -> None: self.game_mode = game_mode self.settings = settings + self._initialize_surface() + self._initialize_rect() self._initialize_game_components() self._start_background_music() self.paused = False def draw(self) -> None: - """ - Raises: - NotImplementedError: Not implemented yet. - """ - raise NotImplementedError + """Draw the score on the score surface.""" + self._update_display_surface() + self._draw_background() def update(self) -> None: """ @@ -53,12 +54,15 @@ class Game(BaseScreen): def run(self) -> None: """Run a single iteration of the game loop.""" - + self.draw() self.tetris.run() self.score.run() self.preview.update(self.next_figure) self.preview.run() + if self.paused: + self.pause_screen.draw() + self.clock.tick(CONFIG.game.fps) def mute(self) -> None: @@ -87,6 +91,7 @@ class Game(BaseScreen): self.tetris = Tetris(self._get_next_figure, self._update_score, self.game_mode, self.settings) self.score = Score(self.game_mode) self.preview = Preview() + self.pause_screen = Pause() def _update_score(self, lines: int, score: int, level: int) -> None: """ @@ -125,3 +130,28 @@ class Game(BaseScreen): self.music = pygame.mixer.Sound(CONFIG.music.background) self.music.set_volume(self.settings["Volume"]["Music"]["level"]) self.music.play(-1) + + def _initialize_surface(self) -> None: + """Initialize the pause screen surface.""" + self.surface = pygame.Surface(CONFIG.window.size) + self.display_surface = pygame.display.get_surface() + + def _initialize_rect(self) -> None: + """Initialize the score rectangle.""" + self.rect = self.surface.get_rect(topleft=(0, 0)) + + def _draw_background(self) -> None: + """Draw the background.""" + self.surface.fill(CONFIG.colors.bg) + + def _update_display_surface(self) -> None: + """Update the display surface.""" + self.display_surface.blit(self.surface, self.rect) + + def _draw_border(self) -> None: + """Draw the border. + + Raises: + NotImplementedError: Not implemented yet. + """ + raise NotImplementedError diff --git a/src/game/screens/main.py b/src/game/screens/main.py index de57002..e6f0e0e 100644 --- a/src/game/screens/main.py +++ b/src/game/screens/main.py @@ -63,14 +63,13 @@ class Main(BaseScreen, SceenElement, TextScreen): def run_game_loop(self) -> None: """Run a single iteration of the game loop.""" - if not self.game: + if self.game: + self.game.run() + else: self.draw() self.handle_events() - if self.game: - self.game.run() - self.update() def exit(self) -> None: diff --git a/src/game/screens/pause.py b/src/game/screens/pause.py new file mode 100644 index 0000000..1bb3f34 --- /dev/null +++ b/src/game/screens/pause.py @@ -0,0 +1,71 @@ +import pygame +from utils import CONFIG + +from .base import BaseScreen, SceenElement, TextScreen + + +class Pause(BaseScreen, SceenElement, TextScreen): + def __init__(self) -> None: + self._initialize_surface() + self._initialize_rect() + self._initialize_font() + + def run(self) -> None: + """ + Raises: + NotImplementedError: Not implemented yet. + """ + raise NotImplementedError + + def update(self) -> None: + self._update_display_surface() + + def draw(self) -> None: + """Update the display.""" + self.update() + self._draw_background() + self._draw_text() + + def _draw_text(self) -> None: + """Draw the text.""" + self._display_text("Paused") + + def _display_text(self, text: str) -> None: + """Display the text.""" + text_surface = self.font.render(text, True, CONFIG.colors.fg_float) + text_rect = text_surface.get_rect(center=self.rect.center) + self.text_surface.blit(text_surface, text_rect) + + def _draw_background(self) -> None: + """Draw the background.""" + self.surface.fill(CONFIG.colors.bg_float) + self.surface.set_alpha(100) + self.text_surface.set_colorkey("#000000") + self.text_surface.set_alpha(255) + + def _initialize_surface(self) -> None: + """Initialize the pause screen surface.""" + self.surface = pygame.Surface(CONFIG.window.size) + self.display_surface = pygame.display.get_surface() + self.text_surface = pygame.Surface(CONFIG.window.size) + + def _initialize_rect(self) -> None: + """Initialize the score rectangle.""" + self.rect = self.surface.get_rect(topleft=(0, 0)) + + def _initialize_font(self) -> None: + """Initialize the font used to display the text.""" + self.font = pygame.font.Font(CONFIG.font.family, CONFIG.font.size * 2) + + def _update_display_surface(self) -> None: + """Update the display surface.""" + self.display_surface.blit(self.surface, self.rect) + self.display_surface.blit(self.text_surface, self.rect) + + def _draw_border(self) -> None: + """Draw the border. + + Raises: + NotImplementedError: Not implemented yet. + """ + raise NotImplementedError