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

Python超人-宇宙模拟器

上级 fd93e09c
...@@ -17,9 +17,9 @@ from simulators.ursina.ursina_event import UrsinaEvent ...@@ -17,9 +17,9 @@ from simulators.ursina.ursina_event import UrsinaEvent
def create_comet(index, gravity_only_for): def create_comet(index, gravity_only_for):
""" """
随机生成石头 随机生成石头(随机位置、随机初始速度、随机大小、随机旋转)
@param index: 索引号 @param index: 索引号
@param gravity_only_for: 指定一个天体,石头的引力只对该天体有效 @param gravity_only_for: 指定一个天体,石头只对该天体引力有效
@return: @return:
""" """
# 随机生成石头的位置和初始速度信息 # 随机生成石头的位置和初始速度信息
...@@ -31,11 +31,11 @@ def create_comet(index, gravity_only_for): ...@@ -31,11 +31,11 @@ def create_comet(index, gravity_only_for):
# 石头随机大小 # 石头随机大小
size_scale = random.randint(600, 1200) size_scale = random.randint(600, 1200)
# 随机创建石头 # 随机创建石头
comet = create_rock(no=index % 8 + 1, name=f'岩石{index + 1}', mass=4.4e10, comet = create_rock(
size_scale=size_scale, color=(255, 200, 0), no=index % 8 + 1, name=f'岩石{index + 1}', mass=4.4e10,
init_position=pos, init_velocity=vel, size_scale=size_scale, color=(255, 200, 0),
gravity_only_for=[gravity_only_for], init_position=pos, init_velocity=vel, gravity_only_for=[gravity_only_for],
) )
# 给石头一个随机旋转的方向和值 # 给石头一个随机旋转的方向和值
comet.rotation = [0, 0, 0] comet.rotation = [0, 0, 0]
...@@ -64,6 +64,18 @@ if __name__ == '__main__': ...@@ -64,6 +64,18 @@ if __name__ == '__main__':
comets.append(comet) comets.append(comet)
def on_timer_changed(time_data: TimeData):
# 运行中,每时每刻都会触发
for comet in comets:
if comet.visibled:
# 如果是否可见,则旋转石头
comet.planet.rotation += comet.rotation
# 循环判断每个石头与木星是否相碰撞,如果相碰撞就爆炸
if two_bodies_colliding(comet, jupiter):
# 将石头隐藏、设置引力无效后,展示爆炸效果
comet.explode(jupiter)
def on_reset(): def on_reset():
""" """
当按键盘的 “O” 键重置后,恢复所有石头的状态(石头可见、引力有效),这样就可以反复观看 当按键盘的 “O” 键重置后,恢复所有石头的状态(石头可见、引力有效),这样就可以反复观看
...@@ -76,24 +88,12 @@ if __name__ == '__main__': ...@@ -76,24 +88,12 @@ if __name__ == '__main__':
def on_ready(): def on_ready():
# 运行前触发 # 运行前触发
# 创建太阳光 # 为了较好的立体效果,可以增加太阳光线,光线指向木星(target=jupiter)
create_directional_light(position=(200, 0, -300), target=jupiter) create_directional_light(position=(200, 0, -300), target=jupiter)
# 摄像机看向木星 # 摄像机看向木星
camera_look_at(jupiter, rotation_z=0) camera_look_at(jupiter, rotation_z=0)
def on_timer_changed(time_data: TimeData):
# 运行中,每时每刻都会触发
for comet in comets:
if comet.visibled:
# 如果是否可见,则旋转石头
comet.planet.rotation += comet.rotation
# 循环判断每个石头与木星是否相碰撞,如果相碰撞就爆炸
if two_bodies_colliding(comet, jupiter):
# 将石头隐藏、设置引力无效后,展示爆炸效果
comet.explode(jupiter)
# 订阅事件后,上面3个函数功能才会起作用 # 订阅事件后,上面3个函数功能才会起作用
# 按键盘的 “O” 重置键会触发 on_reset # 按键盘的 “O” 重置键会触发 on_reset
UrsinaEvent.on_reset_subscription(on_reset) UrsinaEvent.on_reset_subscription(on_reset)
......
...@@ -171,13 +171,13 @@ def create_directional_light(position, target=None, shadows=False, light_color=N ...@@ -171,13 +171,13 @@ def create_directional_light(position, target=None, shadows=False, light_color=N
from ursina.shaders import lit_with_shadows_shader from ursina.shaders import lit_with_shadows_shader
from ursina import Vec2, Vec4, Entity from ursina import Vec2, Vec4, Entity
shader = lit_with_shadows_shader # shader = lit_with_shadows_shader
shader.default_input = { # shader.default_input = {
'texture_scale': Vec2(1, 1), # 'texture_scale': Vec2(1, 1),
'texture_offset': Vec2(0, 0), # 'texture_offset': Vec2(0, 0),
'shadow_color': Vec4(0.1, 0.1, 0.1, .5), # 'shadow_color': Vec4(0.1, 0.1, 0.1, .5),
} # }
Entity.default_shader = shader # Entity.default_shader = shader
if shadows: if shadows:
Entity.default_shader = lit_with_shadows_shader Entity.default_shader = lit_with_shadows_shader
...@@ -185,6 +185,7 @@ def create_directional_light(position, target=None, shadows=False, light_color=N ...@@ -185,6 +185,7 @@ def create_directional_light(position, target=None, shadows=False, light_color=N
light_color = color.white light_color = color.white
else: else:
light_color = color.rgba(light_color[0] / 255, light_color[1] / 255, light_color[2] / 255, 1) light_color = color.rgba(light_color[0] / 255, light_color[1] / 255, light_color[2] / 255, 1)
light = DirectionalLight(position=position, intensity=10, range=10, color=light_color) light = DirectionalLight(position=position, intensity=10, range=10, color=light_color)
if shadows: if shadows:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册