From 124a3b58e1b44bbfcaa94409fc5bf1ae18f6b0dd Mon Sep 17 00:00:00 2001 From: march3 Date: Sat, 28 Oct 2023 21:45:52 +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 --- .../solar_system/halley_comet_sim_03.py | 34 +++++++++++++++++-- simulators/ursina/entities/body_trail.py | 5 ++- simulators/ursina/ursina_event.py | 17 ++++++++++ 3 files changed, 53 insertions(+), 3 deletions(-) diff --git a/sim_scenes/solar_system/halley_comet_sim_03.py b/sim_scenes/solar_system/halley_comet_sim_03.py index 240fa14..e381786 100644 --- a/sim_scenes/solar_system/halley_comet_sim_03.py +++ b/sim_scenes/solar_system/halley_comet_sim_03.py @@ -21,6 +21,7 @@ from objs import HalleComet from sim_scenes.func import create_text_panel from sim_scenes.func import ursina_run, create_sphere_sky from simulators.ursina.entities.body_timer import TimeData +from simulators.ursina.entities.entity_utils import get_value_direction_vectors from simulators.ursina.ui.control_ui import ControlUI from simulators.ursina.ursina_config import UrsinaConfig from simulators.ursina.ursina_event import UrsinaEvent @@ -192,8 +193,23 @@ class HalleyCometSim: if self.halley_comet.planet.enabled: self.halley_comet.planet.rotation_x += 0.1 self.halley_comet.planet.rotation_y += 1 - d = calculate_distance(self.halley_comet.position, self.sun.position) - self.text_panel.text = "哈雷彗星距离太阳:%.3f AU" % (d / AU) + d_sun = calculate_distance(self.halley_comet.position, self.sun.position) + d_earth = calculate_distance(self.halley_comet.position, self.earth.position) + trail_keys = self.halley_comet.planet.trails.keys() + last_trail = list(trail_keys)[-1] # self.halley_comet.planet.trails[list(trail_keys)[-1]] + if hasattr(last_trail, "entity_infos"): + # print(last_trail.entity_infos) + last_trail.entity_infos["distance_from_sun"] = d_sun + last_trail.entity_infos["distance_from_earth"] = d_earth + last_trail.entity_infos["time"] = dt.strftime("%Y-%m-%d") + # print(last_trail.entity_infos) + + panel_text = "哈雷彗星:\n距离太阳:%.3f AU" % (d_sun / AU) + panel_text += "\n距离地球:%.3f AU" % (d_earth / AU) + velocity, _ = get_value_direction_vectors(self.halley_comet.velocity) + panel_text += "\n当前速度:%.3f km/s" % velocity + + self.text_panel.text = panel_text self.set_bodies_position(time_data) @@ -202,6 +218,18 @@ class HalleyCometSim: for i, orbit_line in enumerate(self.orbit_lines): orbit_line.position = self.sun.planet.position + def on_body_trail_clicked(self, e): + if e["key"] == "right mouse up": + trail = e["sender"] + d_sun = trail.entity_infos["distance_from_sun"] + d_earth = trail.entity_infos["distance_from_earth"] + t = trail.entity_infos["time"] + # print("key:", e["key"]) + msg = "哈雷彗星:\n距离太阳:%.3f AU" % (d_sun / AU) + msg += "\n距离地球:%.3f AU" % (d_earth / AU) + msg += "\n当前日期:[%s]" % t + ControlUI.current_ui.show_message(msg, close_time=3) + if __name__ == '__main__': """ @@ -228,6 +256,8 @@ if __name__ == '__main__': UrsinaEvent.on_timer_changed_subscription(sim.on_timer_changed) # 运行前会触发 on_ready UrsinaEvent.on_ready_subscription(sim.on_ready) + # 天体拖尾点击事件 + UrsinaEvent.on_body_trail_clicked_subscription(sim.on_body_trail_clicked) # 使用 ursina 查看的运行效果 # 常用快捷键: P:运行和暂停 O:重新开始 I:显示天体轨迹 # position = 左-右+、上+下-、前+后- diff --git a/simulators/ursina/entities/body_trail.py b/simulators/ursina/entities/body_trail.py index 1f961ab..c1b36ab 100644 --- a/simulators/ursina/entities/body_trail.py +++ b/simulators/ursina/entities/body_trail.py @@ -10,6 +10,7 @@ from ursina import Entity, Mesh, Text, color, destroy, Vec3 from common.color_utils import get_inverse_color +from simulators.ursina.ursina_event import UrsinaEvent from simulators.ursina.ursina_mesh import create_label from simulators.ursina.ursina_mesh import create_arrow_line @@ -42,6 +43,8 @@ class BodyTrail(Entity): # print(key, self) self.show_infos() + UrsinaEvent.on_body_trail_clicked({"sender": self, "key": key}) + def show_infos(self): if not hasattr(self, "entity_infos"): return @@ -133,7 +136,7 @@ class BodyTrailLine(Entity): super().__init__( # model='line', - model=Mesh(vertices=((0, 0, 0), direction), mode='line', thickness=2*thickness), + model=Mesh(vertices=((0, 0, 0), direction), mode='line', thickness=2 * thickness), ignore_paused=True, **kwargs ) diff --git a/simulators/ursina/ursina_event.py b/simulators/ursina/ursina_event.py index a0bc6db..5ee0372 100644 --- a/simulators/ursina/ursina_event.py +++ b/simulators/ursina/ursina_event.py @@ -40,6 +40,23 @@ class UrsinaEvent: UrsinaEvent.on_before_evolving_callback = [] # 计时器触发的订阅事件 UrsinaEvent.on_timer_changed_callback = [] + # 点击天体拖尾触发的订阅事件 + UrsinaEvent.on_body_trail_clicked_callback = [] + + + + @staticmethod + def on_body_trail_clicked_subscription(fun): + UrsinaEvent.on_body_trail_clicked_callback.append(fun) + + @staticmethod + def on_body_trail_clicked_unsubscription(fun): + UrsinaEvent.on_body_trail_clicked_callback.remove(fun) + + @staticmethod + def on_body_trail_clicked(e): + for f in UrsinaEvent.on_body_trail_clicked_callback: + f(e) @staticmethod def on_body_size_changed_subscription(fun): -- GitLab