76 lines
2.7 KiB
Python
76 lines
2.7 KiB
Python
import os
|
|
|
|
import pygame
|
|
|
|
from game.game import Game
|
|
from numeric.compute import rot_2D, matmul
|
|
|
|
|
|
class Moon(Game):
|
|
def __init__(self,
|
|
earth_position:tuple[int, int]=None,
|
|
earth_size:int=None,
|
|
moon_size:int=None,
|
|
moon_distance:int=None,
|
|
moon_speed:int=None):
|
|
super().__init__()
|
|
|
|
if earth_position is None:
|
|
self.bary_center = \
|
|
(tuple(map(int, os.getenv("BARY_CENTER", "{0},{1}".format((self.size[0] // 2), (self.size[1] // 2)).split(",")))))
|
|
else:
|
|
self.bary_center = earth_position
|
|
if earth_size is None:
|
|
self.earth_size = int(os.getenv("EARTH_SIZE", "12"))
|
|
else:
|
|
self.earth_size = earth_size
|
|
if moon_size is None:
|
|
self.moon_size = int(os.getenv("MOON_SIZE", "8"))
|
|
else:
|
|
self.moon_size = moon_size
|
|
if moon_distance is None:
|
|
self.moon_distance = int(os.getenv("MOON_DISTANCE", "200"))
|
|
else:
|
|
self.moon_distance = moon_distance
|
|
if moon_speed is None:
|
|
self.moon_speed = float(os.getenv("MOON_SPEED", "1"))
|
|
else:
|
|
self.moon_speed = moon_speed
|
|
|
|
self.angle = 0
|
|
self.moon_position = None
|
|
|
|
def update_game(self):
|
|
self.angle = pygame.time.get_ticks() / 1000
|
|
self.moon_position = self.get_orbit_position(self.moon_distance)
|
|
return True
|
|
|
|
def get_orbit_position(self,
|
|
distance:int,
|
|
bary_center:tuple[int, int]=None,
|
|
angle:float=None) \
|
|
-> tuple[int, int]:
|
|
"""
|
|
Calculates the absolute position of the satellite on the orbit.
|
|
:param distance: Relative distance from the primary body (radius).
|
|
:param bary_center: The bary center of the orbit (in this simplified simulation a point).
|
|
:param angle: Numeric value used to calculate the rotation matrix.
|
|
:return: The absolute position of the satellite.
|
|
"""
|
|
if bary_center is None:
|
|
bary_center = self.bary_center
|
|
if angle is None:
|
|
angle = self.angle
|
|
|
|
rot = rot_2D(angle * self.moon_speed)
|
|
rotated = matmul(rot, [[distance], [0]])
|
|
return (
|
|
int(bary_center[0] + rotated[0][0]),
|
|
int(bary_center[1] + rotated[1][0])
|
|
)
|
|
|
|
def draw_game(self):
|
|
self.screen.fill((30,30,30))
|
|
pygame.draw.circle(self.screen, (0,0,255), self.bary_center, self.earth_size)
|
|
pygame.draw.circle(self.screen, (255,255,255), self.moon_position, self.moon_size)
|
|
pygame.display.flip() |