Теория 2D-файтингов: семь лет спустя
Добавлено: 30 май 2011, 22:38
Эта тема полна любви и обожания к словоблудству.
Мы с HEAVEN'ом решили написать мега-гайд-словарь.
Так как посты править я не могу я создал тему (в надежде что Хевену дадут модера в этом разделе).
4 поста мы зарезервирем под контент.
Это пока черновики, коментируйте, давайте ссыли на инфу, находите ошибки.
"Насчёт того что и без терминологии можно пнить народ, это как у врачей.
Да, можно не учить латынь и лечить бабулек, но для общения с коллегами она необходима."
~RoBoBOBR
Здравствуйте дорогие читатели. В году эдак 2004ом один хороший человек под ником Valen написал статью «Техническая сторона 2D файтингов», в ней он описал много полезных вещей, которые обязан знать любой уважающий себя файтер. Но прошло 7 лет, многие вещи стали называться по другому, одни термины вытеснили другие, какие-то названия - устарели и наплодилось ещё целое скопище нотаций, техник и механик, которые вроде бы на слуху, но что они из себя представляют – загадка.
Но не унывайте! Здесь и сейчас, ваши покорные слуги Heaven и Hidan, решительно заменят ваш страх неведения ужасом познания. Эта пытка будет проходить в шесть актов (и к ней будет приложен словарь).
1. Ядро 2Д механики
1.1. Анимация и спрайты.
Начнём с самого начала. Как уже говорилось: то что вы видите играя в 2Д файтинг – покадровая анимация т.е. вам быстро показывают череду статических (неподвижных) картинок, и для ваших глаз они сливаются в (более или менее) плавное движение.
В секунду на экране появляется 60 кадров. Соответственно один кадр взят всеми за единицу времени. Так как количество кадров в секунду, отвечает за скорость происходящего, игры сделаны так, чтобы оно было постоянным. Если компьютер, приставка или аркадный автомат не может справиться с обработкой 60 кадров в секунду то происходит падение FPS (frames per second).
Падение FPS бывает двух видов:
В первом случае, в момент падения FPS, кадр остаётся на экране, а игра обрабатывает следующий за ним кадр. В результате скорость игры падает. Если падение FPS обусловлено только постоянным изменением лага в сетевой игре, то FPS может резко падать и возвращаться к норме – это называется плавающий FPS.
Иногда игра пытается нагнать простой и если у игры есть возможности показать больше 60 кадров в секунду - то FPS будет просто подниматься выше нормы. А если у игры нет такой возможности - "используется" способ вставки недоработанного кадра поверх предыдущего. В итоге мы получаем так называемый screen tearing (скрин тиринг), такая вещь обычно лечится вертикальной синхронизацией, изменением разрешения "на лету" и прочими прелестями.
Во втором случае, в момент падения fps, игра обрабатывает не следующий кадр, а тот который может обработать во время. В результате темп игры сохраняется. (Так как я не программист, я не могу даже предположить, какие компенсационные механизмы нужны, чтобы предотвратить десинхронизацию и сохранить инпут при сетевой игре.)
Теперь давайте разложим анимацию на кадры:
Анимация длится от нейтральной стойки и до неё. Всего в ней 28 фреймов, что равно 0,466 секунды (грубо скажем пол секунды). Как мы видим, помимо нейтральной стойки, в анимации всего 5 разных картинок. Они называются – спрайты. В любой анимации может быть от одного спрайта до количества не превышающего количество фреймов этой анимации. Например, для нашей анимации можно нарисовать 28 разных спрайтов, если нарисовать больше - придётся добавить в неё фреймов (и анимация замедлится).
До конца темы нам осталось объяснить две вещи. И первая - запланированное (систематическое?) изменение FPS. Есть всего два случая, когда разработчики вносят это в игру.
Первый случай, - для ускорения игрового процесса. Впервые такая опция появилась в Street Fighter 2. По просьбам фанатов сери, в игру были введены Турбо режимы (сначала один, а потом ещё больше). Суть работы Турбо режима состоит в сокрытии определённых кадров от игрока, оставляя все остальные процессы в игре неизменными. Например, если не показывать каждый 5тый кадр, игра ускорится на 25%, а если не показывать каждый третий – на 50%. При этом игра будет производить обсчёт непоказанных кадров, аудио будет проигрываться с нормальной скоростью, а игровой процесс не пострадает.
Второй случай, более редок. Предназначен он для 2Д файтингов использующих 3Д графику. Модель – не спрайт, производить откаты анимации в сетевой игре – проблематично. У разработчиков есть две основных опции при скачках лага: смириться с плавающим FPS или кратно порезать частоту показа кадров и показывать в два, три или четыре раза меньше кадров, но с максимально стабильной внутриигровой скоростью.
И, наконец, финал - Виды игровых анимаций. Давайте посмотрим на череду кадров не просто как на мультик, а как на инструмент для побоев:
Обычно любое действие поделено на три фазы:
1) Стартап – кадры подготовки действия (в нашем случае удара). Чем меньше кадров стартапа у удара или приёма, тем быстрее их анимация и тем сложнее на них отреагировать.
2) Актив – кадры самого удара, только во время этих кадров наш персонаж может ударить. Как правило, с большим количеством этих кадров, вам легче сделать удар заранее не боясь что кадры актива закончится раньше времени, а с маленьким количеством этих кадров, удар в целом быстрее и противнику тяжелее отреагировать.
3) Рекавери – кадры возврата в нейтральную стойку. Чем их больше, тем больше времени у противника выбрать дальнейшие действия.
99) Нейтральная стойка – в данном случае анимация действия начинается и заканчивается нейтральной стойкой.
Таким образом, анимация идеального удара состоит из минимума кадров стартапа и минимума кадров рекавери. К сожалению, если и есть такие удары в играх – то эти плюсы компенсируются равноценными минусами (или такие удары или приёмы банятся, иногда вместе с персонажем).
Не все анимации имеют все три стадии. Например у анимации броска может полностью отсутствовать стартап, у анимации бега - рекавери. А у анимации прыжка может отсутствовать стартап, да и рекавери тоже, а то что осталось и активными кадрами–то не назовёшь.
Теперь идите попейте чаю и подумайте о прочитанном.
1.1.1. Эзотерика под катом №1:
___________________________________________________________________________________________________________________________________________
1.2. Обсчёт взаимодействия персонажей.
Я делал несколько попыток рыпнуться на эту тему с разных углов. Безуспешно.
В общем это будет очень муторный разговор. Во первых, мы будем говорить сразу о хитбоксах, векторах движения, базовых. Во вторых, даже так мы заденем те места, которые хотелось бы оставить на потом.
Давайте разберёмся, как же игра считает, что один персонаж ударил другого? Начнём с того, что спрайты персонажей – не взаимодействуют друг с другом. Это картинки, они ничего никому не должны. Высчитывать соприкосновение попиксельно – непрактично и проблематично. Удары будут мазать или попадать куда более случайным образом, по всяким рациональным, но глупым причинам. Ваш персонаж выставляет руку чуть вперёд в базовой стойке – готовьтесь умирать. Ваш персонаж отклоняется чуть дальше при попадании в него удара – почти все комбы на нём не работают. «Акомуэтонужно?Никомуненужно».
Начиная с истоков жанра, все взаимодействие между персонажами происходит посредством хитбоксов. Даже в 3Д файтингах (что - там даже в Контрстрайке!) взаимодействие моделей рассчитывается по хитбоксам. Давайте на них посмотрим:
Все эти разноцветные прямоугольники - описывают реальное положение персонажа. Все они появились к 1993 году… и лучше них ещё ничего не придумали. Заранее хочу предупредить, что разные разработчики, хоть и придерживаются определённого шаблона, могут очень по разному описывать свойства хитбоксов. И да, никто не говорит «зона атаки\расталкивания итп», это просто перевод.
Origin – точка начала координат, от неё строится всё. Так легче контролировать перемещение всей груды этих боксов и спрайта. Иногда от неё рассчитывается разворот персонажа, если его перепрыгнули, и то в какую сторону он должен блокировать атаку, но это скорее исключения ибо вовлечение «точки отсчёта координат» в игровые механки выходит боком, когда потребуется что-то менять.
Push box – ака «пушбокс» ака «зона расталкивания», этот бокс не даёт проходить персонажам сквозь друг друга. Традиционно он один.
Если два пушбокса сталкиваются по горизонтали, то один персонаж начинает толкать другого. Фактически это значит, что какой-то коэффициент вектора скорости (Vx1*N, где N<1) передался другому персонажу. Если второй персонаж начнёт двигаться на встречу первому то скорости сложатся (Vx1*N - Vx2*N). В итоге оба персонажа начнут двигаться в сторону большего вектора (или остановятся). То же самое будет происходить если один пушбокс находится выше другого, но не достаточно высоко, чтобы пройти над ним.
Ещё пушбокс может намеренно пропадать, чтобы дать персонажу возможность пройти сквозь противника.
Если один пушбокс, сталкивается с другим по вертикали, обычно после прыжка персонажа на голову другому персонажу, то игра высчитывает: с какой стороны приземлиться прыгающему персонажу. Этот процесс покрыт занавесом тайны, но вполне разумно предположить, что сравниваются делённые на два суммы левого и правого края пушбокса [(X1-X2)/2 >< (X3-X4)/2]. Таким же образом высчитывается в какую же сторону блокировать атаку прыгающего персонажа:
1.2.1. Эзотерика под катом №2:
Vulnerable box – ака «вулнбокс» ака «уязвимая зона», эти боксы описывают ту зону по которой можно попасть, они могут выходить за границу спрайта или оставаться глубоко в ней. Их традиционно несколько.
Вулнбоксам могут присваиваться разные свойства: неуязвимость к определённым типам атак, или отказ от перехода к анимации reel stuna (об этом чуть далее) при попадении в зону определённых ударов. Так же они могут просто пропадать.
Если вулнбоксы пропали на определённое количество кадров – это называется кадрами неуязвимости. Игра также может иметь набор частичных неуязвимостей, как по типу, так и по зоне атаки. Это всё безумно неинтересно.
Attack box – ака «атак бокс» ака «зона атаки», эти боксы пописывают зону, которая должна попасть по Вулнбоксу, чтобы произошло попадание удара. Их может быть несколько (по очереди или одновременно) в одной атаке.
Атакбокс так же могут иметь свойства. Например: верхний удар (нельзя блокировать сидя), нижний удар (нельзя блокировать стоя), неблокируемый удар. Тут всё зависит от разработчиков, в BlazBlue например введён «средний удар» (который раньше определялся отсутствием свойств вехнего и нижнего удара), для того, чтобы работала хитрая система неуязвимостей, когда просто верхний удар может попасть по вулнбоксу неуязвимому к верхним ударам, а удар со свойствами верхний+средний уже не промажет.
Это всё безумно неинтересно.
1.2.2. Эзотерика под катом №3:
Proximity Guard box – «ПГбокс» (отсебятина). Этот бокс может отсутствовать в игре. В первой версии СФ2 если на экране появлялся Атакбокса, (даже если удар происходил на другом конце экрана), то противник, начинал вставать в блок при попытке двигаться назад. Этот был придуман как заплатка – бокс который немного длиннее, чем Атакбокс и отвечающий, за вставание противника в защитную позицию, но только с определённого расстояния.
Немного о движении
Мы тут говорили о «векторах скорости», что «за нафиг в моём файтинге», вы меня спросите? Векторов разных есть у мея, я вам отвечу.
Движение в файтингах (да и много где ещё) описывается присвоением персонажу векторов скорости и ускорения по осям Х и У. Кратко – сумма векторов Х и У позволяет реализовать падения и прыжки под любым углом, ускорения по осям делают возможными создания разных кривых пыжков и падений. Пока это всё что нужно знать.
Мы с HEAVEN'ом решили написать мега-гайд-словарь.
Так как посты править я не могу я создал тему (в надежде что Хевену дадут модера в этом разделе).
4 поста мы зарезервирем под контент.
Это пока черновики, коментируйте, давайте ссыли на инфу, находите ошибки.
"Насчёт того что и без терминологии можно пнить народ, это как у врачей.
Да, можно не учить латынь и лечить бабулек, но для общения с коллегами она необходима."
~RoBoBOBR
Здравствуйте дорогие читатели. В году эдак 2004ом один хороший человек под ником Valen написал статью «Техническая сторона 2D файтингов», в ней он описал много полезных вещей, которые обязан знать любой уважающий себя файтер. Но прошло 7 лет, многие вещи стали называться по другому, одни термины вытеснили другие, какие-то названия - устарели и наплодилось ещё целое скопище нотаций, техник и механик, которые вроде бы на слуху, но что они из себя представляют – загадка.
Но не унывайте! Здесь и сейчас, ваши покорные слуги Heaven и Hidan, решительно заменят ваш страх неведения ужасом познания. Эта пытка будет проходить в шесть актов (и к ней будет приложен словарь).
1. Ядро 2Д механики
1.1. Анимация и спрайты.
Начнём с самого начала. Как уже говорилось: то что вы видите играя в 2Д файтинг – покадровая анимация т.е. вам быстро показывают череду статических (неподвижных) картинок, и для ваших глаз они сливаются в (более или менее) плавное движение.
В секунду на экране появляется 60 кадров. Соответственно один кадр взят всеми за единицу времени. Так как количество кадров в секунду, отвечает за скорость происходящего, игры сделаны так, чтобы оно было постоянным. Если компьютер, приставка или аркадный автомат не может справиться с обработкой 60 кадров в секунду то происходит падение FPS (frames per second).
Падение FPS бывает двух видов:
В первом случае, в момент падения FPS, кадр остаётся на экране, а игра обрабатывает следующий за ним кадр. В результате скорость игры падает. Если падение FPS обусловлено только постоянным изменением лага в сетевой игре, то FPS может резко падать и возвращаться к норме – это называется плавающий FPS.
Иногда игра пытается нагнать простой и если у игры есть возможности показать больше 60 кадров в секунду - то FPS будет просто подниматься выше нормы. А если у игры нет такой возможности - "используется" способ вставки недоработанного кадра поверх предыдущего. В итоге мы получаем так называемый screen tearing (скрин тиринг), такая вещь обычно лечится вертикальной синхронизацией, изменением разрешения "на лету" и прочими прелестями.
Во втором случае, в момент падения fps, игра обрабатывает не следующий кадр, а тот который может обработать во время. В результате темп игры сохраняется. (Так как я не программист, я не могу даже предположить, какие компенсационные механизмы нужны, чтобы предотвратить десинхронизацию и сохранить инпут при сетевой игре.)
Теперь давайте разложим анимацию на кадры:
Анимация длится от нейтральной стойки и до неё. Всего в ней 28 фреймов, что равно 0,466 секунды (грубо скажем пол секунды). Как мы видим, помимо нейтральной стойки, в анимации всего 5 разных картинок. Они называются – спрайты. В любой анимации может быть от одного спрайта до количества не превышающего количество фреймов этой анимации. Например, для нашей анимации можно нарисовать 28 разных спрайтов, если нарисовать больше - придётся добавить в неё фреймов (и анимация замедлится).
До конца темы нам осталось объяснить две вещи. И первая - запланированное (систематическое?) изменение FPS. Есть всего два случая, когда разработчики вносят это в игру.
Первый случай, - для ускорения игрового процесса. Впервые такая опция появилась в Street Fighter 2. По просьбам фанатов сери, в игру были введены Турбо режимы (сначала один, а потом ещё больше). Суть работы Турбо режима состоит в сокрытии определённых кадров от игрока, оставляя все остальные процессы в игре неизменными. Например, если не показывать каждый 5тый кадр, игра ускорится на 25%, а если не показывать каждый третий – на 50%. При этом игра будет производить обсчёт непоказанных кадров, аудио будет проигрываться с нормальной скоростью, а игровой процесс не пострадает.
Второй случай, более редок. Предназначен он для 2Д файтингов использующих 3Д графику. Модель – не спрайт, производить откаты анимации в сетевой игре – проблематично. У разработчиков есть две основных опции при скачках лага: смириться с плавающим FPS или кратно порезать частоту показа кадров и показывать в два, три или четыре раза меньше кадров, но с максимально стабильной внутриигровой скоростью.
И, наконец, финал - Виды игровых анимаций. Давайте посмотрим на череду кадров не просто как на мультик, а как на инструмент для побоев:
Обычно любое действие поделено на три фазы:
1) Стартап – кадры подготовки действия (в нашем случае удара). Чем меньше кадров стартапа у удара или приёма, тем быстрее их анимация и тем сложнее на них отреагировать.
2) Актив – кадры самого удара, только во время этих кадров наш персонаж может ударить. Как правило, с большим количеством этих кадров, вам легче сделать удар заранее не боясь что кадры актива закончится раньше времени, а с маленьким количеством этих кадров, удар в целом быстрее и противнику тяжелее отреагировать.
3) Рекавери – кадры возврата в нейтральную стойку. Чем их больше, тем больше времени у противника выбрать дальнейшие действия.
99) Нейтральная стойка – в данном случае анимация действия начинается и заканчивается нейтральной стойкой.
Таким образом, анимация идеального удара состоит из минимума кадров стартапа и минимума кадров рекавери. К сожалению, если и есть такие удары в играх – то эти плюсы компенсируются равноценными минусами (или такие удары или приёмы банятся, иногда вместе с персонажем).
Не все анимации имеют все три стадии. Например у анимации броска может полностью отсутствовать стартап, у анимации бега - рекавери. А у анимации прыжка может отсутствовать стартап, да и рекавери тоже, а то что осталось и активными кадрами–то не назовёшь.
Теперь идите попейте чаю и подумайте о прочитанном.
1.1.1. Эзотерика под катом №1:
___________________________________________________________________________________________________________________________________________
1.2. Обсчёт взаимодействия персонажей.
Я делал несколько попыток рыпнуться на эту тему с разных углов. Безуспешно.
В общем это будет очень муторный разговор. Во первых, мы будем говорить сразу о хитбоксах, векторах движения, базовых. Во вторых, даже так мы заденем те места, которые хотелось бы оставить на потом.
Давайте разберёмся, как же игра считает, что один персонаж ударил другого? Начнём с того, что спрайты персонажей – не взаимодействуют друг с другом. Это картинки, они ничего никому не должны. Высчитывать соприкосновение попиксельно – непрактично и проблематично. Удары будут мазать или попадать куда более случайным образом, по всяким рациональным, но глупым причинам. Ваш персонаж выставляет руку чуть вперёд в базовой стойке – готовьтесь умирать. Ваш персонаж отклоняется чуть дальше при попадании в него удара – почти все комбы на нём не работают. «Акомуэтонужно?Никомуненужно».
Начиная с истоков жанра, все взаимодействие между персонажами происходит посредством хитбоксов. Даже в 3Д файтингах (что - там даже в Контрстрайке!) взаимодействие моделей рассчитывается по хитбоксам. Давайте на них посмотрим:
Все эти разноцветные прямоугольники - описывают реальное положение персонажа. Все они появились к 1993 году… и лучше них ещё ничего не придумали. Заранее хочу предупредить, что разные разработчики, хоть и придерживаются определённого шаблона, могут очень по разному описывать свойства хитбоксов. И да, никто не говорит «зона атаки\расталкивания итп», это просто перевод.
Origin – точка начала координат, от неё строится всё. Так легче контролировать перемещение всей груды этих боксов и спрайта. Иногда от неё рассчитывается разворот персонажа, если его перепрыгнули, и то в какую сторону он должен блокировать атаку, но это скорее исключения ибо вовлечение «точки отсчёта координат» в игровые механки выходит боком, когда потребуется что-то менять.
Push box – ака «пушбокс» ака «зона расталкивания», этот бокс не даёт проходить персонажам сквозь друг друга. Традиционно он один.
Если два пушбокса сталкиваются по горизонтали, то один персонаж начинает толкать другого. Фактически это значит, что какой-то коэффициент вектора скорости (Vx1*N, где N<1) передался другому персонажу. Если второй персонаж начнёт двигаться на встречу первому то скорости сложатся (Vx1*N - Vx2*N). В итоге оба персонажа начнут двигаться в сторону большего вектора (или остановятся). То же самое будет происходить если один пушбокс находится выше другого, но не достаточно высоко, чтобы пройти над ним.
Ещё пушбокс может намеренно пропадать, чтобы дать персонажу возможность пройти сквозь противника.
Если один пушбокс, сталкивается с другим по вертикали, обычно после прыжка персонажа на голову другому персонажу, то игра высчитывает: с какой стороны приземлиться прыгающему персонажу. Этот процесс покрыт занавесом тайны, но вполне разумно предположить, что сравниваются делённые на два суммы левого и правого края пушбокса [(X1-X2)/2 >< (X3-X4)/2]. Таким же образом высчитывается в какую же сторону блокировать атаку прыгающего персонажа:
1.2.1. Эзотерика под катом №2:
Vulnerable box – ака «вулнбокс» ака «уязвимая зона», эти боксы описывают ту зону по которой можно попасть, они могут выходить за границу спрайта или оставаться глубоко в ней. Их традиционно несколько.
Вулнбоксам могут присваиваться разные свойства: неуязвимость к определённым типам атак, или отказ от перехода к анимации reel stuna (об этом чуть далее) при попадении в зону определённых ударов. Так же они могут просто пропадать.
Если вулнбоксы пропали на определённое количество кадров – это называется кадрами неуязвимости. Игра также может иметь набор частичных неуязвимостей, как по типу, так и по зоне атаки. Это всё безумно неинтересно.
Attack box – ака «атак бокс» ака «зона атаки», эти боксы пописывают зону, которая должна попасть по Вулнбоксу, чтобы произошло попадание удара. Их может быть несколько (по очереди или одновременно) в одной атаке.
Атакбокс так же могут иметь свойства. Например: верхний удар (нельзя блокировать сидя), нижний удар (нельзя блокировать стоя), неблокируемый удар. Тут всё зависит от разработчиков, в BlazBlue например введён «средний удар» (который раньше определялся отсутствием свойств вехнего и нижнего удара), для того, чтобы работала хитрая система неуязвимостей, когда просто верхний удар может попасть по вулнбоксу неуязвимому к верхним ударам, а удар со свойствами верхний+средний уже не промажет.
Это всё безумно неинтересно.
1.2.2. Эзотерика под катом №3:
Proximity Guard box – «ПГбокс» (отсебятина). Этот бокс может отсутствовать в игре. В первой версии СФ2 если на экране появлялся Атакбокса, (даже если удар происходил на другом конце экрана), то противник, начинал вставать в блок при попытке двигаться назад. Этот был придуман как заплатка – бокс который немного длиннее, чем Атакбокс и отвечающий, за вставание противника в защитную позицию, но только с определённого расстояния.
Немного о движении
Мы тут говорили о «векторах скорости», что «за нафиг в моём файтинге», вы меня спросите? Векторов разных есть у мея, я вам отвечу.
Движение в файтингах (да и много где ещё) описывается присвоением персонажу векторов скорости и ускорения по осям Х и У. Кратко – сумма векторов Х и У позволяет реализовать падения и прыжки под любым углом, ускорения по осям делают возможными создания разных кривых пыжков и падений. Пока это всё что нужно знать.