【发布时间】:2017-01-08 23:08:33
【问题描述】:
我的以下实现可以在jsfiddle.net上找到
我有四个 div。我的目标是让它们在页面上可拖动,但不允许它们相互重叠。每个都可以使用 mousemove 侦听器在页面上拖动。
container.addEventListener('mousemove',mouseMove);
function mouseMove(e) {
if (!mouseDown) {return;}
let coords=e.target.getBoundingClientRect();
let movX=e.movementX;
let movY=e.movementY;
if (!collision(movX,movY,e.target.classList[1],coords)){
e.target.style.left=`${coords.left+movX}px`;
e.target.style.top=`${coords.top+movY}px`;
}
}
严格来说,我的碰撞检测功能有效。我将“碰撞”事件输出到一个 div,这样当你拖动它时你可以在小提琴中看到它。但是,您仍然可以将 div 拖到另一个之上。
当您尝试将它们拉开时,它们会有点“粘”,如果您继续推动它们,它们会重叠。在这一点上,碰撞检测在真/假之间非常迅速地摇摆不定,所以我猜这里可能发生了一些奇怪的事情,但我无法弄清楚。
我认为一个问题可能是碰撞检测仅在边界相等时才输出碰撞。也就是说,一旦发生碰撞并且一个元素在另一个元素内,它就会返回 false。
但是,我看不到我的 mousemove e.movementX 和 e.movementY 事件如何通过碰撞测试并移动 div。
【问题讨论】:
-
在您的示例中,您的“项目”是方形的。会一直这样吗?
-
它们也可以是矩形的。
-
我在下面给出的答案处理矩形,只要它们的大小都相同。如果没有,你可能需要摆弄一下......
标签: javascript css collision detection