Продолжение цикла статей о физике в играх про Соника.
Примечание:
Обзор затрагивает все четыре части игры на Genesis/Mega Drive и Sonic CD.
Все написанное ниже относится к ситуации, когда Соник находится на плоской сухой поверхности, не имея специальных бонусов. Кривые, физика поведения в воде, бонусы Super Sonic и Speed Shoes будут рассмотрены в отдельных статьях. Под шагами в статье понимаются программные циклы, а не шаги персонажа.
Ссылки на другие части серии:
Часть 1: твердые тайлы
Части 3 и 4: прыжки и вращение
Части 5 и 6: потеря колец и нахождение под водой
Части 7 и 8: пружины и штуковины, суперскорости
Переменные
В этой части будут часто использоваться следующие переменные и константы:
//переменные
Xsp: скорость горизонтального перемещения Соника
Ysp: скорость вертикального перемещения Соника
//константы
acc: 0.046875
dec: 0.5
frc: 0.046875 (равна acc)
top: 6
Принципы перемещения
Гифка на тему (4,7МБ)
Ускорение
При нажатии и удерживании кнопки из режима стояния скорость Xsp начинает каждый шаг увеличиваться на acc. При нажатии и удерживании кнопки из режима стояния скорость Xsp начинает каждый шаг уменьшаться на acc.
Замедление
Если Соник уже движется, а не стоит при нажатии или , компьютер проверяет, нажимается ли кнопка в направлении, в котором он уже двигается. Если это так, то к Xsp, как обычно, прибавляется acc. Если же кнопка нажимается в противоположном направлении, вместо этого прибавляется константа замедления (dec). Благодаря этому Соник может быстро поворачиваться. Если бы разница между acc и dec отсутствовала, смена скорости Соника заняла бы слишком много времени, раздражая игрока. Хороший движок не должен совершать таких детских ошибок.
Можно подумать, что при Xsp = 0.1 после нажатия вычтется dec, и значение Xsp будет равно -0.4. Странно, но в случае с играми для Mega Drive это не так. Если результат прибавления или вычитания dec приводит к изменению знака Xsp, то Xsp присваивается значение dec. Например, в приведенном выше случае Xsp станет равным -0.5. Забавным результатом этого станет такое поведение: можно нажать в одном шаге, а затем нажать (или наоборот), и начать бежать быстрее, чем если бы вы просто нажали ! Конечная скорость при этом все равно ниже, чем один пиксель на шаг, поэтому это не так заметно, но тем не менее, это правда. При создании своего движка вы можете не стараться копировать такое странное поведение.
Сила трения
Если вы не нажимаете или , в дело вступает сила трения (frc). На каждом шаге, в котором игра не получает сигналов от кнопок горизонтального перемещения контроллера, из Xsp вычитается frc, умноженная на знак Xsp, пока абсолютное значение Xsp не станет меньше frc; в этом случае Xsp просто приравнивается к нулю.
Максимальная скорость
Соник может ускоряться только до определенного предела. В какой-то момент он достигает максимальной скорости и больше не может ускоряться собственными силами. После прибавления acc к Xsp компьютер проверяет, не превышает ли Xsp значение top. Если превышает, то ему присваивается значение top.
Это означает, что если Соник каким-то образом приобрел более высокую скорость, которую он не может достичь сам (например, он достиг ее, оттолкнувшись от пружины), то при нажатии кнопки в направлении его движения компьютер прибавляет acc, замечает, что Xsp превышает top, и приравнивает Xsp к top. Таким образом, можно снизить импульс, нажав кнопку направления движения. Это недоработка! Устранить ее при разработке движка можно, проверяя, меньше ли Xsp, чем top перед прибавлением acc. Только если Xsp меньше top компьютер должен прибавлять acc и проверять, не больше ли Xsp значения top. Проблема решена.
На самом деле, в Sonic CD используется похожий фикс, потому что Соник может выполнить быстрый рывок (Super Peel Out) (который называется Dash в японской версии игры), который толкает его вперед со скоростью 12 пикселей за шаг. В обычных условиях Соник не может так ускориться, но если он достигает этой скорости с помощью рывка, то может продолжить бежать с ней пока игрок нажимает кнопку в направлении его движения. При отпускании кнопки свою работу делает сила трения. При повторном нажатии сила трения перестает действовать, а Xsp останется постоянной, но она не сможет подняться до 12 без нового рывка.
Программисты Sonic CD не стали применять этот фикс для ситуации, когда Соник находится в воздухе, поэтому если он использует рывок, а затем падает с уступа при зажатой кнопке в направлении его движения, то при отрыве от земли Xsp может снизиться до 6, вне зависимости от того, насколько высокой была в это время скорость. Это тоже большая недоработка.
Вот псевдокод, точно эмулирующий движение и силу трения:
if (игрок нажимает кнопку "Влево") {
if (xsp > 0)
{
xsp -= dec;
}
else (if xsp > -top)
{
xsp = xsp-acc;
}
} else if (игрок нажимает кнопку "Вправо") {
if (xsp < 0)
{
xsp += dec;
}
else if (xsp < top)
{
xsp = xsp+acc;
}
} else xsp = xsp-minimum(absolute(xsp), frc)*sign(xsp);
Принципы анимации
Анимация бега
Если учитывать Sonic CD, то Соник имеет три разные анимации бега. Он изображается стоящим, только если Xsp равна нулю. Если он имеет любую другую Xsp, то переходит в анимацию ходьбы, в которой смена кадров зависит от скорости перемещения по земле.
Как только Xsp становится равной (или большей) 6, он переходит в анимацию бега с «крутящимися» ногами. Когда Xsp равна или превышает 10, он переходит в анимацию рывка с движением ног в виде «восьмерки». Анимация рывка есть только Sonic CD.
Ходьба
Бег
Рывок
Анимация торможения
Соник переходит в анимацию торможения при повороте, только если абсолютное значение Xsp равно или больше 4.5. В Sonic 1 и Sonic CD он остается в режиме анимации торможения, пока Xsp не достигнет нуля или не изменит знак. В остальных трех играх Соник возвращается в режим анимации ходьбы после завершения воспроизведения всех кадров анимации торможения.
Торможение
Различия в физике разных персонажей
Все персонажи — Соник, Тейлс и Наклз (Sonic, Tails и Knuckles) — имеют одинаковые значения ускорения, замедления, максимальной скорости, бега и торможения. Они обрабатываются одинаково, за исключением их специальных движений и спрайтов (и того раздражающего факта, что Наклз прыгает ниже, чем двое других).