From f5929e9dc0a9bfa6e06b0c47499763345d69c1d0 Mon Sep 17 00:00:00 2001 From: march3 Date: Sat, 8 Apr 2023 12:38:54 +0800 Subject: [PATCH] =?UTF-8?q?Python=E8=B6=85=E4=BA=BA-=E5=AE=87=E5=AE=99?= =?UTF-8?q?=E6=A8=A1=E6=8B=9F=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- simulators/ursina/entities/body_timer.py | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/simulators/ursina/entities/body_timer.py b/simulators/ursina/entities/body_timer.py index 0456bbd..f6764c8 100644 --- a/simulators/ursina/entities/body_timer.py +++ b/simulators/ursina/entities/body_timer.py @@ -18,12 +18,15 @@ from simulators.ursina.ursina_event import UrsinaEvent class BodyTimer(Singleton): """ - 天体计时器 + 天体计时器,原理就是: + 以 BodyTimer 为一个天体在宇宙中运行,以速度 self.velocity_inc 递增。 + 通过公式: 速度 * 时间 = 距离,获取到累计距离, self.position_sum += self.velocity_inc * dt + 最后通过公式: 时间 = 距离 / 速度, 从而得到天体运行了多长时间 """ def __init__(self): if not hasattr(self, "inited"): - self.velocity_inc = 0.00001 + self.velocity_inc = 1e-30 # 理论上数值越小越好,可以使用 1e-300 ,但建议使用:1e-30 # 0.00001 UrsinaEvent.on_reset_subscription(self.reset) UrsinaEvent.on_pause_subscription(self.pause) UrsinaEvent.on_start_subscription(self.start) @@ -36,14 +39,19 @@ class BodyTimer(Singleton): pass def reset(self): + # 累计距离置零 self.position_sum = 0.0 def calc_time(self, dt): if not hasattr(self, "position_sum"): + # 累计距离置零 self.position_sum = 0.0 + # 通过公式: 速度 * 时间 = 距离,获取到累计距离 self.position_sum += self.velocity_inc * dt + # 距离(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) @@ -52,14 +60,14 @@ class BodyTimer(Singleton): if days > 1: s_days = str(days).rjust(3, " ") if days >= 20 or years >= 1: - self.text = f'{int(years)}年{s_days}天' + time_text = f'{int(years)}年{s_days}天' else: - self.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: - self.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) - UrsinaEvent.on_timer_changed(self.text, (years, days, hours, minutes, seconds)) + UrsinaEvent.on_timer_changed(time_text, (years, days, hours, minutes, seconds)) def ignore_gravity(self, body): return True -- GitLab