Так что, как и почти все остальные, изучающие некоторый язык программирования, я дал себе проект игры на космическом корабле.Пока что у меня есть звезды параллакса и все то хорошее, что я ожидаю от космического корабля.Корабль находится в центре игрового экрана, может вращаться на 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.
Спасибо, что приняливремя, чтобы прочитать все это.:)
ОБНОВЛЕНИЕ:
Я сделал некоторые изменения в своем коде, и он стал работать намного лучше, чем когда-то.Это не идеально, но все, что нужно, - это еще немного экспериментов, настроек и отладки.:)