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

Python超人-宇宙模拟器

上级 fd93e09c
......@@ -17,9 +17,9 @@ from simulators.ursina.ursina_event import UrsinaEvent
def create_comet(index, gravity_only_for):
"""
随机生成石头
随机生成石头(随机位置、随机初始速度、随机大小、随机旋转)
@param index: 索引号
@param gravity_only_for: 指定一个天体,石头的引力只对该天体有效
@param gravity_only_for: 指定一个天体,石头只对该天体引力有效
@return:
"""
# 随机生成石头的位置和初始速度信息
......@@ -31,10 +31,10 @@ def create_comet(index, gravity_only_for):
# 石头随机大小
size_scale = random.randint(600, 1200)
# 随机创建石头
comet = create_rock(no=index % 8 + 1, name=f'岩石{index + 1}', mass=4.4e10,
comet = create_rock(
no=index % 8 + 1, name=f'岩石{index + 1}', mass=4.4e10,
size_scale=size_scale, color=(255, 200, 0),
init_position=pos, init_velocity=vel,
gravity_only_for=[gravity_only_for],
init_position=pos, init_velocity=vel, gravity_only_for=[gravity_only_for],
)
# 给石头一个随机旋转的方向和值
......@@ -64,6 +64,18 @@ if __name__ == '__main__':
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():
"""
当按键盘的 “O” 键重置后,恢复所有石头的状态(石头可见、引力有效),这样就可以反复观看
......@@ -76,24 +88,12 @@ if __name__ == '__main__':
def on_ready():
# 运行前触发
# 创建太阳光
# 为了较好的立体效果,可以增加太阳光线,光线指向木星(target=jupiter)
create_directional_light(position=(200, 0, -300), target=jupiter)
# 摄像机看向木星
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个函数功能才会起作用
# 按键盘的 “O” 重置键会触发 on_reset
UrsinaEvent.on_reset_subscription(on_reset)
......
......@@ -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 import Vec2, Vec4, Entity
shader = lit_with_shadows_shader
shader.default_input = {
'texture_scale': Vec2(1, 1),
'texture_offset': Vec2(0, 0),
'shadow_color': Vec4(0.1, 0.1, 0.1, .5),
}
Entity.default_shader = shader
# shader = lit_with_shadows_shader
# shader.default_input = {
# 'texture_scale': Vec2(1, 1),
# 'texture_offset': Vec2(0, 0),
# 'shadow_color': Vec4(0.1, 0.1, 0.1, .5),
# }
# Entity.default_shader = shader
if shadows:
Entity.default_shader = lit_with_shadows_shader
......@@ -185,6 +185,7 @@ def create_directional_light(position, target=None, shadows=False, light_color=N
light_color = color.white
else:
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)
if shadows:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册