58 lines
2.0 KiB
Python
58 lines
2.0 KiB
Python
# moon.py
|
||
import math
|
||
import pygame
|
||
from compute import rotation_matrix, apply_mat_to_vec, add
|
||
from game import Game # <- euer Framework aus Semester 1
|
||
|
||
class Moon(Game):
|
||
"""
|
||
Animation: Blauer Kreis (Erde) im Ursprung, weißer Kreis (Mond) kreist darum.
|
||
Mathe (Rotation etc.) liegt komplett in compute.py.
|
||
"""
|
||
def __init__(self, width: int = 800, height: int = 600, fps: int = 60):
|
||
super().__init__(width, height, fps, title="Moon – Orbit Demo")
|
||
|
||
# „Ursprung“ = Bildschirmmitte (damit Erde bei (0,0) in unserer Welt liegt)
|
||
self.center = (width // 2, height // 2)
|
||
|
||
# Darstellung
|
||
self.earth_radius = 32
|
||
self.moon_radius = 12
|
||
self.orbit_radius = 160 # Abstand Erde–Mond in Pixeln (optisch ansprechend)
|
||
|
||
# Bewegung
|
||
self.angular_speed = 0.8 # rad/s (Geschwindigkeit der Umlaufbahn)
|
||
self.angle = 0.0 # aktueller Winkel in rad
|
||
|
||
# Farben
|
||
self.bg_color = (10, 10, 25)
|
||
self.earth_color = (60, 120, 255) # blau
|
||
self.moon_color = (245, 245, 245) # weiß
|
||
|
||
def update(self, dt: float) -> None:
|
||
"""Zeitentwicklung: Winkel erhöhen (dt in Sekunden)."""
|
||
self.angle = (self.angle + self.angular_speed * dt) % (2 * math.pi)
|
||
|
||
def draw(self, screen: pygame.Surface) -> None:
|
||
"""Szene rendern."""
|
||
screen.fill(self.bg_color)
|
||
|
||
# Erde im „Ursprung“ (hier: Bildschirmmitte)
|
||
pygame.draw.circle(screen, self.earth_color, self.center, self.earth_radius)
|
||
|
||
# Startvektor des Mondes (auf x-Achse, Länge = orbit_radius)
|
||
v0 = (float(self.orbit_radius), 0.0)
|
||
|
||
# Rotierter Vektor: v = R(angle) * v0
|
||
R = rotation_matrix(self.angle)
|
||
v_rot = apply_mat_to_vec(R, v0)
|
||
|
||
# In Bildschirmkoordinaten verschieben: (0,0) Welt -> center Screen
|
||
pos = add(self.center, v_rot)
|
||
|
||
# Mond zeichnen
|
||
pygame.draw.circle(screen, self.moon_color, (int(pos[0]), int(pos[1])), self.moon_radius)
|
||
|
||
if __name__ == "__main__":
|
||
Moon().run()
|