| @@ -153,6 +153,7 @@ class Game: | |||||
| bgm: Sound | bgm: Sound | ||||
| clock: Clock | clock: Clock | ||||
| fps: float | |||||
| frame: int | frame: int | ||||
| last_answered_at: datetime | last_answered_at: datetime | ||||
| now: datetime | now: datetime | ||||
| @@ -166,6 +167,7 @@ class Game: | |||||
| self.now = datetime.now () | self.now = datetime.now () | ||||
| 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.fps = FPS | |||||
| self.frame = 0 | self.frame = 0 | ||||
| self.objects = [] | self.objects = [] | ||||
| self.bgm = Sound ('assets/bgm.mp3') | self.bgm = Sound ('assets/bgm.mp3') | ||||
| @@ -182,7 +184,13 @@ class Game: | |||||
| if obj.enabled: | if obj.enabled: | ||||
| obj.redraw () | obj.redraw () | ||||
| pygame.display.update () | pygame.display.update () | ||||
| self.clock.tick (FPS) | |||||
| delta_time = self.clock.tick (FPS) / 1000 | |||||
| self.fps = 1 / delta_time | |||||
| if delta_time > 1 / FPS: | |||||
| for _ in range (int (FPS * delta_time) - 1): | |||||
| for obj in self.objects: | |||||
| if obj.enabled: | |||||
| obj.update () | |||||
| def _create_sky ( | def _create_sky ( | ||||
| self, | self, | ||||
| @@ -249,6 +257,11 @@ class GameObject: | |||||
| def redraw ( | def redraw ( | ||||
| self, | self, | ||||
| ) -> None: | |||||
| self.update () | |||||
| def update ( | |||||
| self, | |||||
| ) -> None: | ) -> None: | ||||
| self.x += self.vx | self.x += self.vx | ||||
| self.y += self.vy | self.y += self.vy | ||||
| @@ -335,6 +348,8 @@ class Deerjika (Creature): | |||||
| width (int): 幅 (px) | width (int): 幅 (px) | ||||
| """ | """ | ||||
| FPS = 30 | |||||
| height: int | height: int | ||||
| scale: float = .8 | scale: float = .8 | ||||
| surfaces: list[Surface] | surfaces: list[Surface] | ||||
| @@ -379,15 +394,21 @@ class Deerjika (Creature): | |||||
| def redraw ( | def redraw ( | ||||
| self, | self, | ||||
| ) -> None: | ) -> None: | ||||
| surface = pygame.transform.scale (self.surfaces[self.frame % len (self.surfaces)], | |||||
| surface = pygame.transform.scale (self.surfaces[self.frame * self.FPS // FPS | |||||
| % len (self.surfaces)], | |||||
| (self.width * self.scale, self.height * self.scale)) | (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 () | ||||
| def update ( | |||||
| self, | |||||
| ) -> None: | |||||
| if (not self.balloon.enabled) and self.talking: | if (not self.balloon.enabled) and self.talking: | ||||
| self.talking = False | self.talking = False | ||||
| if (self.balloon.enabled and self.balloon.frame >= FPS * 1.5 | if (self.balloon.enabled and self.balloon.frame >= FPS * 1.5 | ||||
| and not self.talking): | and not self.talking): | ||||
| self.read_out () | self.read_out () | ||||
| super ().update () | |||||
| def talk ( | def talk ( | ||||
| self, | self, | ||||
| @@ -445,7 +466,7 @@ class CurrentTime (GameObject): | |||||
| ) -> None: | ) -> None: | ||||
| for i in range (4): | for i in range (4): | ||||
| self.game.screen.blit ( | self.game.screen.blit ( | ||||
| self.font.render (str (self.game.now), True, (0, 0, 0)), | |||||
| self.font.render (f"{ self.game.now } { self.game.fps } fps", True, (0, 0, 0)), | |||||
| (i % 2, i // 2 * 2)) | (i % 2, i // 2 * 2)) | ||||
| super ().redraw () | super ().redraw () | ||||
| @@ -557,6 +578,10 @@ class KitaSun (GameObject): | |||||
| surface = pygame.transform.rotate (self.surface, -(90 + math.degrees (self.arg))) | surface = pygame.transform.rotate (self.surface, -(90 + math.degrees (self.arg))) | ||||
| 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 () | ||||
| def update ( | |||||
| self, | |||||
| ) -> None: | |||||
| self.sun.compute (self.game.sky.observer) | self.sun.compute (self.game.sky.observer) | ||||
| self.alt = self.sun.alt | self.alt = self.sun.alt | ||||
| self.az = self.sun.az | self.az = self.sun.az | ||||
| @@ -564,6 +589,7 @@ class KitaSun (GameObject): | |||||
| self.arg = self.new_arg | self.arg = self.new_arg | ||||
| self.x = self.new_x | self.x = self.new_x | ||||
| self.y = self.new_y | self.y = self.new_y | ||||
| super ().update () | |||||
| @property | @property | ||||
| def new_x ( | def new_x ( | ||||
| @@ -620,6 +646,10 @@ class Jojoko (GameObject): | |||||
| surface.set_colorkey ((0, 255, 0)) | surface.set_colorkey ((0, 255, 0)) | ||||
| 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 () | ||||
| def update ( | |||||
| self, | |||||
| ) -> None: | |||||
| self.moon.compute (self.game.sky.observer) | self.moon.compute (self.game.sky.observer) | ||||
| self.alt = self.moon.alt | self.alt = self.moon.alt | ||||
| self.az = self.moon.az | self.az = self.moon.az | ||||
| @@ -627,6 +657,7 @@ class Jojoko (GameObject): | |||||
| self.arg = self.new_arg | self.arg = self.new_arg | ||||
| self.x = self.new_x | self.x = self.new_x | ||||
| self.y = self.new_y | self.y = self.new_y | ||||
| super ().update () | |||||
| @property | @property | ||||
| def phase ( | def phase ( | ||||