diff --git a/sim_scenes/solar_system/speed_of_light_init.py b/sim_scenes/solar_system/speed_of_light_init.py index 7ef8757036ff25f603f62763d530661e3e6a2839..a1dde0ee78afe51425d33970a1d5c0183b9a8bf3 100644 --- a/sim_scenes/solar_system/speed_of_light_init.py +++ b/sim_scenes/solar_system/speed_of_light_init.py @@ -9,8 +9,10 @@ from bodies import Sun, Asteroids, Body from common.consts import AU from sim_scenes.func import create_text_panel +from simulators.ursina.entities.body_timer import TimeData from simulators.ursina.ursina_event import UrsinaEvent from ursina import camera +import datetime class SpeedOfLightInit: @@ -73,9 +75,9 @@ class SpeedOfLightInit: @return: """ 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: - self.text_panel.text = self.arrived_info + self.text_panel.text = self.arrived_info.replace("${distance}", "0 AU") def event_subscription(self): """ @@ -118,7 +120,7 @@ class SpeedOfLightInit: @return: """ 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": camera.parent = self.light_body.planet @@ -129,14 +131,12 @@ class SpeedOfLightInit: self.light_body.planet.input = self.light_body_input 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: 计时器时间数据 @return: """ - years, days, hours, minutes, seconds = time_data for body in self.bodies: if body is self.light_body or isinstance(body, Sun) \ or body in self.arrived_bodies or isinstance(body, Asteroids): @@ -146,6 +146,16 @@ class SpeedOfLightInit: if self.light_body.position[2] >= body.position[2]: self.arrived_bodies.append(body) if self.text_panel is not None: - self.arrived_info += f"[{time_text}]\t到达\t[{body.name}]\n\n" - self.text_panel.text = self.arrived_info - print(f"[{time_text}] 到达 [{body.name}]") + self.arrived_info += f"[{time_data.time_text}]\t到达\t[{body.name}]\n\n" + distance = round(self.light_body.position[2] / AU, 2) + 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() diff --git a/simulators/ursina/entities/body_timer.py b/simulators/ursina/entities/body_timer.py index f6764c8b8cb388e6996a79cc875f63b511305c8e..03a6df16604e36ddb2cdfe76b82bd47297ce6d6d 100644 --- a/simulators/ursina/entities/body_timer.py +++ b/simulators/ursina/entities/body_timer.py @@ -16,6 +16,32 @@ import math 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): """ 天体计时器,原理就是: @@ -51,23 +77,23 @@ class BodyTimer(Singleton): # 距离(km) / 速度(km/s) = 时间(s) seconds = round(self.position_sum / self.velocity_inc) - # 获取到 seconds 后,通过下面的计算得到时分秒、年、天 - hours, remainder = divmod(seconds, 3600) - minutes, seconds = divmod(remainder, 60) - days, hours = divmod(hours, 24) - years = days // 365 - days = days % 365 - if days > 1: - s_days = str(days).rjust(3, " ") - if days >= 20 or years >= 1: - time_text = f'{int(years)}年{s_days}天' - else: - time_text = f'{int(days)}天 {int(hours):02d}:{int(minutes):02d}:{int(seconds):02d}' - else: - time_text = f'{int(hours):02d}:{int(minutes):02d}:{int(seconds):02d}' + # # 获取到 seconds 后,通过下面的计算得到时分秒、年、天 + # hours, remainder = divmod(seconds, 3600) + # minutes, seconds = divmod(remainder, 60) + # days, hours = divmod(hours, 24) + # years = days // 365 + # days = days % 365 + # if days > 1: + # s_days = str(days).rjust(3, " ") + # if days >= 20 or years >= 1: + # time_text = f'{int(years)}年{s_days}天' + # else: + # time_text = f'{int(days)}天 {int(hours):02d}:{int(minutes):02d}:{int(seconds):02d}' + # else: + # time_text = f'{int(hours):02d}:{int(minutes):02d}:{int(seconds):02d}' # 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): return True diff --git a/simulators/ursina/entities/timer.py b/simulators/ursina/entities/timer.py index 65b279ed28619f0e264f3a53bd4f2ac6bfb6a0f3..739026f44a0055541c361b53802ff2e0845086d1 100644 --- a/simulators/ursina/entities/timer.py +++ b/simulators/ursina/entities/timer.py @@ -9,6 +9,7 @@ from ursina import Text, Ursina, application import datetime +from simulators.ursina.entities.body_timer import TimeData from simulators.ursina.ursina_config import UrsinaConfig from simulators.ursina.ursina_event import UrsinaEvent @@ -22,8 +23,8 @@ class Timer(Text): font=UrsinaConfig.CN_FONT, background=True) UrsinaEvent.on_timer_changed_subscription(self.on_timer_changed) - def on_timer_changed(self, time_text, time_data): - self.text = time_text + def on_timer_changed(self, time_data: TimeData): + self.text = time_data.time_text def update(self): self.text = "00:00:00" diff --git a/simulators/ursina/ursina_event.py b/simulators/ursina/ursina_event.py index 8e54d49d6400721b5b10d6343202113d391a0742..6710614f452753890cd9db015eeb7b4143cf633e 100644 --- a/simulators/ursina/ursina_event.py +++ b/simulators/ursina/ursina_event.py @@ -52,9 +52,9 @@ class UrsinaEvent: UrsinaEvent.on_timer_changed_callback.append(fun) @staticmethod - def on_timer_changed(time_text, time_data): + def on_timer_changed(time_data): for f in UrsinaEvent.on_timer_changed_callback: - f(time_text, time_data) + f(time_data) @staticmethod def on_evolving_subscription(fun):