diff --git a/sim_scenes/wormhole_sim.py b/sim_scenes/wormhole_sim.py index 3617aa2b9a99bc80b5e2e92f5a89391e601c16b9..a25428701bdf736dff24604510f4509a226fe8a4 100644 --- a/sim_scenes/wormhole_sim.py +++ b/sim_scenes/wormhole_sim.py @@ -12,7 +12,7 @@ from bodies.universe_body import create_universe_body from common.consts import SECONDS_PER_DAY, SECONDS_PER_WEEK, SECONDS_PER_MONTH, SECONDS_PER_YEAR, AU from objs import Obj, SpaceShip, StarWarsSpeeder, ScifiGunship, SciFiBomber, CoreValagaClas from sim_scenes.func import mayavi_run, mpl_run, ursina_run, camera_look_at, two_bodies_colliding, camera_move_control, \ - get_run_speed_factor + get_run_speed_factor, create_text_panel from ursina import camera, application, lerp from bodies import Body @@ -54,6 +54,16 @@ class WormholeSim: [D, D, -D], [D, D, D], [- D, D, -D], [- D, D, D], [D, -D, -D], [D, -D, D], [- D, -D, -D], [- D, -D, D] ] + + positions = [[D, 0, -D], [D, 0, D], [- D, -D, D], [- D, 0, -D], [D, D, D], + [D, -D, D], + [- D, -D, -D], + [- D, 0, D], + [D, D, -D], + [- D, D, -D], [- D, D, D], [D, -D, -D] + + ] + for idx, pos in enumerate(positions): self.universes.append(self.create_universe(idx, pos)) @@ -71,6 +81,7 @@ class WormholeSim: for universe in self.universes: universe.planet.collider = "sphere" universe.planet.enabled = False + camera.forward_speed = 0 def universe_reset(self): self.camera_target.speed = 100 @@ -89,6 +100,7 @@ class WormholeSim: self.last_universe = self.current_universe self.current_universe = self.universes[self.current_idx] self.target_universe = self.universes[self.target_idx] + if self.last_universe is None: self.camera_target.go_target = self.target_universe self.camera_target.go_target_stage = "target_universe" @@ -96,9 +108,12 @@ class WormholeSim: else: self.camera_target.go_target = self.last_universe self.last_universe.planet.enabled = True + self.scale_down(self.last_universe, scale_size=self.SIZE_SCALE * 10) self.camera_target.go_target_stage = "last_universe" self.camera_target.go_target_hit = False - + self.scale_down(u) + self.camera_target.speed = 2000 + camera.forward_speed = -0.1 self.scale_up(self.current_universe) # self.scale_down(self.target_universe) @@ -127,8 +142,6 @@ class WormholeSim: self.body_update_reset() self.universe_reset() - - # self.target_universe.planet.rotation_y = 100 # self.current_universe.planet.rotation_y = 200 # self.current_universe.planet.rotation_x = 30 @@ -140,18 +153,37 @@ class WormholeSim: camera.current_universe = self.current_universe camera_look_at(self.camera_target, rotation_z=0) + self.text_panel = create_text_panel(font="fonts/DroidSansFallback.ttf", font_scale=1.3) + + def update_text_panel(self): + """ + 更新文字信息面板 + @param d_sun: + @return: + """ + panel_text = "虫洞穿越宇宙:\n\n当前宇宙:%s " % self.current_universe.name + panel_text += "\n\n下站宇宙:%s" % self.target_universe.name + if self.last_universe is not None: + panel_text += "\n\n上站宇宙:%s " % self.last_universe.name + + self.text_panel.text = panel_text + def scale_up(self, obj): if obj is None: return obj.planet.init_scale = self.SIZE_SCALE * 100 - def scale_down(self, obj): + def scale_down(self, obj, scale_size=None): if obj is None: return - obj.planet.init_scale = self.SIZE_SCALE + if scale_size is None: + scale_size = self.SIZE_SCALE + obj.planet.init_scale = scale_size def on_timer_changed(self, time_data): self.target_universe.planet.rotation_y -= 0.5 + if self.last_universe is not None: + self.last_universe.planet.rotation_y += 0.3 camera_look_at(self.camera_target, rotation_z=0) # camera.rotation_x -= 2 @@ -169,15 +201,22 @@ class WormholeSim: self.camera_target.speed * time.dt) if self.camera_target.go_target_stage == "last_universe": - if self.camera_target.planet.intersects(go_target).hit and not self.camera_target.go_target_hit: - self.camera_target.go_target_hit = True - self.camera_target.go_target_stage == "target_universe" - self.camera_target.go_target = self.target_universe - self.camera_target.speed = 500 - camera.speed = 1 # 在看上一个宇宙时候,停留一会 + if self.camera_target.planet.intersects(go_target).hit: + if not self.camera_target.go_target_hit: + self.camera_target.go_target_hit = True + self.camera_target.go_target_stage == "target_universe" + self.camera_target.go_target = self.target_universe + self.camera_target.speed = 100 + camera.speed = 1 # 在看上一个宇宙时候,停留一会 + # camera.forward_speed = -0.05 + if camera.forward_speed < 0: + camera.forward_speed += 0.01 + else: + camera.forward_speed = 0 elif self.camera_target.go_target_stage == "target_universe": if self.camera_target.planet.intersects(go_target).hit and not self.camera_target.go_target_hit: self.camera_target.go_target_hit = True + camera.forward_speed = 0 # camera.speed = 3000 # TODO:这个不能反复执行 # self.camera_target.planet.position += self.camera_target.planet.forward*100 @@ -189,12 +228,15 @@ class WormholeSim: dd = distance(camera.position, self.target_universe.planet.position) if camera.speed != 0: camera.position = lerp(camera.position, self.target_universe.planet.position, camera.speed * time.dt / dd) - # camera.position += camera.forward * 2 + if camera.forward_speed != 0: + camera.position += camera.forward * camera.forward_speed # if self.camera_target.planet.intersects(self.target_universe.planet).hit: if camera.intersects(self.target_universe.planet).hit: self.universe_reset() + self.update_text_panel() + def build_events(self): # 订阅事件后,上面2个函数功能才会起作用 # 运行中,每时每刻都会触发 on_timer_changed