所以我正在使用HTML5 canvas和javascript进行简单的物理模拟。我正在尝试进行一些真实的碰撞,但每当发生碰撞时,代码就会开始无限循环并冻结页面。
我使用的是Google Chrome 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
collide()函数是:
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;
}
}
}
}
答案 0 :(得分: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()函数中)
答案 1 :(得分:0)
好吧,被困在for循环中意味着索引变量i
在某处被错误地设置了。我无法确切地看到整个代码,但循环for(i=0; i<3; i++){...
将i
分配给window
对象,因为您没有明确确定范围(即{ {1}})。
参见例如this jsfiddle,其中第一个函数只运行一次而不是三次,因为第二个函数中的同一个变量for(var i...
会受到影响。
显然运行一次!=无限循环,但是如果i
函数对collide
执行某些操作(或者在发现碰撞后可能会中断?)那么i
的值将是每次调用时,在for循环开始时重置为0。
所以,如果没有更多的代码,我无法肯定地说;但我在这种情况下的建议是:总是在for循环中使用i
或者可能发生奇怪的事情!