You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 07:05:19