Заставьте персонажа убежать от выстрела - PullRequest
0 голосов
/ 25 марта 2010

Привет всем мастерам математики, у меня есть проблема для вас:

У меня есть 2D-игра (сверху вниз), и я хотел бы сделать так, чтобы персонаж убегал от выстрела, а не просто уходил от выстрела (я имею в виду, чтобы выстрел не давил) чтобы иметь хорошие навыки уклонения.

Переменные:

  • shotX - позиция x в позиции
  • shotY - позиция у выстрела
  • shotSpeedX - выстрел x скорость
  • shotSpeedY - скорость выстрела x
  • charX - позиция символа x
  • charY - позиция символа y
  • keyLeft - установите в значение true, чтобы символ нажимал левую клавишу
  • keyRight - установите значение true, чтобы символ нажимал правую клавишу
  • keyUp - установите в значение true, чтобы символ нажимал клавишу вверх
  • keyDown - установите значение true, чтобы символ нажимал клавишу "вниз"

Я понимаю следующие языки:

  • C / C ++
  • Java
  • Actionscript 2/3
  • Javascript

Я получил этот код (Actionscript 3), но иногда он не работает:

var escapeToLeft:Boolean = false;
var r:Number = Math.atan2(0 - shotSpeedY, 0 - shotSpeedX)
var angle:Number = Math.atan2(charY - (shotY + shotSpeedY), charX - (shotX + shotSpeedX));
var b:Number = diepix.fixRotation(r-angle); // This function make the number between -180 and 180
if(b<0) {
 escapeToLeft = true;
}
r += (escapeToLeft?1:0 - 1) * Math.PI / 2;
var cx:Number = Math.cos(r);
var cy:Number = Math.sin(r);
if(cx < 0.0) {
 keyLeft = true;
}else {
 keyRight = true;
}
if(cy < 0.0) {
 keyUp = true;
}else {
 keyDown = true;
}

Ответы [ 2 ]

2 голосов
/ 25 марта 2010

Некоторые наблюдения:

  • Оптимальное уклонение, вероятно, предполагает движение под углом 90 градусов от направления пуль. Таким образом, вы быстрее избавитесь от вреда.
  • Если вы делаете ошибку, вы хотите ошибиться в направлении пули, так как это экономит ваше время.
  • Вы можете рассчитать 90 градусов по направлению пули со скалярным произведением
  • найти ближайшее направление компаса к рассчитанному оптимальному углу (4 возможных ответа)
    • Вам разрешено подниматься и уходить одновременно? Теперь у вас есть 8 возможных ответов на пулю
  • бонусных очков за уклонение в оптимальном направлении согласно второму пункту

Скалярное произведение двух векторов (ax, ay) и (bx, by) равно ax * bx + ay * by. Это 0, если они ортогональны (90 градусов). Итак, с учетом маркера (ax, ay) найдите направление (bx, by) для бега со скалярным произведением 0:

ax * bx must equal ay * by, so  (bx, by) = (-ax, -ay)

Теперь, чтобы найти ближайшую точку на компасе для (bx, by), направление, в котором вы хотели бы бежать. Вероятно, вы можете выяснить методику из ответа на мой вопрос здесь на SO: Как «привязать» направленный (2D) вектор к компасу (N, NE, E, SE, S, SW, W , NW)? (заметьте, что я использовал там нестандартную систему координат ...)

Если у вас есть только 4 направления по компасу, вам будет проще всего:

 max(abs(bx), abs(by))

Большой векторный компонент покажет вам общее направление движения - для

  • положительный результат: справа
  • bx минус: слева
  • положительным: вверх (кроме случаев, когда (0, 0) вверху слева с положительным y внизу слева ...)
  • отрицательно: вниз

Полагаю, вы сможете придумать все остальное самостоятельно - в противном случае, удачи в написании собственной игры!

0 голосов
/ 25 марта 2010

Я не слежу за строкой

переменный угол: Number = Math.atan2 (charY - (shotY + shotSpeedY), charX - (shotX + shotSpeedX));

должен делать. Вектор (charY - shotY, charX - shotX) будет радиус-вектором, указывающим от местоположения выстрела до местоположения персонажа. Но что у вас есть, когда вы вычитаете вектор скорости из этого, как вы делаете в этой строке?

Мне кажется, что вам нужно сделать:

  1. Рассчитать радиус-вектор (rY, rX) где rY = shotY - charY; rX = xhotX - charX

  2. Вычислить оптимальное направление прыжка, если персонаж не ограничен точкой компаса. Начните с вектора, повернутого на 90 градусов от вектора радиуса выстрела персонажа. Скажите vJump = (rX, -rY). (Я думаю, что у Дарена немного неправильный расчет - вы перемещаете две координаты и меняете один из их знаков.) Персонаж должен либо хотеть прыгнуть в направлении vJump или в направлении -vJump. Чтобы узнать какой, возьмите скалярное произведение vJump с (shotSpeedY, shotSpeedX). Если это положительно, то персонаж прыгает в сторону пули, что вам, очевидно, не нужно, поэтому в этом случае поменяйте знак обоих компонентов vJump.

  3. Прыжок в допустимом направлении, ближайшем к vJump. В указанном вами коде вы вынуждены прыгать в одном из диагональных направлений - вы никогда не будете прыгать в одном из основных направлений. Фактически это может быть математически оптимальным решением, поскольку диагональные скачки, вероятно, длиннее кардинальных скачков в 1,414 раза.

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

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

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