Python Ursina框架2D射击游戏:射击冷却与弹药限制实现求助
Ursina 2D射击游戏:解决射击冷却与弹药限制问题
问题1:弹药限制无效的原因
你把bullets=10写在input函数内部,每次触发按键输入时,这个变量都会被重新赋值为10,所以永远不会减少到0。必须把弹药变量放在函数外部作为全局变量(新手用全局变量最直接)。另外代码里的and if bullets>0是语法错误,要去掉第二个if。
问题2:射击冷却不能用time.sleep()
Ursina的主循环是单线程的,time.sleep()会阻塞整个游戏进程,导致画面冻结。正确做法是用状态变量控制射击权限,结合Ursina自带的invoke()函数延迟恢复射击权限。
完整解决方案代码
from ursina import * app = Ursina() # 玩家实体(根据你的实际代码调整) zeri = Entity(y=0, x=-5, model='quad', texture='textures/zeri.png') # 全局状态变量 bullets = 10 # 初始弹药量 max_bullets = 10 # 最大携带弹药 can_shoot = True # 是否允许射击 reloading = False # 是否正在换弹 fire_cooldown = 0.5 # 射击冷却时间(秒) reload_time = 2 # 换弹时间(秒) def input(key): global bullets, can_shoot, reloading # 射击逻辑 if key == 'space' and can_shoot and bullets > 0 and not reloading: # 创建子弹 e = Entity(y=zeri.y, x=zeri.x+2, model='quad', collider='box', texture="textures/bum.png") e.animate_x(30, duration=2, curve=curve.linear) invoke(destroy, e, delay=2) # 消耗弹药 bullets -= 1 # 触发冷却 can_shoot = False invoke(setattr, can_shoot, 'value', True, delay=fire_cooldown) # 换弹逻辑 if key == 'r' and bullets < max_bullets and not reloading: reloading = True print("正在换弹...") # 换弹完成后重置状态 def finish_reload(): global bullets, reloading, can_shoot bullets = max_bullets reloading = False can_shoot = True print("换弹完成!") invoke(finish_reload, delay=reload_time) app.run()
代码说明
- 弹药管理:
bullets作为全局变量,每次射击后减1,不会被重置,弹药耗尽后按空格不再触发射击。 - 射击冷却:
can_shoot变量控制射击权限,射击后设为False,通过invoke()在指定冷却时间后恢复为True,不会阻塞游戏运行。 - 换弹功能:按
R键触发换弹,reloading变量防止换弹期间重复触发,换弹完成后自动重置弹药数量和射击状态。
内容的提问来源于stack exchange,提问作者Paolo Gangemi
相关产品推荐
相关产品推荐

