Скорость укупорки на 2D космическом корабле - PullRequest
1 голос
/ 26 мая 2011

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

Корабль имеет значения dx и dy (которые он переводит в звезды через мою функцию update (), поэтому они выполняют фактическое перемещение), и он применяет тягу либо по оси x, либо по оси y в зависимости от угла, на который он направлен.Я даю кораблю максимальную скорость (скажем, 5) и ускорение (0,1 за кадр).При толчке корабль ускоряется, как я и ожидаю.Двигатели всегда на 100%, без управления дросселем, так как я использую цифровое устройство ввода (клавиша со стрелкой).Я проверяю гипотенузу треугольника, созданную текущими кораблями dx и dy, чтобы определить его текущую скорость, а также отслеживаю угол его перемещения (для использования в более поздних ИИ; стрельба из оружия; и когда я нажимаю стрелку вниз,Корабль использует это значение, чтобы узнать, на какой угол он должен повернуться, чтобы столкнуться с его текущей траекторией - своего рода автопилот, помогающий правильно тормозить.

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

x_speed
y_speed
speed
move_angle // Used to track direction of motion
face_angle // Used to determine x_accel and y_accel when thrusting
x_accel
y_accel
accel = 0.1 // Used to determine x_accel and y_accel by multiplying by the dx and dy returned by getDxDy(face_angle)
max_x
max_y
max_speed = 5 // Used to determine max_x and max_y by multiplying by the dx and dy returned by getDxDy(face_angle)

Я проверяю свои dx и dy на ускорение на основе face_angle, используя эту функцию:

function getDxDy(degree)
{
var dx;
var dy;
var degree = degree;

dx = -Math.sin(degToRad(degree));
dy = Math.cos(degToRad(degree));

var dxdy = {
    dx: dx,
    dy: dy
};

return dxdy;
}

Я обновляю скорость каждый кадр ускорения следующим образом:

x_speed += x_accel
y_speed += y_accel

Я пытался ограничить скорость несколькими различными типами проверок, и я попробовал это:

if (x_speed > max_x)
{
    x_speed = max_x
}

и я попробовал это:

if (x_speed > max_x)
{
    x_speed -= x_accel
}

Первая версия ограничивает скорость по желанию, но затем я либо совершенно не могу изменить свой доступДалее, или когда я пытаюсь изменить курс, поворачиваясь в противоположном направлении и толкая, моя скорость мгновенно скачет к max_speed противоположного направления (так как max_speed постоянно рассчитывается на основе текущего face_angle корабля).Если я изменю это вычисление на move_angle, то у меня возникнут проблемы, когда корабль начинает движение, а не движется.

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

Что мне бы идеально понравилосьдолжен быть в состоянии ограничить тягу на некотором значении (например, 5) в любом направлении, и когда я меняю направление на несколько градусов, чтобы после нескольких секунд тяги корабль двигался в этом направлении, а когдаЯ бы хотел, чтобы корабль замедлился, как и следовало ожидать.

Если кто-нибудь когда-либо играл в игру Escape Velocity, это та система движения и контроля, над которой я работаю - вродемой «Золотой стандарт», если хотите.

Проверьте мой текущий несколько работающий код на http://adrian.thomas -prestemon.com / game / v3 /

с конкретным файлом .js, связанным с этим, можно ознакомиться по адресу http://adrian.thomas -prestemon.com / game / v3 / js / ship.js .Пожалуйста, извините за беспорядок закомментированный код и прочее.Я уже неделю работаю над этой конкретной проблемой в целом.

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

2D математика движения космического корабля

2d планирование траектории космического корабля с физикой

Программирование плавного изменения тяги от текущего вектора скорости к целевому вектору

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

Спасибо, что приняливремя, чтобы прочитать все это.:)

ОБНОВЛЕНИЕ:

Я сделал некоторые изменения в своем коде, и он стал работать намного лучше, чем когда-то.Это не идеально, но все, что нужно, - это еще немного экспериментов, настроек и отладки.:)

1 Ответ

0 голосов
/ 26 мая 2011

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

Инициализируйте значения dx, dy, x_speed и y_speed равными 0, и значения x_speed и y_speed определяют угол перемещения, а не разделяют move_angle.

Или, если я неправильно понял вашу настройку, просто начните с speed, установленным в 0, и выполняйте вычисления, которые не включают тригонометрию, когда значение скорости ниже определенного предела.

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

Извините, если я наполовину бессвязен, для меня наступило время спада, и я предпочел бы вздремнуть прямо сейчас, чем сидеть за столом.

...