#31 ニジカ足パタ対応
このコミットが含まれているのは:
バイナリ
バイナリファイルは表示されません.
バイナリファイルは表示されません.
バイナリファイルは表示されません.
|
変更後 幅: | 高さ: | サイズ: 945 KiB |
@@ -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,
|
game: Game,
|
||||||
layer: int | None = None,
|
layer: int | None = None,
|
||||||
|
enabled: bool = True,
|
||||||
x: float = 0,
|
x: float = 0,
|
||||||
y: 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 ()
|
||||||
|
|||||||
新しい課題から参照
ユーザをブロックする