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
相关产品推荐
相关产品推荐

