Files
2026-11-12 14:26:07 +01:00

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()