Ursina游戏窗口震动实现咨询:内置方法无效时的替代方案
Ursina游戏震动效果实现方案
修复window.shake()无效的问题
Ursina内置的window.shake()实际是通过偏移相机模拟震动,若调用后无效果,可手动实现更可控的窗口级震动逻辑,直接操作相机位置:
from ursina import * app = Ursina() shake_duration = 1.0 shake_intensity = 0.1 shake_timer = 0 def update(): global shake_timer if shake_timer > 0: shake_timer -= time.dt # 给相机添加随机偏移模拟震动 camera.position = Vec3( random.uniform(-shake_intensity, shake_intensity), random.uniform(-shake_intensity, shake_intensity), camera.position.z ) # 震动结束后重置相机到默认位置 if shake_timer <= 0: camera.position = Vec3(0, 0, -10) # 触发震动的函数 def trigger_shake(): global shake_timer shake_timer = shake_duration # 按空格触发震动测试 InputHandler.bind('space', trigger_shake) app.run()
实现所有Entity同时震动
若需要场景内所有实体独立震动而非通过相机模拟,可遍历场景实体并实时修改其位置:
from ursina import * app = Ursina() # 创建测试实体 Cube() Sphere(position=(2, 0, 0)) Text(text='按空格触发实体震动', origin=(0, -2)) shake_duration = 1.0 shake_intensity = 0.05 shake_timer = 0 entity_initial_positions = {} def update(): global shake_timer if shake_timer > 0: shake_timer -= time.dt for entity in scene.entities: if entity == camera: continue # 首次震动时记录实体初始位置 if entity not in entity_initial_positions: entity_initial_positions[entity] = entity.position.copy() # 给实体添加随机偏移 entity.position = entity_initial_positions[entity] + Vec3( random.uniform(-shake_intensity, shake_intensity), random.uniform(-shake_intensity, shake_intensity), random.uniform(-shake_intensity, shake_intensity) ) # 震动结束后还原所有实体位置 if shake_timer <= 0: for entity, pos in entity_initial_positions.items(): entity.position = pos entity_initial_positions.clear() def trigger_entity_shake(): global shake_timer shake_timer = shake_duration InputHandler.bind('space', trigger_entity_shake) app.run()
注意事项
- 可通过调整
shake_intensity(震动幅度)和shake_duration(震动时长)参数适配需求 - 大型场景中遍历所有实体可能有性能开销,建议给需要震动的实体添加标签,仅遍历带目标标签的实体
内容的提问来源于stack exchange,提问作者Alex Krakowiak
相关产品推荐
相关产品推荐

