import pygame from coords import Coords from common import DrawableGameObject, EventHandler, FONT_NAME, IS_WASM, SurfaceWithRect class EndLevelMenu(DrawableGameObject, EventHandler): def __init__(self, scene: DrawableGameObject): super().__init__(Coords.zero(), scene, scene.assets) self._surface, self.rect = self._create_end_game_label() self.win_image = self._create_win_image() self.win_label = self._create_win_label() self.keys_hint = self._create_keys_hint() self.stats_label = None self.active = False def _create_end_game_label(self) -> SurfaceWithRect: """Надпись завершения игры""" font = pygame.font.SysFont(FONT_NAME, 70) text = "Конец игры!" surface = font.render(text, 1, "#1b10a8c4") rect = surface.get_rect() rect.center = Coords(*self.parent.rect.center) + Coords(0, 38) return SurfaceWithRect(surface, rect) def _create_keys_hint(self) -> SurfaceWithRect: """Совет по кнопкам""" hint_text = "Для новой игры нажмите N" if not IS_WASM: hint_text += ", для выхода Q" font_hint = pygame.font.SysFont(FONT_NAME, 27) surface = font_hint.render(hint_text, 1, "#24053da4") rect = surface.get_rect() rect.center = self.parent.rect.center rect = rect.move(Coords(0, 220)) return SurfaceWithRect(surface, rect) def _create_win_label(self) -> SurfaceWithRect: """Надпись для хорошего финала""" font = pygame.font.SysFont(FONT_NAME, 33) text = "Все монетки собраны!" surface = font.render(text, 1, "#96081ba4") rect = surface.get_rect() rect.center = self.parent.rect.center rect.move_ip(Coords(0, -200)) return SurfaceWithRect(surface, rect) def _create_win_image(self) -> SurfaceWithRect: """Картинка для хорошего финала""" surface = pygame.image.load(self.scene.assets["win.png"]).convert_alpha() rect = surface.get_rect() rect.center = self.parent.rect.center return SurfaceWithRect(surface, rect) def _create_stats_label(self) -> SurfaceWithRect: """Общая статистика игры""" stats_text = f"Всего пройдено уровней: {self.scene.total_levels}, собрано монет: {self.scene.total_coins}" stats_font = pygame.font.SysFont(FONT_NAME, 27) surface = stats_font.render(stats_text, 1, "#031f03a4") rect = surface.get_rect() rect.center = Coords(*self.scene.rect.center) + Coords(0, 350) return SurfaceWithRect(surface, rect) def draw(self): if not self.active: return if self.scene.coins.all_collected: self.win_image.draw_to(self.parent.surface) self.win_label.draw_to(self.parent.surface) self.parent.surface.blit(self.surface, self.rect) self.keys_hint.draw_to(self.parent.surface) # статистика if self.stats_label is None: self.stats_label = self._create_stats_label() self.stats_label.draw_to(self.parent.surface) def request_new_level(self): self.scene.want_new_level = True self.scene.done = True def handle_keys(self, keys_pressed): if not self.active: return if keys_pressed[pygame.K_n]: self.request_new_level() def handle_mouse_event(self, event: pygame.event.Event): if event.type == pygame.MOUSEBUTTONDOWN and self.keys_hint.rect.collidepoint( event.pos ): self.request_new_level() def handle_event(self, event: pygame.event.Event): if not self.active: return self.handle_mouse_event(event)