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

Ссылки на другие части серии:
Часть 1: твердые тайлы
Часть 2: бег
Части 3 и 4: прыжки и вращение
Части 5 и 6: потеря колец и нахождение под водой

Часть 7: пружины и штуковины



Пружинные площадки

Красные пружинные площадки придают Сонику скорость 16, а жёлтые — скорость 10. В зависимости от направления площадки (вверх или вниз), значение отрицательное или положительное, и соответственно скорости по оси Y придается это значение. Если пружинная площадка направлена влево или вправо, значение скорости отрицательное или положительное, соответственно скорость по оси X приравнивается к этому значению. Вертикальные площадки не влияют на скорость X, как и горизонтальные площадки не влияют на скорость Y.



Диагональные пружинные площадки

В Sonic the Hedgehog (16-bit) нет диагональных пружинных площадок. Однако они есть в Sonic 2 (16-bit), 3, Knuckles и CD. В Sonic 2, 3 и Knuckles они работают одинаково, но в Sonic CD принцип отличается.

в Sonic 2, 3 и Knuckles диагональная пружина устанавливает скоростям X и Y значение пружинной площадки с соответствующим знаком. Поэтому пружина, направленная вверх-вправо придает скорость Y, равную -16 и скорость X, равную 16. Проблема этого метода в том, что технически Соник отталкивается диагонально быстрее, чем горизонтально или вертикально. Это потому, что разработчики не позаботились учесть косинусы и синусы.

В Sonic CD они исправились. Удобно, что абсолютные значения синуса и косинуса угла в 45 градусов одинаковы, поэтому требуется только одно значение. Скорость становится равной 11.3125 для красных пружин и 7.0703125 для жёлтых.

Блокировка горизонтального управления

Когда Соник отскакивает от горизонтальной пружины (красной или жёлтой), он не может тормозить или иным способом влиять на свою скорость X в течение 16 циклов. Движок достигает этого, устанавливая ту же блокировку горизонтального управления, что и при скатывании с крутых склонов (в S3 и Knuckles байты $32-33 являются таблицей состояний объекта игрока). Зачем блокировать горизонтальное управление? При столкновении с пружиной игрок скорее всего нажимает крестовину в направлении пружины, и это может привести к отталкиванию Соника в анимации торможения. Временное игнорирование ввода — это быстрое и элегантное решение.

Анимация

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

В случае любой из диагональных пружинных площадок Соник вообще не переходит анимации ходьбы в воздухе. Он сохраняет анимацию «штопора» (трёхмерного вращения), кадры которой сменяются раз в 5,5 цикла.

Воздушные шарики

При столкновении Соника с воздушными шариками на уровнях Carnival Night Zone его скорость Y устанавливается равной -7, вне зависимости от угла столкновения. Скорость X не изменяется.



Бамперы

Бамперы в Spring Yard Zone придают Сонику скорость X, равную 7*cos(p), и скорость Y 7*-sin(p), где p — это угол между центрами бампера и Соника. Скорость устанавливается вне зависимости скорости Соника до столкновения с бампером.



Пушки

Пушки в Carnival Night Zone придают Сонику горизонтальную скорость 16*cos(p), и вертикальную скорость 16*-sin(p), где p — угол наклона пушки.



Крышки с пружинами

Красные крышки с пружинами, которые закрывают трубы в Chemical Plant Zone, работают как пружинные площадки, но немного сильнее, чем жёлтые площадки. При столкновении они придают Сонику скорость Y, равную -10.5.



Вертушки

Чёрные вертушки, которые разгоняют ежа вперёд в Chemical Plant Zone устанавливают скорость X равной 16. Однако они не замедляют его, если он уже движется быстрее.

Лифты в небе

Лифты в небе на уровнях Hill Top Zone перемещаются со скоростью X, равной 2, и скоростью Y, равной 1.



Грибы

Грибы в Mushroom Hill Zone работают как пружинные площадки, однако каждый последующий отскок становится выше предыдущего (до трёх отскоков). Первый отскок придаёт скорость Y -6.5, второй -7.5, а третий -8.5.



Разрушение стен

В Sonic 1, 2, 3 и Knuckles для пробивания разрушаемых стен при вращении абсолютная скорость X персонажа должна превышать 4.5 (за исключением персонажа Knuckles, который крошит стены при столкновении, при этом ему не обязательно вращаться). Столкновения с такими стенами не влияют на скорость X.

Однако когда Knuckles разрушает стены в Sonic 3 и Knuckles, несмотря на то, что его скорость X не изменяется, он не двигается в кадре, в котором ударяет стену. То же самое справедливо для пробивания Соником стены при вращении в Sonic 3 и Knuckles.

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

Разрушаемые блоки и камни

Когда Соник запрыгивает на разрушаемые объекты, такие как камни в Hill Top Zone, блоки в Marble Zone или крышки труб в Chemical Plant Zone, он отскакивает от них со скоростью Y, равной -3. Скорость X не изменяется.



Часть 8: суперскорости



Супербыстрые ботинки

Примечание переводчика: супербыстрые ботинки (Super Fast Shoes) — это бонус увеличения скорости, действующий 20 секунд и повышающий ускорение и максимальную скорость Соника. Выбивается из вот таких мониторов:



Переменная Значение
Ускорение 0.09375
Торможение
0.5 (не изменяется)
Трение
0.09375
Максимальная скорость 12
Ускорение в воздухе
0.1875
Трение при вращении
0.046875
Торможение при вращении
0.125 (не изменяется)

Примечание: если Соник падает в воду, все эффекты супербыстрых ботинок (Super Fast Shoes) обнуляются. «Подводные» переменные полностью их заменяют. Если вы выпрыгнете из воды, эффект супербыстрых ботинок не вернётся. Похоже, что это относится ко всем 5 играм.

В Sonic 3 и Knuckles темп музыкальной композиции увеличивается в 1.25 раза.

Супер/Гиперсоник

Примечание переводчика: Суперсоник (Super Sonic) — это суперформа персонажа Sonic the Hedgehog. Такая форма Соника впервые была применена в игре Sonic the Hedgehog 2 и в различном объёме реализовалась затем в каждой основной игре про Соника. Превратиться в Суперсоника можно, собрав все семь Изумрудов Хаоса, найдя не менее 50 колец и потеряв всю защиту. Сделав двойной прыжок, Соник становится жёлтым Суперсоником, это более быстрая и почти неуязвимая форма Соника. Однако на поддержание этой формы тратятся кольца (см. ниже).



В играх Sonic 3 и Knuckles, после сбора всех Изумрудов Хаоса на специальных уровнях можно собрать семь Суперизумрудов, после чего превратиться в Гиперформу персонажа. Она также тратит собранные кольца. В этом режиме персонаж может делать направленные двойные прыжки, уничтожать всех противников на экране и не способен утонуть, в отличие от суперформы.






Переменные относятся к Суперсонику в Sonic 2 и к Супер- или Гиперсонику в Sonic 3 и Knuckles, за исключением отмеченной переменной.

Переменная Значение Значение (под водой)
Ускорение
0.1875
0.09375
Торможение
1
0.5
Трение
0.046875 (не изменяется)
0.046875 (не изменяется)
Максимальная скорость
10
5
Ускорение в воздухе
0.375
0.1875
Начальная скорость прыжка
8
3.5 (не изменяется)
Скорость прыжка при отпускании кнопки
4 (не изменяется)
2 (не изменяется)
Трение при вращении
0.09375 (0.0234375 в Sonic 3 и Knuckles)
0.046875 (0.0234375 в Sonic 3 и Knuckles)
Торможение при вращении
0.125 (не изменяется)
0.125 (не изменяется)

Способность Hyper Blast (только у Гиперсоника)

Когда игрок нажимает второй раз кнопку прыжка в воздухе, скорость Соника по оси X приравнивается 8, если он смотрит вправо, и к -8, если влево, а скорость по оси Y обнуляется. Если игрок удерживает «вверх» на крестовине при нажатии на кнопку, то скорость Соника по оси Y приравнивается к -8, а по оси X обнуляется.

Супертейлз, Супер/Гипернаклз

Переменная Значение Значение (под водой)
Ускорение
0.09375
0.046875
Торможение
0.75
0.375
Трение
0.046875 (не изменяется)
0.046875 (не изменяется)
Максимальная скорость
8
4
Ускорение в воздухе
0.1875
0.09375
Начальная скорость прыжка
(не изменяется)
(не изменяется)
Скорость прыжка при отпускании кнопки
(не изменяется)
(не изменяется)
Трение при вращении 0.0234375
0.0234375
Торможение при вращении
0.125 (не изменяется)
0.125 (не изменяется)
Скорость взбирания (только для Наклза)
2
2
Начальная скорость скольжения (только для Наклза)
4 (не изменяется)
4 (не изменяется)
Ускорение скольжения (только для Наклза)
0.046875
0.046875

Стенотрясение (Wall Quake) (только для Гипернаклза)

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

Отбор колец

Находясь в режиме Супер/Гипер, персонаж теряет по одному кольцу каждые 60 циклов, или раз в 1 секунду.

Примечания

Если Супер/Гиперперсонаж получает супербыстрые ботинки, разбив монитор, переменные супербыстрых ботинок заменяют переменные режима Супер/Гипер, на самом деле замедляя персонаж (однако максимальная скорость остаётся немного выше). Это может быть нежелательно в вашем собственном движке.

Когда Супер/Гиперперсонаж падает в воду, он использует указанные выше переменные. Однако, если они становятся Супер/Гипер уже под водой, переменные режима Супер/Гипер становятся такими, как будто он не находится под водой. Это баг, и его следует избегать в своём движке.

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

image
Поделиться с друзьями
-->

Комментарии (20)


  1. WST
    30.07.2016 09:23
    +2

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


    1. PatientZero
      30.07.2016 14:52

      Спасибо и вам.


  1. qwerty123123
    30.07.2016 10:39
    -12

    Статья по физике в игре. И ни одной офрмулы. Ни одной теоремы. Там импульсная физика или какая? Континиоус колижн детекшн есть? Коллижн респонз делается силой или ипмульсом?


    1. PatientZero
      30.07.2016 10:42
      +8

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


      1. icCE
        30.07.2016 16:35
        +1

        и я скажу, это до сих пор офигительно!


  1. perfect_genius
    30.07.2016 21:32

    Если скорость неограничена, то что мешает проходить сквозь тонкие стенки при максимально возможном ускорении?
    Видел только прохождение сквозь камни.


    1. PatientZero
      30.07.2016 22:11

      У Соника и тайлов уровня есть коллайдеры, которые препятствуют прохождению через них, подробнее о них можно почитать в первой части. Надеюсь, я правильно понял ваш вопрос?


      1. perfect_genius
        30.07.2016 23:15
        +1

        Ок, тогда переформулирую так: какая скорость должна быть у Соника, чтобы он проходил насквозь эти коллайдеры?


        1. qwerty1231234
          30.07.2016 23:34
          -2

          Да никакая. Там «continuous collision detection». Он не пролети сковь даже стену в 1 пиксель. Строится геометрия между позициями и ловится проникновение.


          1. perfect_genius
            30.07.2016 23:47
            +1

            В какой части про это написано? В первой что-то не могу найти.


            1. qwerty1231234
              31.07.2016 00:08
              -2

              Ни в какой. Автор не разработчик физики для игр. Он просто переводчик. Мой комментарий выше был заминусован.
              Можешь почитать главу «2.4.3 Discrete Versus Continuous Motion» в Real-Time Collision Detection by Christer Ericson
              http://realtimecollisiondetection.net/blog/?page_id=2


              1. perfect_genius
                31.07.2016 09:20

                Глянул ваш комментарий, наверно минусующим не понравилось, что английские слова вы написали русскими =)


                1. PatientZero
                  31.07.2016 14:35
                  +1

                  Думаю, дело не в этом.


          1. PatientZero
            31.07.2016 14:34
            +1

            Там «continuous collision detection».

            Почему вы так думаете?


            1. qwerty1231234
              31.07.2016 15:09

              Потомучто для этого используется либо очень маленький fixed_timestep для интегрирования физики, либо continuous collision detection. Человек спросил про проникновение сквозь предметы, если скорость будет на столько большей, что за dt между кадрами, объект пролетит через всё, что только можно.


    1. WST
      31.07.2016 14:26

      Ничто не мешает проходить через стенки, ровно ничто. Скорость (в пикселях/шаг) должна быть больше «толщины» стенки. Типичные стены в игре бывают толщиной 16 и 32 пикселя. Вторые в большинстве случаев пролететь невозможно, а вот с первыми обычно бывает достаточно просто: нужно, во-первых, развить скорость более 16 пикселей за шаг (т.е 4096 субпикселей за шаг), во-вторых, спозиционироваться так, чтобы ни на одном шаге X-координата персонажа не появилась внутри этой стенки (ширина персонажа, равная 18 пикселей, при этом не учитывается. Таким образом, чем выше скорость, тем больше шансов пролететь сквозь стенку. Всякие умные словечки, которыми бросается qwerty1231234, к сожалению, далеки от истины, и мне, честно говоря, не совсем ясно, зачем он бросается утверждениями типа «он не пролетит даже стену в 1 пиксель».

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

      Прохождение сквозь камни (и любые другие объекты), про которые вы говорите, имеет несколько иную природу и основано на том, что столкновения с объектами не проверяются, если объект находится за пределами кадра, причём для разных типов объектов необходимо разное удаление от кадра для того, чтобы столкновения не проверялись. Камни и шипы, к примеру, имеют меньший «радиус» действия, чем мониторы.

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


      1. PatientZero
        31.07.2016 14:57

        Да, всё верно. Посмотрел второе видео, забавные глитчи возникают при спидране.


        1. WST
          31.07.2016 15:00

          К слову, если кто-то не в курсе, как делаются подобные «сверхточные» спидраны, я писал об этом в одном из своих постов.


      1. qwerty1231234
        31.07.2016 15:17
        -2

        Так если тебе не понятно, то может почитаешь что-нибудь про физику для игр, не?

        16 пикселей за шаг (т.е 4096 субпикселей за шаг)

        Пипец. нету никаких пикселей за шаг или не пикселей за шаг. Мир живет за счет p = p0 + v*t + a*t*t/2. Если между кадрами большое dt, то тело и пройдет большое расстояние. А это нужно контролить. Пост самоутверждения каких-то философов.


        1. WST
          31.07.2016 15:29

          Во-первых, я не разработчик игр и такие детали мне не нужны. Просто некоторые детали игровой физики могут быть необходимы не только разработчикам и ромхакерам, но и представителям других прикладных областей (в моём случае это ассистированное скоростное прохождение). Поэтому я говорю принятым в наших кругах языком, который лично для тебя может показаться некорректным. Но то, что мне необходимо для моей деятельности, связанной с этой игрой, я знаю. Насчёт того, что «нету никаких пикселей за шаг» почитай, пожалуйста, вот эту статью. Думаю, кое-что прояснится. В этой игре вся физика построена на изменении координат, скоростей и т.п. за единицу игрового времени — кадр (в терминологии этой серии хабратопиков называемую шагом), и, в силу особенностей архитектуры, мы вынуждены оперировать исключительно с целыми числами (дробные величины имитируются при помощи этих самых субпикселей). На каждом шаге координаты и скорости перевычисляются с учётом состояния персонажа, при этом используются практически только операции сложения и вычитания. А твои попытки самоутвердиться выглядят как-то странно. Пусть даже ты что-то и знаешь о теории платформеров вообще, какой смысл делать заявления применительно к конкретной игре, не зная, какой механизм там имеет место?