Ursina引擎疾跑(Sprint)与冲刺(Dash)功能异常问题求助
Ursina 疾跑与冲刺功能修复方案
问题分析
你的代码核心问题是条件判断顺序和覆盖逻辑错误,导致速度值被后续条件强制重置,同时局部变量dash/sprint未起到实际作用:
- 冲刺触发后,若未按住
control,后续的if not held_keys['control']会立刻将速度重置回15,直接覆盖冲刺的100速度 - 地面状态判断会无条件重置速度为15,忽略疾跑或冲刺的触发状态
dash和sprint是局部变量,每次update()都会重新定义,无法在其他逻辑中复用状态
修复后的代码
def update(): # 初始化默认参数 default_speed = 15 player.speed = default_speed player.gravity = 1 # 这里可根据你的游戏需求调整默认重力值 # 优先处理冲刺:空中按住shift+w时触发 if held_keys["shift"] and held_keys["w"] and player.air_time: player.speed = 100 player.gravity = 3 # 用player实例变量标记冲刺状态,方便后续逻辑调用 player.dashing = True else: player.dashing = False # 处理疾跑:非冲刺状态、地面、按住control+w时触发,优先级低于冲刺 if not player.dashing and held_keys['control'] and held_keys['w'] and not player.air_time: player.speed = 30 player.sprinting = True else: player.sprinting = False
关键改动说明
- 调整逻辑优先级:让冲刺逻辑优先于疾跑,避免速度值被低优先级条件覆盖
- 改用实例变量:将
dashing/sprinting设为player的属性(需在player初始化时提前定义,比如player = Entity(..., dashing=False, sprinting=False)),方便其他逻辑调用状态 - 默认值前置初始化:每次update先设置默认速度和重力,再根据触发条件覆盖,确保未触发特殊动作时回到默认状态
- 增加互斥判断:疾跑仅在非冲刺、地面状态下触发,避免两种动作逻辑冲突
如果希望冲刺是按下触发一次而非持续按住,可以改用按键检测逻辑:
def update(): default_speed = 15 player.speed = default_speed player.gravity = 1 # 按下shift触发单次冲刺,避免持续按住 if input("shift") and held_keys["w"] and player.air_time and not player.dashing: player.dashing = True player.speed = 100 player.gravity = 3 # 设置冲刺持续时间,0.3秒后自动恢复默认状态 invoke(setattr, player, 'dashing', False, delay=0.3) # 疾跑逻辑保持不变 if not player.dashing and held_keys['control'] and held_keys['w'] and not player.air_time: player.speed = 30
内容的提问来源于stack exchange,提问作者EnderTV
相关产品推荐
相关产品推荐

