AndEngine を使用して Android 用のゲームを開発しています。さまざまな車線で画面上を左から右に移動する車のオブジェクトの配列があります。車がカメラの幅 (画面サイズ) を超えると、その位置を 0 (画面の左側) - spriteWidth() (画面ビューポートのすぐ左側) に設定します。私の問題は、ランダムな座標が返されるため、車が互いに重なってロードし続けることです。いろいろ試しましたが、ずっと続いています。
これは、ゲームの開始時に車の座標を設定するために使用されるメソッドであり、画面から右に消えます。
public Vector2 randomRoadCoord()
{
int Y;
int X;
int arrayLength = rManager.getInstance().roadPosition.length;
int arrayFirstValue = 1;
Random xR = new Random();
int Low = (int) (5 *(0 - rManager.getInstance().car_region.getWidth()));
int High = (int) (0 - rManager.getInstance().car_region.getWidth());
X = xR.nextInt(High-Low) + Low;
Random yR = new Random();
int LowY = arrayFirstValue;
int HighY = arrayLength;
Y = yR.nextInt(HighY-LowY) + LowY;;
if (firstLoad)
{
for(int i = 0; i < rManager.getInstance().carArray.length; i++)
{
for(int j = 0; j < rManager.getInstance().carArray.length; j++)
{
while(rManager.getInstance().carArray[i].getCarSprite().collidesWith(rManager.getInstance().carArray[j].getCarSprite()))
X-= 150;
}
}
}
lastX = X;
lastY = Y;
return new Vector2(X, Y);
}
ご覧のとおり、ランダムな x 値と y 値が特定の領域間で返されます。具体的には、カメラの上部と下部 (静止カメラ、つまり基本的にはビューポート) と、画面から -50 ~ -450 の間 (そのようなもの) です。私の問題は、衝突が発生するとユーザーがゲームに負けるため、それらが互いの上に読み込まれるのを停止する必要があることです。各車のスプライトをチェックして、ロード時にすでに別の車と衝突しているかどうかを確認します (ただし、これにより確実に速度が低下します。衝突する場合は、X 座標をさらに左に移動しますが、何もしないようです.
/*if (firstLoad)
{
for(int i = 0; i < rManager.getInstance().carArray.length; i++)
{
while(rManager.getInstance().carArray[i].getCarX() + 100 > X && X > rManager.getInstance().carArray[i].getCarX() - 100)
X-= 150;
}
firstLoad = true;
} */
車が他の車のx + 150とx - 150の間にあるかどうかも確認しようとしましたが、これも何もしません。すべての車が互いに積み重なっているわけではありませんが、間違いなく 1 台以上であり、これは多すぎます。
ありがとう。ご不明な点がございましたら、お気軽にお問い合わせください。
- - - - - - - - - - - - - - - - - アップデート:
私は形成外科医のアドバイスを使用してみましたが、同じ問題が残っています. 車が別の車の上に積み込まれる可能性ははるかに低いですが、それでも非常にまれに発生します. 今回はコードをコメントしたので、理解しやすいはずです。
for (int i = 0; i < rManager.getInstance().carArray.length; i++)
{
if(rManager.getInstance().carArray[i].getCarSprite().getX() < (rManager.camera.getWidth() + rManager.getInstance().carArray[i].getCarSprite().getWidth()))
{
// moves car from left to right
rManager.getInstance().carArray[i].getCarSprite().setPosition(rManager.getInstance().carArray[i].getCarSprite().getX() + (rManager.getInstance().carArray[i].getSpeed() * 4), rManager.getInstance().carArray[i].getCarSprite().getY());
}
else //if out of the screen
{
//set the position to the left of the screen
rManager.getInstance().carArray[i].getCarSprite().setPosition(randomRoadCoord().x, rManager.getInstance().roadPosition[(int) randomRoadCoord().y].y);
//if colliding with another car
while(collidesWithExisting(rManager.getInstance().carArray[i]))
{ //set a new random pos
rManager.getInstance().carArray[i].getCarSprite().setPosition(randomRoadCoord().x, rManager.getInstance().roadPosition[(int) randomRoadCoord().y].y);
}
}
}
メソッド:
boolean collidesWithExisting(Car pCar)
{
for(int j = 0; j < rManager.getInstance().carArray.length; j++)
{
if (rManager.getInstance().carArray[j] == pCar)
return false;
if(rManager.getInstance().carArray[j].getCarSprite().collidesWith(pCar.getCarSprite()))
return true;
}
return false;
}
再度、感謝します。