Как обвести цель на постоянном расстоянии

У меня есть корабль ИИ, который перестает приближаться, когда он попадает в дальность стрельбы, и начинает обстреливать его цель. Проблема в том, что она не очень хорошо ориентирует свою цель. Следующий код пытается сделать это и на короткое время, это убедительно, но как только вы позволяете ему работать в течение ~ 5-10 секунд, корабль ИИ выходит за пределы целевого объекта и принудительно переходит в состояние захода на посадку еще раз.

Vector2 tangent = Vector2.Normalize(new Vector2(TargetVector.Y, -TargetVector.X));
velocity += 0.8f * tangent * accelerationMagnitude * (float)gameTime.ElapsedGameTime.TotalSeconds;
velocity += 0.2f * TargetVector * accelerationMagnitude * (float)gameTime.ElapsedGameTime.TotalSeconds;

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

Vector2 tangent = new Vector2(TargetVector.Y, -TargetVector.X);
Vector2 asdf = tangent + (velocity * (float)gameTime.ElapsedGameTime.TotalSeconds);
velocity += Vector2.Normalize(asdf) * accelerationMagnitude * (float)gameTime.ElapsedGameTime.TotalSeconds;

Вот видеоролик о том, как он ведет себя с использованием второго метода, пытаясь поддерживать дистанцию ​​стрельбы 350: https: //www.youtube.com/watch?v=16Bc46ekJI0 Белая линия и номер указывают вектор и расстояние на транспортной станции и красные круги - это диапазоны оружия.

Как я могу заставить свой корабль ИИ убедительно убедить свою жертву?

5 голосов | спросил John McDonald 6 Mayam14 2014, 07:18:52

2 ответа


4

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

angle += rotationRate * (float)gameTime.ElapsedGameTime.TotalSeconds;
Vector2 desiredPos = new Vector2(radius * cos(angle), radius * sin(angle));

Затем вы можете применить какое-то поведение рулевого управления, чтобы корабль AI попытался остаться поверх desiredPos. Или просто установите положение корабля AI в desiredPos, если он достаточно близко. Вы можете рассчитать скорость и ускорение, взяв производные от desiredPos, если они вам понадобятся по другим причинам (например, показание спрайтов с ручным управлением на основе ускорения) .

Если ваш корабль слишком далеко от цели, вы можете отключить это поведение; и в фазе захода на посадку вы можете установить angle на основе угла, из которого приходит ваш корабль, поэтому desiredPos будет в нужном месте, когда включается режим кругооборота.

ответил Nathan Reed 6 Mayam14 2014, 08:37:58
1

Ответ Натана Рида, вероятно, является правильным решением для вас. Тем не менее, вы могли бы также моделировать дистанционное ограничение, которое вы налагаете на корабли, и решить, для ускорения, которое держит ваш корабль жестко привязанным к своей добыче, при этом позволяя вам применять ускорение как есть. Этот документ показывает, как это сделать на уровне ускорения; это не очень сложно.

ответил Drew Cummins 6 Maypm14 2014, 19:51:37

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132