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

如何在Phaser JS中获取Sprite当前速度及判断玩家是否静止?

在Phaser JS中获取Sprite速度与判断静止状态

获取Sprite的当前速度

Phaser中Sprite的速度属性依赖于你使用的物理系统,以下是两种主流物理系统的实现方式:

  • Arcade Physics(最常用)
    Sprite的物理体body对象包含velocity.x和velocity.y,分别对应水平、垂直方向的速度。若需要合速度(速度的大小),可以通过两种方式计算:

    // 获取水平/垂直方向的速度分量
    const speedX = sprite.body.velocity.x;
    const speedY = sprite.body.velocity.y;
    
    // 方法1:用勾股定理计算合速度
    const totalSpeed = Math.sqrt(speedX * speedX + speedY * speedY);
    
    // 方法2:用Phaser内置工具方法简化计算
    const totalSpeed = Phaser.Math.GetMagnitude(sprite.body.velocity);
    
  • Matter Physics
    Matter物理系统中,速度同样存储在body.velocity中,可通过Matter的内置方法计算合速度:

    const speedX = sprite.body.velocity.x;
    const speedY = sprite.body.velocity.y;
    
    // Matter内置方法计算合速度
    const totalSpeed = Matter.Vector.magnitude(sprite.body.velocity);
    

判断玩家角色是否静止

除了直接检查速度,还有几种更贴合实际场景的简便方法:

  • 基于速度阈值判断
    考虑到物理引擎的浮点误差,设置极小阈值替代绝对0值判断:

    // 当速度分量的绝对值都小于0.1时,判定为静止
    const isStatic = Math.abs(sprite.body.velocity.x) < 0.1 && Math.abs(sprite.body.velocity.y) < 0.1;
    
  • 结合碰撞状态判断
    若角色因被障碍物阻挡而静止,可结合body.blocked或body.touching属性(仅适用于特定场景):

    // 示例:判断角色在地面且无移动速度时的静止状态
    const isOnGround = sprite.body.blocked.down;
    const hasNoMovement = Math.abs(sprite.body.velocity.x) < 0.1;
    const isIdle = isOnGround && hasNoMovement;
    
  • 自定义状态标记
    在输入处理逻辑中直接标记移动状态,判断更高效:

    // 输入处理环节
    let isMoving = false;
    if (cursors.left.isDown || cursors.right.isDown || cursors.up.isDown) {
      isMoving = true;
      // 执行移动逻辑
    } else {
      isMoving = false;
      // 执行停止逻辑
    }
    
    // 直接通过标记判断静止
    const isStatic = !isMoving;
    

内容的提问来源于stack exchange,提问作者AshBoomstick1

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 12:42:36