| @@ -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']): | |||||
| if redrawer['obj'].enabled: | |||||
| redrawer['obj'].redraw () | |||||
| for obj in sorted (self.objects, key = lambda obj: obj.layer): | |||||
| if obj.enabled: | |||||
| 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, | |||||
| enabled: bool = True, | |||||
| x: float = 0, | |||||
| y: float = 0, | |||||
| layer: float | None = None, | |||||
| enabled: bool = True, | |||||
| x: 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: | |||||
| layer = max (r['layer'] for r in self.game.redrawers) + 10 | |||||
| if self.game.objects: | |||||
| 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]: | ||||