Обзор физики в играх Sonic. Части 5 и 6: потеря колец и нахождение под водой

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

Обзор физики в играх Sonic. Части 5 и 6: потеря колец и нахождение под водой - 1

Продолжение цикла статей о физике в играх про Соника. Часть первая, часть вторая, части третья и четвёртая.

Часть 5: потеря колец

Ограничения по кольцам

Когда Соник ударяется о противника или опасные препятствия, он теряет все кольца, которые собрал, но в разные стороны разлетаются 32 кольца. Так что Соник не может повторно собрать более 32 колец, даже если их у него было 100.

Разлёт колец

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

{
 let t = 0
 let angle = 101.25 ; где 0=справа, 90=сверху, 180=слева, 270=внизу
 let n = false
 let speed = 4
 
 while t < количества колец
   {
   создать объект "скачущее кольцо"
   установить вертикальную скорость кольца равной -sin(angle)*speed
   установить горизонтальную скорость кольца равной cos(angle)*speed
   if n = true
     {
     умножить горизонтальную скорость кольца на -1
     увеличить угол на 22.5
     }
   let n = not n ; if n = false, n становится true, и наоборот
   увеличить t на 1
   if t = 16
     {
     let speed = 2 ; теперь мы на втором круге, так что уменьшаем скорость
     let angle = 101.25 ; снова задаём угол
     }
   }
 }

Итак, первые 16 колец двигаются со скоростью 4 пикселя за цикл, а вторые 16 — в два раза медленнее (2 пикселя за цикл).

Гравитация для колец

Кольца не используют ту же гравитационную константу, что и Соник. Значение их силы гравитации равно 0.09375. Поэтому это значение добавляется каждый цикл к вертикальной скорости колец.

Отскакивание колец

Когда разлетающиеся кольца касаются земли, их вертикальная скорость умножается на коэффициент -0.75. Это приводит к изменению направления их вертикального движения, а также снижает скорость. Этот расчёт выполняется после добавления гравитации. Отскакивание колец не влияет на их горизонтальную скорость.

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

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

Если бы я использовал систему, мощнее чем Genesis/Mega Drive, я бы запрограммировал кольца проверять горизонтальные столкновения. При столкновении они должны умножать свою горизонтальную скорость на коэффициент -0.25. Также они должны проверять столкновения с потолками, определяя, случилось ли столкновение при движении вверх или вниз. Если они двигались вниз, они должны отскакивать, как обычно, но если они двигались вверх, они должны обнулять свою вертикальную скорость. Это было бы милосерднее к игроку, так большинство колец бы не терялось при попытке повторного сбора.

Время «жизни» колец

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

Повторный сбор колец

После удара Сонику нужно 64 циклов, прежде чем он сможет повторно собрать разлетевшиеся кольца.

Неуязвимость

После удара Соник становится на краткий промежуток времени неуязвимым. Эта неуязвимость длится, пока Соник отлетает от удара, а затем ещё 120 циклов после возобновления движения. В течение этих 120 циклов он мерцает, исчезая и появляясь через каждые 4 цикла.

Анимации колец

Висящие на месте кольца имеют 4 кадра анимации, и сменяют кадры через каждые 8 циклов. Поведение разлетающихся колец более сложно, потому что у них более высокая скорость анимации при создании, но с течением времени она снижается. В начале кадры анимации сменяются каждые 2 цикла, но в конце замедляются и меняются каждые 16 циклов или около того. Пока я не знаю точных значений. Разлетающиеся кольца создаются с одним начальным кадром анимации — кольцо видно целиком.

Глубина прорисовки колец

И разлетающиеся, и висящие кольца имеют бОльшую глубину, чем Соник, то есть прорисовываются за ним. Но они имеют меньшую глубину, то есть прорисовываются над ним, когда превращаются в искры.

Обзор физики в играх Sonic. Части 5 и 6: потеря колец и нахождение под водой - 2

Часть 6: нахождение под водой

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

Переменные

Ускорение

Ускорение имеет половинное значение от обычного: 0.0234375.

Замедление

Замедление имеет половинное значение от обычного: 0.25.

Замедление при вращении остаётся неизменным.

Сила трения

Сила трения имеет половинное значение от обычного: 0.0234375.

Сила трения при вращении имеет значение 0.01171875.

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

Максимальная скорость бега Соника равна 3, половине от обычного значения.

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

Ускорение в воздухе действует обычным способом, но имеет значение 0.046875, в два раза меньше обычного.

Гравитация

Гравитация равна 0.0625. Благодаря этому Соник падает гораздо более медленно.

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

Начальная скорость прыжка равна -3.5 (-3 для Наклза), скорость в момент отделения от земли равна -2.

Пузыри

Когда Соник сталкивается под водой с пузырём, его скорости по X и Y обе становятся равны 0.

Вход и выход

Когда Соник падает в воду, его горизонтальная скорость умножается на 0.5, а вертикальная скорость умножается на 0.25 (это происходит после добавления гравитации). И наоборот, когда Соник выпрыгивает из воды, его вертикальная скорость удваивается (после добавления значения «водной» гравитации) и он начинает двигаться быстрее, потому что вода больше не влияет на его движение (однако выход из воды не влияет на горизонтальную скорость).

Утопание

Когда Соник тонет, его скорости по X и Y обе становятся равными 0, а «водная» гравитация остаётся обычной.

Speed Shoes

Если на Сонике надеты Speed Shoes и он попадает под воду, водные переменные имеют большее влияние, таким образом обнуляя все эффекты Speed Shoes. Никакие расчёты, например умножение на 0.5, не выполняются.

Скорости анимаций

Погружение под воду никак не влияет на скорость анимации Соника. Анимации, чьи скорости пропорциональны переменным, которые меняются, таким как скорость Соника, изменяются автоматически в той же пропорции.

P.S. для внимательных и любопытных читателей. В этой серии постов есть небольшая пасхалка, а именно — два зашифрованных английских слова. Каждая часть содержит ровно одну букву (то есть сейчас можно расшифровать уже 6 букв), всего их, как и частей, будет 14. В следующих постах я буду выкладывать подсказки, а пока первая: код содержится не в HTML, никакой стеганографии и таинственных сторонних сайтов. Ваши догадки можете присылать в личку, для рид-онли и просто читателей в профиле есть моя почта. Первому отгадавшему будет какой-нибудь приятный бонус (например, перевод интересной для него статьи). (Надеюсь, такие загадки не против правил Хабра)

Обзор физики в играх Sonic. Части 5 и 6: потеря колец и нахождение под водой - 3

Автор: PatientZero

Источник


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


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js