Javascript/JQuery中的多DIV冲突检测
multiple DIV collision detection in Javascript/JQuery
制作一个小的"僵尸"或"标记你是它"或"ew!你有cooties"风格的游戏,每个AI对象(基本上是一个人)随机运行。有一个初始对象是"它"或"被感染的",当它在屏幕上移动并与另一个对象接触/重叠/碰撞时,它应该将被触摸的对象更改为与触摸它的对象相同的颜色。新感染的对象可以继续感染它们随机碰撞的其他对象,直到——原则上——整个人群的颜色与第一个感染对象的颜色相同。(我会担心更高级的人工智能,感染者主动寻找附近的物体,或者健康的物体可以避开感染的物体)。
但是,在看了StackOverflow中的各种类似问题后,这些问题通常涉及2个DIV的碰撞,或者使用某种jQuery可拖动的检测技巧,我仍然有点不知所措,不知道如何在这些想法的基础上扩展一个简单的"如果我正在触摸/重叠/碰撞另一个对象,它也应该被感染",该方法可以应用于页面上的大量元素,说小于100以便不向下拖动浏览器。
我基本上可以确定物体的位置和宽度/高度,这样我就知道它们需要多少空间,但当我试图开发一种检查所有人群是否发生碰撞的功能时,大脑会"眩晕"。
让人口随机流动而没有麻烦-参见JSFiddlehttps://jsfiddle.net/digitalmouse/5tvyjhjL/1/以获取相关代码。受影响的函数应该在"animateDiv()"中,如下所示,以使stackoverflow提问编辑器对我在问题中包含一些代码感到高兴。:)
function animateDiv($target) {
var newq = makeNewPosition($target.parent());
var oldq = $target.offset();
var speed = calcSpeed([oldq.top, oldq.left], newq);
// I believe collision should be dealt with here,
// just before moving an object
$target.animate({
top: newq[0],
left: newq[1]
}, speed, function () {
animateDiv($target);
});
}
任何能将我推向正确方向的提示、技巧、改编或代码片段都将不胜感激。
一个快速、简单、肮脏的解决方案(还有更复杂的算法)将使用:
document.elementFromPoint(x, y);
它在指定的位置获取元素。完整的规格可以在这里找到。
假设你的"僵尸"是矩形的,你可以对每个角落都这样称呼,如果你被击中,那不是背景或你要检查的元素,你就发生了碰撞。。。
编辑:
另一种方法,甚至比上面的方法"更往下、更脏",但速度极快,是让两个物体的中心点进行检查,然后找到它们在X和Y上的绝对位移。如果差异小于它们宽度和高度的一半之和,那么它们是重叠的。它绝对不是像素完美的,但它应该能够非常快速地处理大量对象。
编辑2:
首先,我们需要得到每个物体的中心(以检查)
// Values for main object
// pop these in vars as we'll need them again in a sec...
hw = object.style.width >> 1; // half width of object
hh = object.style.height >> 1; // (bit shift is faster than / 2)
cx = object.style.left + hw; // centre point in x
cy = object.style.top + hh; // and in y
// repeat for secondary object
如果你不知道/存储宽度和高度,你可以使用:
object.getBoundingClientRect();
它返回一个字段为left、top、right和bottom的"rect"对象
现在我们检查接近度。。。
xDif = Math.abs(cx - cx1); // where cx1 is centre of object to check against
if(xDif > hw + hw1) return false; // there is no possibility of a collision!
// if we get here, there's a possible collision, so...
yDif = Math.abs(cy - cy1);
if(yDif > hh + hh1) return false; // no collision - bug out.
else {
// handle collision here...
}
Danny
- 使用JavaScript和HTML5画布进行冲突检测
- 检测 DIV 的高度何时变化,而无需轮询或突变观察者
- 检测第三方网站的动态DIV容器的大小
- 检测HTML5视频是否正在播放或暂停,并相应地显示或隐藏Div
- 如何在three.js中检测冲突
- JQuery版本与Div搜索效果冲突
- Javascript/JQuery中的多DIV冲突检测
- three.js服务器端冲突检测错误
- 从数组绘制级别后的冲突检测
- 检测 DIV 是否有滚动条
- 在 html canvas 元素上使用 javascript 进行冲突检测,而无需使用 jquery
- 关于不同屏幕尺寸的 Phonegap 游戏开发冲突检测
- JavaScript中一帧的冲突检测
- Javascript 2阵列冲突检测
- Javascript画布,通过数组进行冲突检测不起作用
- Javascript重新加载Div冲突
- 在可满足内容的DIV中检测多个空行
- gameQuery冲突检测
- jQuery 拖动与冲突检测
- Div命中检测