Почему этот метод обнаружения столкновений не затрагивает все объекты? - PullRequest
3 голосов
/ 15 ноября 2010

В настоящее время я разрабатываю игру, в которой игрок может стрелять пулями, чтобы уничтожить астероиды.

В данный момент этот код для обнаружения столкновений поражает 1 или 2 астероида, но не все, что появляется на экране. Я думаю, что в следующем коде есть недостаток, но я не уверен, где.

public void CollisionDetection()
{
    for (int i = 0; i < ship.bullets.Count; i++)
    {
        Rectangle shipRectangle = new Rectangle((int)ship.ShipPosition.X, (int)ship.ShipPosition.Y,
        shipTexture.Width, shipTexture.Height);

        for (j = 0; j < asteroidPositions.Count; j++)
        {
            asteroidRectangle = new Rectangle((int)asteroidPositions[j].X, (int)asteroidPositions[j].Y,
            asteroidTexture.Width, asteroidTexture.Height);

            Vector2 position1 = asteroidPositions[j];
            Vector2 position2 = ship.bullets[i];

            float Cathetus1 = Math.Abs(position1.X - position2.X);
            float Cathetus2 = Math.Abs(position1.Y - position2.Y);

            Cathetus1 *= Cathetus1;
            Cathetus2 *= Cathetus2;

            distance = (float)Math.Sqrt(Cathetus1 + Cathetus2);

            if ((int)distance < asteroidTexture.Width)
            {
                score += 20;
                asteroidPositions.RemoveAt(j);
                j--;
            }
        }
        if (shipRectangle.Intersects(asteroidRectangle))
        {
            lives--;
            asteroidPositions.RemoveAt(j);
        }

        if (lives == 0)
            Exit();
    }
}

1 Ответ

1 голос
/ 15 ноября 2010

Я думаю, что вы ошиблись с кодом. Вы просто должны разделить оси X и Y во время сравнения расстояний, если расстояние Y меньше ширины и , расстояние X меньше высоты, чем при столкновении.

Я предполагаю, что позиция - середина объекта, иначе алгоритм был бы намного более сложным. Я также предполагаю, что пуля практически не имеет размера, а x.axis - это ширина, а y.axis - это высота. Не видя остальной код трудно сказать; -)

Мое предложение:

Vector2 asteroidPosition = asteroidPositions[j];
Vector2 shipPosotion = ship.bullets[i];

float distanceX = Math.Abs(asteroidPosition.X - shipPosotion.X);
float distanceY = Math.Abs(asteroidPosition.Y - shipPosotion.Y);

if ((int)distanceX < asteroidTexture.Width and (int)distanceY < asteroidTexture.Height )
{
    score += 20;
    asteroidPositions.RemoveAt(j);
    j--;
}

Этот код вообще не тестировался, я даже понятия не имею, на каком языке это на самом деле. Так что просто примите это как вдохновение. Надеюсь, это сработает.

P.S .: Если вам интересно, я мог бы выслать вам исходный код какой-нибудь игры со стрельбой по астероидам, которую я делал недавно, чтобы изучить ее ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...