Обзор физики в играх Sonic. Части 3 и 4: прыжки и вращение

в 8:39, , рубрики: game development, Sonic the hedgehog, Алгоритмы, Программирование, старые игры, физика

Обзор физики в играх Sonic. Части 3 и 4: прыжки и вращение - 1

От переводчика: части обзора имеют небольшой размер, поэтому решил переводить сразу по две. Часть первая, часть вторая.

Часть 3: прыжки

Ускорение в воздухе

Когда Соник находится в воздухе, он может ускоряться быстрее, чем на земле. В два раза быстрее, если быть точным: 0.09375. Назовём это значение air.

В воздухе отсутствует трение (но есть сложный эффект сопротивления, который будет рассмотрен ниже), и почти всегда, когда Соник имеет в воздухе определённую горизонтальную скорость, он будет сохранять её, пока игрок не изменит её или Соник не ударится об стену.

Кроме того, для замедления также нет отличий, при нажатии кнопки «влево» из горизонтальной скорости всегда будет вычитаться air, а при нажатии кнопки «вправо» air будет к ней добавляться.

Максимальная скорость Соника в воздухе такая же, как и на земле, и равна 6.

Гравитация

Гравитация имеет значение 0.21875 (grv). Эта величина добавляется к вертикальной скорости в каждом шаге, в котором Соник не находится на земле. Она заставляет его падать вниз при соскальзывании с обрыва и не позволяет ему бесконечно двигаться вверх при прыжке.

Максимальная вертикальная скорость

Похоже, что в игре Sonic 1 вертикальная скорость Соника никак не ограничена. При падении grv продолжает прибавляться к вертикальной скорости, бесконечно увеличивая её.

В Sonic CD введено ограничение, в ней Соник не может падать быстрее, чем 16 пикселей за шаг. Это ограничение важно, для того, чтобы Соник никогда не обгонял камеру и не пролетал через землю, потому что он мог двигаться так быстро, что даже не сталкивался с ней. Думаю, это ограничение ввели из-за увеличившейся высоты уровней, например в Collision Chaos, и бесконечной вертикальной шахты в Tidal Tempest. Без этого ограничения Соник мог бы разгоняться до огромных скоростей на некоторых участках, что могло привести к нарушению игрового процесса.

{
 Y speed = Y speed + grv
 if Y speed > 16 then Y speed = 16
 }

Сопротивление воздуха

На каждом шаге, при котором Соник находится в воздухе, для горизонтальной скорости Соника применяется специальная формула, но только при наличии определённых условий. Во-первых, вертикальная скорость должна быть отрицательной. Во-вторых, вертикальная скорость должна быть больше -4 (например, -3 или -3.5 больше -4). В-третьих, абсолютное значение горизонтальной скорости должно быть больше 0.125. Если эти условия выполняются, горизонтальная скорость умножается на коэффициент 0.96875.

 {
 if Y speed < 0 and Y speed is > -4
   {
   if absolute(X speed) >= 0.125 then X speed = X speed * 0.96875
   }
 }

На самом деле, это лишь приблизительный расчёт, и вот почему: поскольку оригинальные игры используют 2 байта для хранения значения скорости Соника, где первый — это пиксели, а второй — субпиксели, скорость 6.5 пикселей за шаг будет выражаться шестнадцатеричным значением $0680. В десятичной форме это 1664. Конечно же, Соник не движется со скоростью больше тысячи пикселей за шаг! 1 пиксель = $100 (256), половина пикселя = $80 (128). Поэтому в оригинальной игре сопротивление воздуха должно рассчитываться примерно так:

 {
 if Y speed < 0 and Y speed is > -$0400
   {
   X speed = X speed - ( X speed div $0020 ) ; "div" - это целочисленное деление
   }
 }

Если бы мы выполняли эти расчёты для относительно низких значений горизонтальной скорости, которые всегда будут меньше $20 (32), на горизонтальную скорость это почти не повлияло бы. Почему? Потому что при целочисленном делении любого числа меньше 32 на 32 результатом был бы 0. Поэтому в оригинальной игре перед расчётом сопротивления воздуха не нужно проверять, больше ли горизонтальная скорость определённого значения — если горизонтальная скорость равна или меньше $001F, то в любом случае ничего не произойдёт.

Поэтому более точно эмулировать сопротивление воздуха можно следующим образом:

 {
 if Y speed < 0 and Y speed is > -4
   {
   X speed = X speed - ( ( X speed div 0.125 ) / 256 )
   }
 }

В любом случае, разница между двумя способами достаточно незначительна, просто второй технически более точен.

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

Скорость прыжка

Сейчас мы к этому уже привыкли, но в момент выхода игры Sonic the Hedgehog существовало очень много игр, в которых использовалась фиксированная высота прыжка. Не важно, как быстро игрок отпускал кнопку прыжка — персонаж всё равно поднимался вверх на одинаковое количество пикселей. Такие игры, как Mario и Sonic были одними из первых, имеющих более гибкое и отзывчивое управление, обеспечивающее улучшенные ощущения от управления персонажем, а значит и гораздо интересный и щадящий игровой процесс.

Как устроена изменяемая высота прыжка?

При нажатии кнопки «вверх», когда Соник стоит на земле, вертикальная скорость становится равной -6.5 (jmp). В игре без изменяемой высоты прыжка после этого не выполнялось бы никаких последующих вычислений, за исключением добавления гравитации, и скорость персонажа постепенно бы уменьшалась под её воздействием. В результате получился бы прыжок длительностью ровно 1 секунду на высоту 100 пикселей. Такой тип прыжка получается, если игрок нажимает кнопку прыжка и удерживает её, пока Соник не достигнет верхней точки своей траектории. Но хитрость, создающая изменяемую высоту прыжка, заключается в отпускании кнопки.

Когда игрок отпускает кнопку прыжка в воздухе после прыжка, компьютер проверяет, двигается ли Соник вверх (т.е. вертикальная скорость отрицательна). Если это так, затем он проверяет, меньше ли вертикальная скорость -4 (например, -5 меньше -4). Если это так, то вертикальной скорости присваивается значение -4. Таким образом можно в любой момент завершить прыжок, отпустив кнопку прыжка. Если игрок отпускает кнопку в следующем шаге после прыжка, Соник совершает самый короткий прыжок.

В шаге, на котором компьютер обнаруживает нажатие кнопки прыжка, Соник на самом деле не двигается вверх. Поэтому в следующем шаге он может распознать отпускание кнопки прыжка и Соник начнёт двигаться вверх со скоростью -4, не передвинувшись вверх со скоростью jmp.

Проверка на отпускание кнопки прыжка выполняется перед перемещением Соника в новое положение и прибавлением grv к вертикальной скорости.

К сожалению, компьютер проверяет нажатие кнопки прыжка до перемещения Соника. Если игрок нажимает кнопку прыжка, он выходит из оставшейся части цикла, поэтому Соник не двигается в течение шага, на котором игрок прыгает, ни в вертикальном, ни в горизонтальном положении. Это неправильно, потому что горизонтальная скорость не утеряна, и он должен продолжать движение. Этот недостаток можно устранить в новом движке.

Тейлс прыгает так же, как и Соник, а Наклз прыгает немного ниже, потому что имеет немного меньшее значение jmp, -6.

Обзор физики в играх Sonic. Части 3 и 4: прыжки и вращение - 2

Часть 4: вращение

Трение

Когда Соник начинает вращаться при нажатии Обзор физики в играх Sonic. Части 3 и 4: прыжки и вращение - 3 на крестовине, но больше не может ускоряться. Как бы игрок долго и сильно не нажимал кнопку в направлении движения, он будет вести себя, как будто игрок ничего не нажимает. Единственное, что задействуется в этом случае — это трение, здесь оно имеет значение 0.0234375 (половина от нормального), поэтому кажется, что Соник катится плавно, как колесо или мяч. В действительности Mega Drive вычисляет трение при вращении, деля пополам значение нормального трения. Если использовать Game Genie для изменения значения трения, то трение вращения всегда будет в два раза меньше.

Замедление

Однако Соник всё-таки может замедляться при вращении. При нажатии кнопки в направлении, противоположном его движению, горизонтальная скорость будет уменьшаться на 0.125. Кроме того, в отличие от поведения во время ходьбы, трение при вращении продолжает действовать, даже если игрок нажмёт кнопку в направлении движения. Поэтому в действительности при замедлении горизонтальная скорость снижается в каждом шаге на 0.125+0.0234375, или на 0.1484375.

Странно, что та же аномалия замедления, как и при беге, возникает при вращении. Если абсолютное значение горизонтальной скорости меньше 0.1484375, то это значение вычитается, вместо приравнивания горизонтальной скорости к нулю, и становится равным 0.5 в противоположном направлении. Поэтому Соник неожиданным образом может при вращении повернуться, даже если не может ускориться! Эта ошибка исправлена в Sonic 3 and Knuckles, наверно, сами программисты сочли такое поведение нежелательным.

Максимальная скорость

(Примечание: на данный момент это проверено для Sonic 1 и 2. Пока неизвестно, действительно ли это для Sonic 3K или Sonic CD.)
Несмотря на то, что Соник не может катиться быстрее сам по себе, это не означает, что какой-нибудь холм не сможет придать ему небольшой дополнительный импульс. Холмы и склоны можно использовать для вращения с очень высокой скоростью. Как и в случае с бегом, при вращении Соник имеет предел максимальной скорости, хотя он и гораздо выше, и достигает 16 пикселей за шаг. Однако в отличие от бега, Соник никаким образом не может преодолеть это ограничение скорости. Если его gsp достигает значения 16 и пытается увеличиваться дальше, оно автоматически будет установлено на 16.

Условия

В играх Sonic 1 и 2 Соник не может начать вращаться, если его абсолютная горизонтальная скорость больше 0.53125.

В Sonic 3 and Knuckles это значение увеличено до 1.03125. Это очень удобно, потому что можно удерживать кнопку «вниз» для вращения. Если бы Сонику нужно было остановиться, перед тем как он пригнётся, у игрока возникли бы сложности при быстром включении вращения.

В Sonic 3 and Knuckles Соник перестаёт вращаться, если его абсолютная горизонтальная скорость падает ниже 0.5, Возможно, этим способом хотели устранить аномалию, связанную с поворотом в другую сторону при вращении в предыдущих играх.

Прыжок во вращении

В Sonic 1, 2, 3 и Knuckles игрок не может управлять траекторией Соника в воздухе с помощью кнопок направления при прыжке во вращении. Поэтому при этом сложно начать вращение для набора скорости, а затем сделать точный прыжок. В Sonic 3 и Sonic & Knuckles игрок может вернуть управление кнопками направлений, выполнив W Kaiten Attack.

W Kaiten Attack
Он же Insta-Shield, он же W Spin Attack (W回転アタック) (в Японии), он же Twin-Spin Attack в Sonic Generations — это специальное движение, впервые использованное Соником в Sonic the Hedgehog 3. Прыжок, а затем повторное нажатие кнопки прыжка в воздухе создаёт кратковременную вспышку, увеличивающую радиус атаки Соника и делающую его временно неуязвимым. Этот приём полезен для атаки боссов, находящихся немного за пределами радиуса атаки, и покрытых шипами врагов, таких как Orbinaut. Никто из персонажей, кроме Соника, не может использовать этот приём.

Обзор физики в играх Sonic. Части 3 и 4: прыжки и вращение - 4
Orbinaut

Однако в Sonic CD игрок может управлять прыжком, сделанным во вращении, как если бы это был обычный прыжок. Думается, что это более честно по отношению к игроку.

Автор: PatientZero

Источник

Поделиться новостью

* - обязательные к заполнению поля