diff --git a/test.py b/test.py index b2bde57..29747dc 100644 --- a/test.py +++ b/test.py @@ -108,16 +108,19 @@ class Game: ゲーム・クラス Attributes: - clock (Clock): Clock オブゼクト - frame (int): フレーム・カウンタ - redrawers (list[Redrawer]): 再描画するクラスのリスト - screen (Surface): 基底スクリーン - sky (Sky): 天体情報 + clock (Clock): Clock オブゼクト + frame (int): フレーム・カウンタ + last_answered_at (datetime): 最後に回答した時刻 + now (datetime): 基準日時 + redrawers (list[Redrawer]): 再描画するクラスのリスト + screen (Surface): 基底スクリーン + sky (Sky): 天体情報 """ clock: Clock frame: int last_answered_at: datetime + now: datetime redrawers: list[Redrawer] screen: Surface sky: Sky @@ -134,6 +137,8 @@ class Game: def redraw ( self, ) -> None: + self.now = datetime.now () + 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 () @@ -339,7 +344,7 @@ class CurrentTime (GameObject): ) -> None: for i in range (4): self.game.screen.blit ( - self.font.render (str (datetime.now ()), True, (0, 0, 0)), + self.font.render (str (self.game.now), True, (0, 0, 0)), (i % 2, i // 2 * 2)) super ().redraw () @@ -384,7 +389,7 @@ class Balloon (GameObject): ) -> None: if self.frame >= self.length: self.enabled = False - self.game.last_answered_at = datetime.now () + self.game.last_answered_at = self.game.now return query = self.query if CommonModule.len_by_full (query) > 21: @@ -451,7 +456,6 @@ class KitaSun (GameObject): surface = pygame.transform.rotate (self.surface, -(90 + math.degrees (self.arg))) self.game.screen.blit (surface, surface.get_rect (center = (self.x, self.y))) super ().redraw () - self.game.sky.observer.date = datetime.now () - timedelta (hours = 9) self.sun.compute (self.game.sky.observer) self.alt = self.sun.alt self.az = self.sun.az @@ -488,11 +492,14 @@ class Jojoko (GameObject): Attributes: base (Surface): 満月ヨヨコ Surface moon (Moon): ephem の月オブゼクト - surface (Surface): 缺けたヨヨコ Surface + surface (Surface): 缺けたヨヨコ """ + alt: float + az: float base: Surface moon: Moon + surface: Surface def __init__ ( self, @@ -500,25 +507,43 @@ class Jojoko (GameObject): ): super ().__init__ (game) self.base = pygame.transform.scale (pygame.image.load ('assets/moon.png'), (200, 200)) + self.moon = Moon () + self.surface = self._get_surface () def redraw ( self, ) -> None: - ... + if self.frame % 300 == 0: + self.surface = self._get_surface () + surface = pygame.transform.rotate (self.surface, -(90 + math.degrees (self.arg))) + surface.set_colorkey ((0, 255, 0)) + self.game.screen.blit (surface, surface.get_rect (center = (self.x, self.y))) + super ().redraw () + self.moon.compute (self.game.sky.observer) + self.alt = self.moon.alt + self.az = self.moon.az + if abs (self.new_arg - self.arg) > math.radians (15): + self.arg = self.new_arg + self.x = self.new_x + self.y = self.new_y @property def phase ( self, ) -> float: dt: datetime = ephem.localtime (ephem.previous_new_moon (self.game.sky.observer.date)) - return (datetime.now () - dt).total_seconds () / 60 / 60 / 24 + return (self.game.now - dt).total_seconds () / 60 / 60 / 24 - @property - def surface ( + def _get_surface ( self, ) -> Surface: + """ + ヨヨコを月齢に応じて缺かす. + + Returns: + Surface: 缺けたヨヨコ + """ jojoko = self.base.copy () - jojoko.set_colorkey ((0, 255, 0)) for i in range (200): if 1 <= self.phase < 15: pygame.gfxdraw.bezier (jojoko, ((0, 100 + i), (100, 180 * self.phase / 7 - 80 + i), (200, 100 + i)), 3, (0, 255, 0)) @@ -530,6 +555,26 @@ class Jojoko (GameObject): jojoko.fill ((0, 255, 0)) return jojoko + @property + def new_x ( + self, + ) -> float: + return CWindow.WIDTH * (math.degrees (self.az) - 80) / 120 + + @property + def new_y ( + self, + ) -> float: + return ((CWindow.HEIGHT / 2) + - ((CWindow.HEIGHT / 2 + 100) * math.sin (self.alt) + / math.sin (math.radians (60)))) + + @property + def new_arg ( + self, + ) -> float: + return math.atan2 (self.new_y - self.y, self.new_x - self.x) + class Sky: """