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

Python超人-宇宙模拟器

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