98 lines
3.9 KiB
Python
98 lines
3.9 KiB
Python
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)
|