0

所以我正在使用 HTML5 画布和 javascript 进行简单的物理模拟。我正在尝试进行一些真实的碰撞,但是每当发生碰撞时,代码就会开始无限循环并冻结页面。

我正在使用谷歌浏览器 24.0.1312.32 beta-m

当查看 javascript 控制台时,“console.log(“我正在与某物发生碰撞”)行变得疯狂,每秒打印数千次并完全破坏页面。

我不太确定它为什么会发生,我不知道该怎么做。任何帮助和/或输入将不胜感激。

for (i = 0; i <= 3; i++) {
    if (collide(i)) {
        console.log("I am colliding with something");
        if (typeof getCollideIndx === 'undefined') {
            console.log("collide index is not undefined");
            if (!getCollideIndx(i)) {
                console.log("Made it past null check");
                //...update object based on collision

碰撞()函数是:

function collide(b) {
for (i = 0; i <= 3; i++) {
    //Distance between each object
    var distance = (Math.sqrt(Math.pow((balls[b].x - balls[i].x), 2) + Math.pow(balls[b].y - balls[i].y, 2)));
    if (distance < 32) {
        //must be less than 2*radius -- all radii are the same

        //makes it so that it doesn't return true when checking its own index
        if (!(balls[b].mass == balls[i].mass)) {
            return true;
        } else {
            return false;
        }
    }
}

}

4

2 回答 2

0

我在你的代码中看不到无限循环,我最好的猜测是这个语句

 if (typeof getCollideIndx === 'undefined')

每次都失败,并且以下代码所在的任何函数都会被连续调用

for (i = 0; i <= 3; i++) {
    if (collide(i)) {
        console.log("I am colliding with something");
        if (typeof getCollideIndx === 'undefined') {
            console.log("collide index is not undefined");
            if (!getCollideIndx(i)) {
                console.log("Made it past null check");
                //...update object based on collision

同样在此,我没有看到 for 循环的要点,因为控件总是返回到调用函数(在 collide() 函数中)

于 2012-12-08T20:26:44.690 回答
0

好吧,被困在那个 for 循环中意味着索引变量i在某处被错误地设置。由于无法看到整个代码,我不能肯定地说,但循环for(i=0; i<3; i++){...将分配iwindow对象,因为您没有明确地确定它的范围(即for(var i...)。

例如,请参见这个 jsfiddle,其中第一个函数将只运行一次而不是三次,因为i第二个函数中会影响相同的变量。

显然运行一次!=无限循环,但是如果collide函数对(或者可能在发现碰撞后中断?)执行某些操作(或者可能在发现冲突后中断?),那么每次调用它的 for 循环开始时,它i的值将被重置为 0。i

所以是的,如果没有更多的代码,我不能肯定地说;但在这种情况下,我的建议是:始终使用varin for 循环,否则可能会发生奇怪的事情!

于 2012-12-08T20:37:49.300 回答