drag-and-drop - Phaser 3 拖动对象时发生碰撞

标签 drag-and-drop collision-detection drag phaser-framework

我试图在拖动对象时激活碰撞检测。我正在寻找的行为可以从另一个库的第二个示例(圆圈)中看出:

库示例 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/

相关文章:

c# - 在桌面上拖动文件时可能导致 COMExceptions 的原因是什么?

Android 拖动到屏幕布局上

c# - 将一封或多封邮件从 Outlook 拖放到 C# WPF 应用程序

java - 将(文本) View 拖放到 ListView 项目上

java - 简单的旋转矩形碰撞

algorithm - 圆形物体的碰撞

javascript - HTML5/Javascript 游戏开发 - 如果我有多个边界,则只有最新的边界有效

javascript - 使用 jQuery 嵌套拖动、滑动

java 。将图像图标从 jpanel 1 上的 JLabel 拖放到 panel 2 上的 JLabel。添加计数器功能

java - 如何从从Windows资源管理器拖到Java中的JFrame中的文件中获取文件路径