77 lines
2.3 KiB
Python
77 lines
2.3 KiB
Python
"""Der Mond kreist um die Erde."""
|
|
|
|
import pygame
|
|
|
|
from compute import matvec, rot_2D
|
|
from game import Game
|
|
|
|
EARTH_RADIUS = 30
|
|
MOON_RADIUS = 10
|
|
BLACK = (0, 0, 0)
|
|
WHITE = (255, 255, 255)
|
|
BLUE = (0, 0, 255)
|
|
|
|
MOON_DIST = 120 # Abstand Erde -> Mond
|
|
ANGLE = 0.02 # Drehwinkel pro Bild
|
|
|
|
|
|
class Moon(Game):
|
|
"""Der Mond kreist um die Erde."""
|
|
|
|
def __init__(
|
|
self,
|
|
title: str = "Moon",
|
|
fps: int = 60,
|
|
size: tuple[int, int] = (640, 400),
|
|
) -> None:
|
|
"""Legt Startposition, Drehwinkel und Rotationsmatrix fest."""
|
|
super().__init__(title, fps, size)
|
|
self.center = (size[0] / 2, size[1] / 2) # Erdposition
|
|
self.angle = self.drehwinkel() # Drehwinkel pro Bild
|
|
self.pos = self.startposition() # Vektor relativ zur Erde
|
|
|
|
def drehwinkel(self) -> float:
|
|
"""Winkel, um den pro Bild weitergedreht wird (Hook für Apollo)."""
|
|
return ANGLE
|
|
|
|
def startposition(self) -> list[float]:
|
|
"""Startposition als Vektor relativ zum Mittelpunkt."""
|
|
return [MOON_DIST, 0.0]
|
|
|
|
def update_game(self) -> bool:
|
|
"""Dreht den Mond ein Stück weiter."""
|
|
self.pos = self.drehe(self.pos)
|
|
return True
|
|
|
|
def drehe(self, vektor: list[float]) -> list[float]:
|
|
"""Dreht einen Vektor mit der Rotationsmatrix weiter."""
|
|
return matvec(rot_2D(self.angle), vektor)
|
|
|
|
def absolut(self, vektor: list[float]) -> tuple[float, float]:
|
|
"""Rechnet einen relativen Vektor in Bildschirmkoordinaten um."""
|
|
return (self.center[0] + vektor[0], self.center[1] + vektor[1])
|
|
|
|
def draw_game(self) -> None:
|
|
"""Zeichnet Erde und Mond."""
|
|
self.draw_space()
|
|
self.display()
|
|
|
|
def draw_space(self):
|
|
self.clear()
|
|
self.draw_earth()
|
|
self.draw_body(self.absolut(self.pos), MOON_RADIUS, WHITE)
|
|
|
|
def draw_earth(self) -> None:
|
|
"""Zeichnet die Erde ins Zentrum."""
|
|
pygame.draw.circle(self.screen, BLUE, self.center, EARTH_RADIUS)
|
|
|
|
def draw_body(
|
|
self, pos: tuple[float, float],
|
|
radius: int, farbe: tuple[int, int, int],
|
|
) -> None:
|
|
"""Zeichnet einen Himmelskörper an einer Position."""
|
|
pygame.draw.circle(self.screen, farbe, pos, radius)
|
|
|
|
if __name__ == "__main__":
|
|
moon = Moon()
|
|
moon.run() |