http://jsfiddle.net/goldrunt/SeAGU/52/ 第49行在创建新对象之前检查isOnCircle函数的“false”。函数在第32行。当创建更多对象时,该函数在不应该通过时传递。
if (isOnCanvas(location) && !isOnCircle(location)) {
console.log(location, isOnCanvas(location), isOnCircle(location));
create(location);
事实上,无论传递给它的值是什么,我都无法将碰撞检测注册为真实
(Math.pow((a.x - i.x), 2) + Math.pow((a.y - i.y), 2) <= Math.pow((a.radius + i.radius), 2))
答案 0 :(得分:3)
这里我已修复并提供了更多描述性变量名称,以便您可以看到正在发生的事情。 编辑:我注意到你并不总是提供一个圆圈但有时候一个点为A,它没有.radius属性导致NaN,这也搞砸了你的比较。
function circleTest(a,b) {
var DistanceX = a.x - b.x;
var DistanceY = a.y - b.y;
var DistanceCenter = Math.sqrt(DistanceX * DistanceX + DistanceY * DistanceY);
var CollisionDistance = b.radius;
if (a.radius) CollisionDistance += a.radius
return DistanceCenter <= CollisionDistance;
}
我还注意到你的函数中出现了一个名为“isOnCircle”的问题,你使用i(一个数字)就像它是一个圆形对象一样,上面这个函数可以修复如下:
function isOnCircle(a) {
for (var i = 0; i < circles.length; i++) {
if (circleTest(a, circles[i])) return true;
}
return false;
}
答案 1 :(得分:1)
两个问题:
i
是您用于遍历circles
数组的数字索引,但您正在使用它,就好像它是一个圆形对象;您需要使用circles[i]
在每次迭代时获取圆圈。a
是一个点,没有半径(在下面的代码中我离开{{1}}只是在你传入一个圆圈而不是一个点并且{{1}用0编辑它,这样你得到一个有效的数字。)定义一些额外的变量(为了清楚起见),然后你可以用这个替换a.radius
函数:
OR