| @@ -1,6 +1,7 @@ | |||||
| from __future__ import annotations | from __future__ import annotations | ||||
| import sys | import sys | ||||
| from datetime import datetime | |||||
| from enum import Enum, auto | from enum import Enum, auto | ||||
| from typing import Callable, TypedDict | from typing import Callable, TypedDict | ||||
| @@ -8,17 +9,26 @@ import cv2 | |||||
| import pygame | import pygame | ||||
| from cv2 import VideoCapture | from cv2 import VideoCapture | ||||
| from pygame import Surface | from pygame import Surface | ||||
| from pygame.font import Font | |||||
| from pygame.mixer import Sound | |||||
| from pygame.time import Clock | from pygame.time import Clock | ||||
| pygame.init () | |||||
| FPS = 24 | |||||
| FPS = 30 | |||||
| SYSTEM_FONT = pygame.font.SysFont ('notosanscjkjp', 24, bold = True) | |||||
| USER_FONT = pygame.font.SysFont ('notosanscjkjp', 32, italic = True) | |||||
| DEERJIKA_FONT = pygame.font.SysFont ('07nikumarufont', 50) | |||||
| def main ( | def main ( | ||||
| ) -> None: | ) -> None: | ||||
| pygame.init () | |||||
| game = Game () | game = Game () | ||||
| bg = Bg (game) | bg = Bg (game) | ||||
| deerjika = Deerjika (game, DeerjikaPattern.RELAXED) | |||||
| deerjika = Deerjika (game, DeerjikaPattern.RELAXED, | |||||
| x = CWindow.WIDTH * 3 / 4, y = CWindow.HEIGHT - 120) | |||||
| CurrentTime (game, SYSTEM_FONT) | |||||
| Sound ('assets/bgm.mp3').play (loops = -1) | |||||
| while True: | while True: | ||||
| for event in pygame.event.get (): | for event in pygame.event.get (): | ||||
| if event.type == pygame.QUIT: | if event.type == pygame.QUIT: | ||||
| @@ -56,7 +66,8 @@ class Game: | |||||
| self, | self, | ||||
| ) -> None: | ) -> None: | ||||
| for redrawer in sorted (self.redrawers, key = lambda x: x['layer']): | for redrawer in sorted (self.redrawers, key = lambda x: x['layer']): | ||||
| redrawer['func'] () | |||||
| if redrawer['obj'].enabled: | |||||
| redrawer['obj'].redraw () | |||||
| pygame.display.update () | pygame.display.update () | ||||
| self.clock.tick (FPS) | self.clock.tick (FPS) | ||||
| @@ -73,22 +84,25 @@ class GameObject: | |||||
| ax: float = 0 | ax: float = 0 | ||||
| ay: float = 0 | ay: float = 0 | ||||
| arg: float = 0 | arg: float = 0 | ||||
| enabled: bool = True | |||||
| def __init__ ( | def __init__ ( | ||||
| self, | self, | ||||
| game: Game, | |||||
| layer: int | None = None, | |||||
| x: float = 0, | |||||
| y: float = 0, | |||||
| game: Game, | |||||
| layer: int | None = None, | |||||
| enabled: bool = True, | |||||
| x: float = 0, | |||||
| y: float = 0, | |||||
| ): | ): | ||||
| self.game = game | self.game = game | ||||
| self.enabled = enabled | |||||
| self.frame = 0 | self.frame = 0 | ||||
| if layer is None: | if layer is None: | ||||
| if self.game.redrawers: | if self.game.redrawers: | ||||
| layer = max (r['layer'] for r in self.game.redrawers) + 10 | layer = max (r['layer'] for r in self.game.redrawers) + 10 | ||||
| else: | else: | ||||
| layer = 0 | layer = 0 | ||||
| self.game.redrawers.append ({ 'layer': layer, 'func': self.redraw }) | |||||
| self.game.redrawers.append ({ 'layer': layer, 'obj': self }) | |||||
| self.x = x | self.x = x | ||||
| self.y = y | self.y = y | ||||
| @@ -123,6 +137,9 @@ class Bg (GameObject): | |||||
| class Deerjika (GameObject): | class Deerjika (GameObject): | ||||
| surfaces: list[Surface] | surfaces: list[Surface] | ||||
| size: int | size: int | ||||
| width: int | |||||
| height: int | |||||
| scale: float = .8 | |||||
| def __init__ ( | def __init__ ( | ||||
| self, | self, | ||||
| @@ -133,7 +150,7 @@ class Deerjika (GameObject): | |||||
| x: float = 0, | x: float = 0, | ||||
| y: float = 0, | y: float = 0, | ||||
| ): | ): | ||||
| super ().__init__ (game, layer, x, y) | |||||
| super ().__init__ (game, layer, x = x, y = y) | |||||
| self.pattern = pattern | self.pattern = pattern | ||||
| self.direction = direction | self.direction = direction | ||||
| match pattern: | match pattern: | ||||
| @@ -142,7 +159,13 @@ class Deerjika (GameObject): | |||||
| case DeerjikaPattern.RELAXED: | case DeerjikaPattern.RELAXED: | ||||
| match direction: | match direction: | ||||
| case Direction.LEFT: | case Direction.LEFT: | ||||
| self.surfaces = get_surfaces_from_video ('assets/deerjika_relax.mp4') | |||||
| self.width = 1280 | |||||
| self.height = 720 | |||||
| surface = pygame.image.load ('assets/deerjika_relax_left.png') | |||||
| self.surfaces = [] | |||||
| for x in range (0, surface.get_width (), self.width): | |||||
| self.surfaces.append ( | |||||
| surface.subsurface (x, 0, self.width, self.height)) | |||||
| case Direction.RIGHT: | case Direction.RIGHT: | ||||
| ... | ... | ||||
| self.size = len (self.surfaces) | self.size = len (self.surfaces) | ||||
| @@ -150,11 +173,32 @@ class Deerjika (GameObject): | |||||
| def redraw ( | def redraw ( | ||||
| self, | self, | ||||
| ) -> None: | ) -> None: | ||||
| surface: Surface = self.surfaces[self.frame % self.size] | |||||
| surface = pygame.transform.scale (self.surfaces[self.frame % self.size], | |||||
| (self.width * self.scale, self.height * self.scale)) | |||||
| self.game.screen.blit (surface, surface.get_rect (center = (self.x, self.y))) | self.game.screen.blit (surface, surface.get_rect (center = (self.x, self.y))) | ||||
| super ().redraw () | super ().redraw () | ||||
| class CurrentTime (GameObject): | |||||
| font: Font | |||||
| def __init__ ( | |||||
| self, | |||||
| game: Game, | |||||
| font: Font, | |||||
| ): | |||||
| super ().__init__ (game) | |||||
| self.font = font | |||||
| def redraw ( | |||||
| self, | |||||
| ) -> None: | |||||
| for i in range (4): | |||||
| self.game.screen.blit ( | |||||
| self.font.render (str (datetime.now ()), True, (0, 0, 0)), | |||||
| (i % 2, i // 2 * 2)) | |||||
| class CWindow: | class CWindow: | ||||
| WIDTH = 1024 | WIDTH = 1024 | ||||
| HEIGHT = 768 | HEIGHT = 768 | ||||
| @@ -162,7 +206,7 @@ class CWindow: | |||||
| class Redrawer (TypedDict): | class Redrawer (TypedDict): | ||||
| layer: int | layer: int | ||||
| func: Callable[[], None] | |||||
| obj: GameObject | |||||
| def get_surfaces_from_video ( | def get_surfaces_from_video ( | ||||
| @@ -189,14 +233,5 @@ def get_surfaces_from_video ( | |||||
| return surfaces | return surfaces | ||||
| def set_chroma_key ( | |||||
| surface: Surface, | |||||
| color: tuple[int, int, int], | |||||
| tolerance: int, | |||||
| ) -> Surface: | |||||
| # ChatGPT o kwakunin suru kutu | |||||
| ... | |||||
| if __name__ == '__main__': | if __name__ == '__main__': | ||||
| main () | main () | ||||