そのため、JavaScriptでゲームを設計していますが、衝突検出機能に関連するものを削除する方法に問題があります。それは小惑星なので、いくつかのオブジェクトはそれに応じて名前が付けられています。
私の衝突検出機能は、プレイヤーと小惑星、または弾丸と小惑星の間に衝突があるかどうかをチェックするように設計されています。弾丸と小惑星の場合、弾丸と小惑星の両方が消えると予想されます。
ただし、衝突をチェックする方法を考えると、衝突した弾丸と小惑星の両方を削除するのは難しいようです。これが私の関連コードです:
for (var i=0;i<$_.mapObjs.length;i++) { //get one object to check
var superBox = $_.mapObjs[i].hitBox; //get it's properties
var objectName = $_.mapObjs[i].name;
var isAsteroid =(objectName.indexOf("asteroid") == -1)?false:true; //is the object an asteroid?
for (var y=0;y<$_.mapObjs.length;y++) { //get the object to check it against
if (objectName !== $_.mapObjs[y].name) { //if we are not checking the object against its self
var subName = $_.mapObjs[y].name;
var subIsAsteroid = (subName.indexOf("asteroid") == -1)?false:true; //is the second object an asteroid?
if (!(isAsteroid) || !(subIsAsteroid)) { //if we are not checking two asteroids against each other
var subBox = $_.mapObjs[y].hitBox;
var collision = rectIntersectsRect(superBox,subBox); //check for a collision using rectIntersectsRect
if (collision) { //if there is a collision
if ((objectName == "player" && subIsAsteroid) || (isAsteroid && subName == "player")) { //if either of the objects are the player, then the player dies
if (!player.invincible)
player.death();
} else if ((objectName == "blankObject" && subIsAsteroid) || (isAsteroid && subName == "blankObject")) { //if either of the objects are a bullet, then we destroy the asteroid
Console.log(i + "," + y); //this is the problem area
Console.log("getting rid of " + objects[i].name + " and " + objects[y].name);
if (subIsAsteroid) { //splice the asteroid out of the second array
objects.splice(y,1);
} else { //splice the asteroid out of the first array
objects.splice(i,1);
}
}
}
}
}
}
}
さて、小惑星と弾丸の両方が衝突したときに消える必要があるので、私は変更します
if (subIsAsteroid) {
objects.splice(y,1);
} else {
objects.splice(i,1);
}
に
objects.splice(y,1);
objects.splice(i,1);
ただし、衝突が発生するたびに、この関数は、両方の位置が弾丸と小惑星のオブジェクトを参照しているy
場合でも、配列から2つのオブジェクトをランダムに削除します。i
私は何が間違っているのですか?