提交 d5751b76 编写于 作者: 三月三net's avatar 三月三net

Python超人-宇宙模拟器

上级 74359545
...@@ -9,8 +9,10 @@ ...@@ -9,8 +9,10 @@
from bodies import Sun, Asteroids, Body from bodies import Sun, Asteroids, Body
from common.consts import AU from common.consts import AU
from sim_scenes.func import create_text_panel from sim_scenes.func import create_text_panel
from simulators.ursina.entities.body_timer import TimeData
from simulators.ursina.ursina_event import UrsinaEvent from simulators.ursina.ursina_event import UrsinaEvent
from ursina import camera from ursina import camera
import datetime
class SpeedOfLightInit: class SpeedOfLightInit:
...@@ -73,9 +75,9 @@ class SpeedOfLightInit: ...@@ -73,9 +75,9 @@ class SpeedOfLightInit:
@return: @return:
""" """
self.arrived_bodies.clear() # 重置存放记录光体已到达天体列表 self.arrived_bodies.clear() # 重置存放记录光体已到达天体列表
self.arrived_info = "[00:00:00]\t从 [太阳] 出发\n\n" self.arrived_info = "距离[太阳]:${distance}\n\n"
if self.text_panel is not None: if self.text_panel is not None:
self.text_panel.text = self.arrived_info self.text_panel.text = self.arrived_info.replace("${distance}", "0 AU")
def event_subscription(self): def event_subscription(self):
""" """
...@@ -118,7 +120,7 @@ class SpeedOfLightInit: ...@@ -118,7 +120,7 @@ class SpeedOfLightInit:
@return: @return:
""" """
self.text_panel = create_text_panel() self.text_panel = create_text_panel()
self.text_panel.text = self.arrived_info self.text_panel.text = self.arrived_info.replace("${distance}", "0 AU")
if self.__camera_follow_light == "SideView": if self.__camera_follow_light == "SideView":
camera.parent = self.light_body.planet camera.parent = self.light_body.planet
...@@ -129,14 +131,12 @@ class SpeedOfLightInit: ...@@ -129,14 +131,12 @@ class SpeedOfLightInit:
self.light_body.planet.input = self.light_body_input self.light_body.planet.input = self.light_body_input
camera.rotation_y = -15 camera.rotation_y = -15
def on_timer_changed(self, time_text, time_data): def on_timer_changed(self, time_data: TimeData):
""" """
计时器触发 计时器触发
@param time_text: 计时器时间文本
@param time_data: 计时器时间数据 @param time_data: 计时器时间数据
@return: @return:
""" """
years, days, hours, minutes, seconds = time_data
for body in self.bodies: for body in self.bodies:
if body is self.light_body or isinstance(body, Sun) \ if body is self.light_body or isinstance(body, Sun) \
or body in self.arrived_bodies or isinstance(body, Asteroids): or body in self.arrived_bodies or isinstance(body, Asteroids):
...@@ -146,6 +146,16 @@ class SpeedOfLightInit: ...@@ -146,6 +146,16 @@ class SpeedOfLightInit:
if self.light_body.position[2] >= body.position[2]: if self.light_body.position[2] >= body.position[2]:
self.arrived_bodies.append(body) self.arrived_bodies.append(body)
if self.text_panel is not None: if self.text_panel is not None:
self.arrived_info += f"[{time_text}]\t到达\t[{body.name}]\n\n" self.arrived_info += f"[{time_data.time_text}]\t到达\t[{body.name}]\n\n"
self.text_panel.text = self.arrived_info distance = round(self.light_body.position[2] / AU, 2)
print(f"[{time_text}] 到达 [{body.name}]") self.text_panel.text = self.arrived_info.replace("${distance}", f"{distance} AU")
print(f"[{time_data.time_text}] 到达 [{body.name}]")
return
if not hasattr(self, "last_time"):
self.last_time = datetime.datetime.now()
else:
if datetime.datetime.now() - datetime.timedelta(milliseconds=1000) > self.last_time:
distance = round(self.light_body.position[2] / AU, 2)
self.text_panel.text = self.arrived_info.replace("${distance}", f"{distance} AU")
self.last_time = datetime.datetime.now()
...@@ -16,6 +16,32 @@ import math ...@@ -16,6 +16,32 @@ import math
from simulators.ursina.ursina_event import UrsinaEvent from simulators.ursina.ursina_event import UrsinaEvent
class TimeData:
def __init__(self, seconds):
self.total_seconds = seconds
# 获取到 seconds 后,通过下面的计算得到时分秒、年、天
hours, remainder = divmod(seconds, 3600)
minutes, seconds = divmod(remainder, 60)
days, hours = divmod(hours, 24)
years = days // 365
days = days % 365
self.years = int(years)
self.days = int(days)
self.hours = int(hours)
self.minutes = int(minutes)
self.seconds = int(seconds)
if days > 1:
s_days = str(days).rjust(3, " ")
if days >= 20 or years >= 1:
self.time_text = f'{self.years}{s_days}天'
else:
self.time_text = f'{self.days}{self.hours:02d}:{self.minutes:02d}:{self.seconds:02d}'
else:
self.time_text = f'{self.hours:02d}:{self.minutes:02d}:{self.seconds:02d}'
class BodyTimer(Singleton): class BodyTimer(Singleton):
""" """
天体计时器,原理就是: 天体计时器,原理就是:
...@@ -51,23 +77,23 @@ class BodyTimer(Singleton): ...@@ -51,23 +77,23 @@ class BodyTimer(Singleton):
# 距离(km) / 速度(km/s) = 时间(s) # 距离(km) / 速度(km/s) = 时间(s)
seconds = round(self.position_sum / self.velocity_inc) seconds = round(self.position_sum / self.velocity_inc)
# 获取到 seconds 后,通过下面的计算得到时分秒、年、天 # # 获取到 seconds 后,通过下面的计算得到时分秒、年、天
hours, remainder = divmod(seconds, 3600) # hours, remainder = divmod(seconds, 3600)
minutes, seconds = divmod(remainder, 60) # minutes, seconds = divmod(remainder, 60)
days, hours = divmod(hours, 24) # days, hours = divmod(hours, 24)
years = days // 365 # years = days // 365
days = days % 365 # days = days % 365
if days > 1: # if days > 1:
s_days = str(days).rjust(3, " ") # s_days = str(days).rjust(3, " ")
if days >= 20 or years >= 1: # if days >= 20 or years >= 1:
time_text = f'{int(years)}{s_days}天' # time_text = f'{int(years)}年{s_days}天'
else: # else:
time_text = f'{int(days)}{int(hours):02d}:{int(minutes):02d}:{int(seconds):02d}' # time_text = f'{int(days)}天 {int(hours):02d}:{int(minutes):02d}:{int(seconds):02d}'
else: # else:
time_text = f'{int(hours):02d}:{int(minutes):02d}:{int(seconds):02d}' # time_text = f'{int(hours):02d}:{int(minutes):02d}:{int(seconds):02d}'
# print(self.text) # print(self.text)
UrsinaEvent.on_timer_changed(time_text, (years, days, hours, minutes, seconds)) UrsinaEvent.on_timer_changed(TimeData(seconds))
def ignore_gravity(self, body): def ignore_gravity(self, body):
return True return True
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
from ursina import Text, Ursina, application from ursina import Text, Ursina, application
import datetime import datetime
from simulators.ursina.entities.body_timer import TimeData
from simulators.ursina.ursina_config import UrsinaConfig from simulators.ursina.ursina_config import UrsinaConfig
from simulators.ursina.ursina_event import UrsinaEvent from simulators.ursina.ursina_event import UrsinaEvent
...@@ -22,8 +23,8 @@ class Timer(Text): ...@@ -22,8 +23,8 @@ class Timer(Text):
font=UrsinaConfig.CN_FONT, background=True) font=UrsinaConfig.CN_FONT, background=True)
UrsinaEvent.on_timer_changed_subscription(self.on_timer_changed) UrsinaEvent.on_timer_changed_subscription(self.on_timer_changed)
def on_timer_changed(self, time_text, time_data): def on_timer_changed(self, time_data: TimeData):
self.text = time_text self.text = time_data.time_text
def update(self): def update(self):
self.text = "00:00:00" self.text = "00:00:00"
......
...@@ -52,9 +52,9 @@ class UrsinaEvent: ...@@ -52,9 +52,9 @@ class UrsinaEvent:
UrsinaEvent.on_timer_changed_callback.append(fun) UrsinaEvent.on_timer_changed_callback.append(fun)
@staticmethod @staticmethod
def on_timer_changed(time_text, time_data): def on_timer_changed(time_data):
for f in UrsinaEvent.on_timer_changed_callback: for f in UrsinaEvent.on_timer_changed_callback:
f(time_text, time_data) f(time_data)
@staticmethod @staticmethod
def on_evolving_subscription(fun): def on_evolving_subscription(fun):
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册