1

こんにちはstackoverflowians〜!

トレイル中に問題に遭遇したのは、孤独なプログラマーである私です。問題はこのコードにあることがわかります。

for(var a = 0; a < bullets.length; a++) {
            for(var b = 0; b < pigs.length; b++) {
                if(bullets[a].y < 300) {
                    if(bullets[a].x > pigs[b].x && bullets[a].x < pigs[b].x + pigImage.width &&
                    bullets[a].y > pigs[b].y && bullets[a].y < pigs[b].y      + pigImage.height) {
                        pigExplode(pigs[b].x);
                        bullets.pop(a);
                        pigs.pop(b);
                        player.kills++;
                    }
                }
            }
        }

問題は以下の通り。内部にオブジェクトを含む2つの配列があります。すべての弾丸オブジェクトを保持する 1 つの配列 Bullets と、すべての豚 (私のゲームで撃つターゲット) を保持する 1 つの配列 Pigs (ただし、私は決して豚を撃つことをお勧めしません)

今私がやろうとしているのは、配列内の弾丸の 1 つが配列内の豚の 1 つに当たるかどうかを確認することです。豚と弾丸を次のように配列に追加しました。

bullets.push(new Bullet());
pigs.push(new Pig());

5 匹の豚がいるとしましょう。

それは 0, 1, 2, 3, 4 です。豚 2 を撃ったら、4 は死ぬでしょう。豚1​​を撃ったら4。もし私が豚 4 を撃ったら、4 は死ぬでしょう。

したがって、誰を撃っても、最後の豚は常に削除されます。この問題で発生するエラーは次のとおりです。

Uncaught TypeError: Cannot read property 'y' of undefined 

それが示す行は次のとおりです。

if(bullets[a].y < 300) {

これは、豚に弾丸が当たっていないかどうかをチェックする二重の for ループにあります。ただし、エラーは、配列の最後ではない豚に当たったときにのみポップアップします。

私のコードで何が起こっているのか誰にも分かりませんか? 私はこれを数日間扱ってきましたが、何が間違っているのかわかりません。前もって感謝します!

4

2 に答える 2

3

コードには 2 つの問題があります。

  • pop配列からアイテムを削除するために使用しています。これにより、常に最後のアイテムが削除されます。そのため、常に最後の豚を殺しています。

  • 命中後も内部ループを継続しているため、配列にない弾丸の命中をチェックすることになります。最後の箇条書きをチェックしていた場合、変数aは配列内の最後の項目を超えてポイントしています。

splice配列内のアイテムを削除し、箇条書きを逆方向にループして、ループを台無しにすることなく削除できるようにし、ヒット後に内側のループを終了するために使用します。

for (var a = bullets.length - 1; a >= 0; a--) {
  for (var b = 0; b < pigs.length; b++) {
    if (bullets[a].y < 300) {
      if (bullets[a].x > pigs[b].x && bullets[a].x < pigs[b].x + pigImage.width &&
          bullets[a].y > pigs[b].y && bullets[a].y < pigs[b].y      + pigImage.height) {
        pigExplode(pigs[b].x);
        bullets.splice(a, 1);
        pigs.splice(b, 1);
        player.kills++;
        break; // end the inner loop
      }
    }
  }
}
于 2013-06-26T09:46:52.183 に答える
0

これにより、ヒットした場合、豚の配列から豚が削除されます

if(bullets[a].x > pigs[b].x && a bunch of other stuff) {
  pigExplode(pigs[b].x);
  bullets.splice(a,1);//remove bullit at a
  pigs.splice(b,1);//remove pig at b
  player.kills++;//smell bacon, jummy
  //always forget this both bullits and pigs are one shorter
  // if you dont decrease the counters you'll skip one pig and bullit
  a--;
  b--;
}

.pop は常に配列の最後の項目を削除します。

于 2013-06-26T09:39:27.173 に答える