#31 layer を GameObject の 属性化

このコミットが含まれているのは:
2024-12-25 23:18:36 +09:00
コミット 93fc438d8a
+16 -27
ファイルの表示
@@ -146,7 +146,7 @@ class Game:
frame (int): フレーム・カウンタ frame (int): フレーム・カウンタ
last_answered_at (datetime): 最後に回答した時刻 last_answered_at (datetime): 最後に回答した時刻
now (datetime): 基準日時 now (datetime): 基準日時
redrawers (list[Redrawer]): 再描画するクラスのリスト objects (list[GameObject]): 再描画するクラスのリスト
screen (Surface): 基底スクリーン screen (Surface): 基底スクリーン
sky (Sky): 天体情報 sky (Sky): 天体情報
""" """
@@ -156,7 +156,7 @@ class Game:
frame: int frame: int
last_answered_at: datetime last_answered_at: datetime
now: datetime now: datetime
redrawers: list[Redrawer] objects: list[GameObject]
screen: Surface screen: Surface
sky: Sky sky: Sky
@@ -167,7 +167,7 @@ class Game:
self.screen = pygame.display.set_mode ((CWindow.WIDTH, CWindow.HEIGHT)) self.screen = pygame.display.set_mode ((CWindow.WIDTH, CWindow.HEIGHT))
self.clock = Clock () self.clock = Clock ()
self.frame = 0 self.frame = 0
self.redrawers = [] self.objects = []
self.bgm = Sound ('assets/bgm.mp3') self.bgm = Sound ('assets/bgm.mp3')
self.bgm.set_volume (.15) self.bgm.set_volume (.15)
self.bgm.play (loops = -1) self.bgm.play (loops = -1)
@@ -178,9 +178,9 @@ class Game:
) -> None: ) -> None:
self.now = datetime.now () self.now = datetime.now ()
self.sky.observer.date = self.now - timedelta (hours = 9) self.sky.observer.date = self.now - timedelta (hours = 9)
for redrawer in sorted (self.redrawers, key = lambda x: x['layer']): for obj in sorted (self.objects, key = lambda obj: obj.layer):
if redrawer['obj'].enabled: if obj.enabled:
redrawer['obj'].redraw () obj.redraw ()
pygame.display.update () pygame.display.update ()
self.clock.tick (FPS) self.clock.tick (FPS)
@@ -219,6 +219,7 @@ class GameObject:
frame: int frame: int
game: Game game: Game
height: int height: int
layer: float
vx: float = 0 vx: float = 0
vy: float = 0 vy: float = 0
width: int width: int
@@ -228,22 +229,23 @@ class GameObject:
def __init__ ( def __init__ (
self, self,
game: Game, game: Game,
layer: int | None = None, layer: float | None = None,
enabled: bool = True, 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.enabled = enabled
self.frame = 0 self.frame = 0
if layer is None: if layer is None:
if self.game.redrawers: if self.game.objects:
layer = max (r['layer'] for r in self.game.redrawers) + 10 layer = max (obj.layer for obj in self.game.objects) + 10
else: else:
layer = 0 layer = 0
self.game.redrawers.append ({ 'layer': layer, 'obj': self }) self.layer = layer
self.x = x self.x = x
self.y = y self.y = y
self.game.objects.append (self)
def redraw ( def redraw (
self, self,
@@ -346,7 +348,7 @@ class Deerjika (Creature):
game: Game, game: Game,
pattern: DeerjikaPattern = DeerjikaPattern.NORMAL, pattern: DeerjikaPattern = DeerjikaPattern.NORMAL,
direction: Direction = Direction.LEFT, direction: Direction = Direction.LEFT,
layer: int | None = None, layer: float | None = None,
x: float = 0, x: float = 0,
y: float = 0, y: float = 0,
balloon: Balloon | None = None, balloon: Balloon | None = None,
@@ -699,19 +701,6 @@ class CWindow:
HEIGHT = 768 HEIGHT = 768
class Redrawer (TypedDict):
"""
再描画処理を行ふゲーム・オブゼクトとその優先順位のペア
Attributes:
layer (int): レイア
obj (GameObject): ゲーム・オブゼクト
"""
layer: int
obj: GameObject
def get_surfaces_from_video ( def get_surfaces_from_video (
video_path: str, video_path: str,
) -> list[Surface]: ) -> list[Surface]: