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

Phaser 3 不使用物理引擎 借助tween实现点击移动游戏对象问题

实现效果对齐的tween版本代码
var player;
var activeTween = null;
const MOVE_SPEED = 200; // 和原物理引擎版本保持一致的移动速度,单位px/s

preload(){
    this.load.image("image", "assets/image.png");
}

create(){
    player = this.add.sprite(400, 350, "image");

    this.input.on('pointerup', function (pointer) {
        const targetX = pointer.x;
        const targetY = pointer.y;

        // 终止当前正在运行的移动补间,避免多个补间冲突
        if (activeTween) {
            activeTween.stop();
        }

        // 计算当前位置到目标点的距离
        const distance = Phaser.Math.Distance.Between(player.x, player.y, targetX, targetY);
        // 距离小于容错阈值时直接设置位置,和原逻辑对齐
        if (distance < 4) {
            player.setPosition(targetX, targetY);
            // 若有移动动画可打开下方注释
            // player.anims.stop();
            activeTween = null;
            return;
        }

        // 按固定速度计算补间时长,确保移动速度恒定
        const duration = (distance / MOVE_SPEED) * 1000;

        // 创建新的移动补间
        activeTween = this.tweens.add({
            targets: player,
            x: targetX,
            y: targetY,
            ease: 'Linear', // 线性缓动对应物理引擎的匀速移动效果
            duration: duration,
            onComplete: () => {
                player.setPosition(targetX, targetY);
                // 若有移动动画可打开下方注释
                // player.anims.stop();
                activeTween = null;
            }
        });
    }, this);
}

update(){
    // 无需额外处理逻辑
}
原代码的核心问题说明
  • 在update中频繁调用tween.updateTo且传入第三个参数为true,会强制重启补间,导致玩家位置不断被重置为补间初始坐标,出现瞬移效果
  • 预创建的补间设置了无效的duration: -1参数,无法匹配固定移动速度的需求
  • 使用了Power1缓动曲线,是加减速效果,和物理引擎的匀速移动手感不符
  • 没有根据移动距离动态计算补间时长,导致移动速度随距离变化,和原逻辑不一致
效果对齐说明
  • 移动速度固定为200px/s,和原物理引擎实现完全一致
  • 保留4px的距离容错阈值,避免近距离点击的抖动问题
  • 移动过程中触发新点击会立刻转向新目标点,和原物理引擎行为一致
  • 线性匀速移动无缓动,和原版本手感完全匹配

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 03:48:00