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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 18:42:16