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

Python超人-宇宙模拟器

上级 74359545
......@@ -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()
......@@ -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
......
......@@ -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"
......
......@@ -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):
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册