Сложность с кодом отслеживания снаряда - PullRequest
0 голосов
/ 12 мая 2010

Я написал некоторый код для класса снарядов в моей игре, который позволяет отслеживать цели, если он может:

            if (_target != null && !_target.IsDead)
            {
                Vector2 currentDirectionVector = this.Body.LinearVelocity;
                currentDirectionVector.Normalize();
                float currentDirection = (float)Math.Atan2(currentDirectionVector.Y, currentDirectionVector.X);
                Vector2 targetDirectionVector = this._target.Position - this.Position;
                targetDirectionVector.Normalize();
                float targetDirection = (float)Math.Atan2(targetDirectionVector.Y, targetDirectionVector.X);
                float targetDirectionDelta = targetDirection - currentDirection;
                if (MathFunctions.IsInRange(targetDirectionDelta, -(Info.TrackingRate * deltaTime), Info.TrackingRate * deltaTime))
                {
                    Body.LinearVelocity = targetDirectionVector * Info.FiringVelocity;
                }
                else if (targetDirectionDelta > 0)
                {
                    float newDirection = currentDirection + Info.TrackingRate * deltaTime;
                    Body.LinearVelocity = new Vector2(
                        (float)Math.Cos(newDirection),
                        (float)Math.Sin(newDirection)) * Info.FiringVelocity;
                }
                else if (targetDirectionDelta < 0)
                {
                    float newDirection = currentDirection - Info.TrackingRate * deltaTime;
                    Body.LinearVelocity = new Vector2(
                        (float)Math.Cos(newDirection),
                        (float)Math.Sin(newDirection)) * Info.FiringVelocity;
                }
            }

Иногда это работает, но в зависимости от относительного угла к цели снаряды отворачиваются от цели. Я в тупике; кто-то может указать на недостаток в моем коде?

Обновление: размышление об этом и попытка чего-либо привели меня к выводу, что это имеет отношение к тому, когда направление (в радианах) меньше 0 и текущий угол снаряда выше 0.

1 Ответ

1 голос
/ 12 мая 2010

Переменная targetDirectionDelta не всегда является кратчайшим направлением к цели. Если абсолютное значение targetDirectionDelta больше, чем в Пи радианах, снаряд будет отклоняться от цели. Поворот в другом направлении короче и ожидаем.

Пример:

currentDirection = 2
targetDirection = -2

Снаряд может поворачивать -4 радиана (в отрицательном направлении) или 2 * (PI-2) радиана (около 2,2 радиана) (в положительном направлении).

В этом случае ваш код всегда вычисляет более длинное направление, но вы ожидаете, что снаряд развернется в более коротком направлении:

targetDirectionDelta = targetDirection - currentDirection

...