54 lines
1.6 KiB
Python
54 lines
1.6 KiB
Python
from __future__ import annotations
|
||
|
||
import pygame
|
||
|
||
from compute import rot_2D, matmul
|
||
from moon import Moon
|
||
|
||
# Apollo visual parameters
|
||
APOLLO_RADIUS = 2
|
||
APOLLO_COLOR = (255, 0, 0)
|
||
|
||
class Apollo(Moon):
|
||
|
||
def __init__(self, title: str = "Apollo", fps: int = 60, size: tuple[int, int] = (640, 400)) -> None:
|
||
super().__init__(title=title, fps=fps, size=size)
|
||
|
||
# Apollo starts on the positive x‑axis relative to the moon
|
||
self.offsetap: tuple[float, float] = (40.0, 0.0)
|
||
# Apollo moves twice as fast and opposite direction
|
||
self.delta_thetaap: float = -0.05
|
||
self.thetaap: float = 0.0
|
||
self.rot_apollo: list[list[float]] = rot_2D(self.theta)
|
||
|
||
def update_game(self) -> bool:
|
||
# Update moon first
|
||
super().update_game()
|
||
# Advance Apollo
|
||
self.thetaap += self.delta_thetaap
|
||
self.rot_apollo = rot_2D(self.thetaap)
|
||
point = [[self.offsetap[0]], [self.offsetap[1]]]
|
||
rel_pos = matmul(self.rot_apollo, point)
|
||
# Apollo's world position is moon's position plus relative vector
|
||
moon_pos = self.position_moon
|
||
self.position_apollo = (
|
||
moon_pos[0] + rel_pos[0][0],
|
||
moon_pos[1] + rel_pos[1][0],
|
||
)
|
||
return True
|
||
|
||
def draw_game(self) -> None:
|
||
# Draw base moon graphics
|
||
super().draw_game()
|
||
# Draw Apollo on the screen
|
||
pygame.draw.circle(
|
||
self.screen,
|
||
APOLLO_COLOR,
|
||
(int(self.position_apollo[0]), int(self.position_apollo[1])),
|
||
APOLLO_RADIUS,
|
||
)
|
||
|
||
if __name__ == "__main__":
|
||
apollo = Apollo()
|
||
apollo.run()
|