85 lines
2.4 KiB
Python
85 lines
2.4 KiB
Python
import math
|
|
import sys
|
|
import pygame
|
|
|
|
|
|
class Moon:
|
|
def __init__(
|
|
self,
|
|
center: tuple[float, float] = (400, 300),
|
|
distance: float = 180.0,
|
|
speed: float = 0.02,
|
|
radius: int = 15,
|
|
color: tuple[int, int, int] = (200, 200, 200),
|
|
):
|
|
self.center = center # Drehzentrum (standardmäßig die Erde)
|
|
self.distance = distance # Bahnradius
|
|
self.angle = 0.0 # Aktueller Winkel
|
|
self.speed = speed # Winkelgeschwindigkeit
|
|
self.radius = radius # Darstellungsradius
|
|
self.color = color # Farbe (Mond: grau)
|
|
self.x = 0.0
|
|
self.y = 0.0
|
|
self.update_position()
|
|
|
|
def update_angle(self) -> None:
|
|
"""Erhöht den Drehwinkel um die eigene Geschwindigkeit."""
|
|
self.angle += self.speed
|
|
|
|
def compute_relative_position(self) -> tuple[float, float]:
|
|
"""Berechnet die relative Position zum Mittelpunkt über Polar- zu Kartesischen Koordinaten."""
|
|
dx = self.distance * math.cos(self.angle)
|
|
dy = self.distance * math.sin(self.angle)
|
|
return dx, dy
|
|
|
|
def update_position(self) -> None:
|
|
"""Setzt die absolute Position basierend auf dem Zentrum und dem relativen Offset."""
|
|
self.update_angle()
|
|
dx, dy = self.compute_relative_position()
|
|
self.x = self.center[0] + dx
|
|
self.y = self.center[1] + dy
|
|
|
|
def draw(self, screen: pygame.Surface) -> None:
|
|
"""Zeichnet das Objekt auf den Bildschirm."""
|
|
pygame.draw.circle(
|
|
screen,
|
|
self.color,
|
|
(int(self.x), int(self.y)),
|
|
self.radius,
|
|
)
|
|
|
|
|
|
def main():
|
|
pygame.init()
|
|
screen = pygame.display.set_mode((800, 600))
|
|
pygame.display.set_caption("Mond-Simulation")
|
|
clock = pygame.time.Clock()
|
|
|
|
earth_pos = (400, 300)
|
|
moon = Moon(center=earth_pos)
|
|
|
|
running = True
|
|
while running:
|
|
for event in pygame.event.get():
|
|
if event.type == pygame.QUIT:
|
|
running = False
|
|
|
|
# Aktualisierung
|
|
moon.update_position()
|
|
|
|
# Zeichnen
|
|
screen.fill((10, 10, 25)) # Weltraum-Hintergrund
|
|
# Erde zeichnen
|
|
pygame.draw.circle(screen, (30, 100, 220), earth_pos, 40)
|
|
# Mond zeichnen
|
|
moon.draw(screen)
|
|
|
|
pygame.display.flip()
|
|
clock.tick(60)
|
|
|
|
pygame.quit()
|
|
sys.exit()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main() |