Browse Source

#31 ニジカ足パタ対応

ai-migration
みてるぞ 1 month ago
parent
commit
f13c6d8260
4 changed files with 57 additions and 22 deletions
  1. BIN
      assets/bgm.mp3
  2. BIN
      assets/deerjika_relax.mp4
  3. BIN
      assets/deerjika_relax_left.png
  4. +57
    -22
      test.py

BIN
assets/bgm.mp3 View File


BIN
assets/deerjika_relax.mp4 View File


BIN
assets/deerjika_relax_left.png View File

Before After
Width: 47360  |  Height: 720  |  Size: 945 KiB

+ 57
- 22
test.py View File

@@ -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 ()

Loading…
Cancel
Save