我试图在拖动对象时激活碰撞检测。我正在寻找的行为可以从另一个库的第二个示例(圆圈)中看出:
库示例
https://codepen.io/osublake/pen/bb6983d03e1c3582f9aac486ab9069f8
据我了解,Phaser 的碰撞引擎仅在对象位置通过其速度自动更新时才会工作。真的是这样吗?如果是这样,什么是干净的解决方案?
我现在最好的解决方案是更改 update() 方法中的速度,并使用指针移动和增量时间来计算速度。在增量不变的情况下,对象移动将与指针移动相匹配。然而,结果有点粗略,并且当鼠标停止移动(按钮仍然按下)时会出现问题。
if (obj.membre.isDragging){
let prevPos = {x: obj.membre.x, y: obj.membre.y};
let pointer = scene.input.activePointer;
let velocityX = 0;
let velocityY = 0;
if (pointer.position.x !== status.pointerX && pointer.position.y !== status.pointerY){
status.pointerX = pointer.position.x;
status.pointerY = pointer.position.y;
velocityX = (pointer.position.x-pointer.prevPosition.x)/status.deltaS;
velocityY = (pointer.position.y-pointer.prevPosition.y)/status.deltaS;
}
obj.membre.setVelocity(velocityX, velocityY);
}
最佳答案
物质引擎可以让它工作,但这是一个可以接受的街机引擎解决方案。诀窍是增加大量阻力(如摩擦力)。它在拖动回调中似乎也能正常工作。
scene.input.on('drag', function (pointer, gameObject, dragX, dragY) {
gameObject.body.setAllowGravity(false);
gameobject.setDrag(1000,1000);
//set velocity to match pointer movement - status.deltaS is frame delta in seconds
velocityX = (pointer.position.x-pointer.prevPosition.x)/status.deltaS;
velocityY = (pointer.position.y-pointer.prevPosition.y)/status.deltaS;
gameObject.setVelocity(velocityX, velocityY);
});
关于drag-and-drop - Phaser 3 拖动对象时发生碰撞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65308704/