0

そこで、HTML5 キャンバスと JavaScript を使用して簡単な物理シミュレーションを作成しています。現実的な衝突を起こそうとしていますが、衝突が発生するたびに、コードが無限ループを開始し、ページがフリーズします。

Google Chrome 24.0.1312.32 ベータ版を使用しています

javascript コンソールを見ると、「console.log("I am Colliding with something")」という行がおかしくなり、毎秒何千回も出力され、ページが完全に壊れます。

なぜそれが起こっているのかよくわかりませんし、どうしたらいいのかわかりません。ヘルプやご意見をいただければ幸いです。

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

その for ループに閉じ込められているということは、インデックス変数iがどこかで間違って設定されていることを意味します。コード全体を見ることができなければ、確かなことは言えませんが、オブジェクトを明示的にスコープしていないため (つまり)、ループfor(i=0; i<3; i++){...がオブジェクトに割り当てiられます。windowfor(var i...

たとえば、同じ変数が2番目の関数で影響を受けるため、最初の関数が3回ではなく1回だけ実行されるこのjsfiddleiを参照してください。

明らかに 1 回実行されます != 無限ループですが、collide関数が何かを実行した場合i(または、衝突が見つかった後に壊れた場合)、i呼び出されるたびに for ループの先頭で の値が 0 にリセットされます。

そうですね、もう少しコードがないと、はっきりとは言えません。しかし、この場合の私のアドバイスは次のとおりです。常にvarin for ループを使用しないと、奇妙なことが起こる可能性があります。

于 2012-12-08T20:37:49.300 に答える
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 に答える