From 3d12df6aa671bcce68caa99d9d945402d83c4185 Mon Sep 17 00:00:00 2001 From: march3 Date: Thu, 6 Apr 2023 18:00:04 +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 --- sim_scenes/solar_system/speed_of_light.py | 30 ++++++++++++++++++++--- simulators/ursina/entities/timer.py | 4 ++- simulators/ursina/ui/control_handler.py | 4 +-- simulators/ursina/ursina_event.py | 13 +++++++++- simulators/ursina_simulator.py | 2 +- simulators/views/ursina_view.py | 2 +- 6 files changed, 46 insertions(+), 9 deletions(-) diff --git a/sim_scenes/solar_system/speed_of_light.py b/sim_scenes/solar_system/speed_of_light.py index 6acb96a..0b4ea9d 100644 --- a/sim_scenes/solar_system/speed_of_light.py +++ b/sim_scenes/solar_system/speed_of_light.py @@ -9,6 +9,8 @@ from bodies import Sun, Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune, Pluto, Moon, Asteroids, Body from common.consts import SECONDS_PER_WEEK, SECONDS_PER_DAY, SECONDS_PER_YEAR, AU from sim_scenes.func import mayavi_run, ursina_run +from simulators.ursina.ursina_config import UrsinaConfig +from simulators.ursina.ursina_event import UrsinaEvent if __name__ == '__main__': # 八大行星:木星(♃)、土星(♄)、天王星(♅)、海王星(♆)、地球(⊕)、金星(♀)、火星(♂)、水星(☿) @@ -46,12 +48,34 @@ if __name__ == '__main__': init_velocity=[0, 0, 299792.458]).set_light_disable(True) # 1 光速=299792.458 千米/秒(km/秒) bodies.append(light_body) + + arrived_bodies = [] + + def on_reset(): + arrived_bodies.clear() + + def on_timer_changed(time_text, time_data): + years, days, hours, minutes, seconds = time_data + # UrsinaEvent.on_timer_changed(self.text, (years, days, hours, minutes, seconds)) + # 光到达地球8.3分钟, + # 光到达冥王星平均用时要20000秒,333.3分钟 也就是约5.56小时 + + for body in bodies: + if body is light_body or isinstance(body, Sun) \ + or body in arrived_bodies or isinstance(body, Asteroids): + continue + if light_body.position[2] >= body.position[2]: + arrived_bodies.append(body) + print(f"[{time_text}] 已经到达 [{body.name}]") + # print(light_body.planet) + + + UrsinaEvent.on_timer_changed_subscription(on_timer_changed) + UrsinaEvent.on_reset_subscription(on_reset) + # 使用 ursina 查看的运行效果 # 常用快捷键: P:运行和暂停 O:重新开始 I:显示天体轨迹 # position = 左-右+、上+下-、前+后- ursina_run(bodies, 60, position=(0, 2 * AU, -11 * AU), show_trail=True, show_timer=True, bg_music="sounds/interstellar.mp3") - - # 光到达地球8.3分钟, - # 光到达冥王星平均用时要20000秒,333.3分钟 也就是约5.56小时 diff --git a/simulators/ursina/entities/timer.py b/simulators/ursina/entities/timer.py index dd4906d..446690d 100644 --- a/simulators/ursina/entities/timer.py +++ b/simulators/ursina/entities/timer.py @@ -13,7 +13,7 @@ class Timer(Text): # 用来计时的变量 # self.start_time = time.time() self.reset() - UrsinaEvent.on_timer_changed_subscription(self.update) + UrsinaEvent.on_evolving_subscription(self.update) UrsinaEvent.on_reset_subscription(self.reset) UrsinaEvent.on_pause_subscription(self.pause) UrsinaEvent.on_start_subscription(self.start) @@ -59,6 +59,8 @@ class Timer(Text): else: self.text = f'{hours:02d}:{minutes:02d}:{seconds:02d}' + UrsinaEvent.on_timer_changed(self.text, (years, days, hours, minutes, seconds)) + if __name__ == '__main__': app = Ursina() diff --git a/simulators/ursina/ui/control_handler.py b/simulators/ursina/ui/control_handler.py index 7375838..04c9365 100644 --- a/simulators/ursina/ui/control_handler.py +++ b/simulators/ursina/ui/control_handler.py @@ -227,7 +227,7 @@ class ControlHandler(EventHandler): kv = key.split(" ") self.shift_keys[kv[0]] = False - print(self.shift_keys) + # print(self.shift_keys) return self.shift_keys['left'] or self.shift_keys['right'] def settings_handler_input(self, key): @@ -241,7 +241,7 @@ class ControlHandler(EventHandler): self.shift_key_handle(key) self.camera_update() - print(key) + # print(key) if key == "escape": if self.shift_keys['left'] or self.shift_keys['right']: sys.exit() diff --git a/simulators/ursina/ursina_event.py b/simulators/ursina/ursina_event.py index b8de4f5..198d195 100644 --- a/simulators/ursina/ursina_event.py +++ b/simulators/ursina/ursina_event.py @@ -31,6 +31,8 @@ class UrsinaEvent: UrsinaEvent.on_application_run_callback = [] # 天体大小发生变化的订阅事件 UrsinaEvent.on_body_size_changed_callback = [] + # 逐步演变触发的订阅事件 + UrsinaEvent.on_evolving_callback = [] # 计时器触发的订阅事件 UrsinaEvent.on_timer_changed_callback = [] @@ -48,8 +50,17 @@ class UrsinaEvent: UrsinaEvent.on_timer_changed_callback.append(fun) @staticmethod - def on_timer_changed(evolve_dt): + def on_timer_changed(time_text, time_data): for f in UrsinaEvent.on_timer_changed_callback: + f(time_text, time_data) + + @staticmethod + def on_evolving_subscription(fun): + UrsinaEvent.on_evolving_callback.append(fun) + + @staticmethod + def on_evolving(evolve_dt): + for f in UrsinaEvent.on_evolving_callback: f(evolve_dt) @staticmethod diff --git a/simulators/ursina_simulator.py b/simulators/ursina_simulator.py index df860d4..7f38a27 100644 --- a/simulators/ursina_simulator.py +++ b/simulators/ursina_simulator.py @@ -172,7 +172,7 @@ class UrsinaSimulator(Simulator): # 配置中,每年、月、天等等有多少秒 evolve_dt = UrsinaConfig.seconds_per * run_speed_factor - UrsinaEvent.on_timer_changed(evolve_dt) + UrsinaEvent.on_evolving(evolve_dt) # interval_fator 能让更新天体运行状态(位置、速度)更精确 evolve_dt = evolve_dt * self.interval_fator super().evolve(evolve_dt) diff --git a/simulators/views/ursina_view.py b/simulators/views/ursina_view.py index 5393c60..45b90a3 100644 --- a/simulators/views/ursina_view.py +++ b/simulators/views/ursina_view.py @@ -24,7 +24,7 @@ class UrsinaView(BodyView): self.velocity = body.velocity self.planet = Planet(self) - + body.planet = self.planet def update(self): """ -- GitLab