Абзац
:: Поиск
:: ПоддерЖка ПрОекта
Webmoney:
  • Z610389805629
  • R427996570517
  • E023541002978
  • :: №26 (16.01.2006) ПрОсмотрОв: 5669

    Автор: Кирилл Каган / Surfin’ Bird.

    Рубрика: Читатель читателю.

    Номер: №26 (16.01.2006).



    Рисование однобитных игровых спрайтов и их анимация

    Здравствуйте, друзья! Эта статья изначально была написана как руководство по созданию спрайтов для ZX Spectrum на IBM PC в программе «Pro Motion». Чуть позже, по рекомендации редактора «Абзаца», я переписал ее, учитывая особенности самого удобного, на мой взгляд, графического редактора для ZX Spectrum - Burial Gfx Editor, на котором я создавал игровые спрайты в течение ряда лет, и до сих пор рисую в нем полноцветные картинки.

    Процесс создания спрайта можно условно разделить на три этапа:

    1. Рисование outline первого кадра.

    2. Создание outline анимации всех движений персонажа методом «frame by frame» («кадр за кадром»).

    3. «Раскраска» (dithering) готовой outline анимации, проработка теней и деталей.

    Редактор BGE имеет два режима работы: полноэкранный и с увеличением. Основная работа будет проходить во втором режиме.


    Этап 1. Outline

    Outline, или обводка - это линии, которые ограничивают контур объекта и все его детали. Такую обводку можно наблюдать практически в любом мультипликационном фильме. Она служит для отделения персонажа от фона и акцентирования внимания на деталях самого героя. Проще говоря - это нераскрашенный персонаж.

    В данной статье будем рисовать и анимировать некоего рыцаря. Он будет стоять на месте, и должен выполнять следующие движения:

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

    Б. Наносить удар.

    В. Использовать магию. (Если кому-то не нравится колдующий рыцарь, назовите его Палладин).

    Г. Ставить блок.

    Д. Попадать под влияние магии.

    Е. Получать удар.

    Ж. Как это ни грустно - умирать...

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

    Итак, расставим кадры: А - 2 (цикл), Б - 3, В - 3 (1 - подготовка, 2-3 - цикл), Г - 1, Д - 2 (цикл), Е - 2, Ж - 2.

    Итак, начнем рисовать. Включаем режим увеличения и опцию «показывать границы знакомест» (можно включить отображение знакомест яркостью - кому как больше нравится).

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

    Рисовать лучше в режиме OR.

    Вот такой рыцарь (рис. 1). Коряво, но зато примерно видно, где что расположено.

    Теперь начинаем улучшать рисунок, добиваясь правильных пропорций и расположения частей тела. Теперь работаем в режиме XOR (чтобы можно было ставить/удалять точки одной кнопкой мыши).

    Здесь я исправил руку, перерисовал ноги, чтобы казались полусогнутыми и заменил меч на топор (потому что так будет легче рисовать, т.к. топор пол туловища закрывает, зрелищнее анимировать, да и вообще - люблю я топоры. Это у меня от «Golden Axe» пошло). Еще я пририсовал ему рога - чтобы заполнить пустое пространство вверху спрайта, и чтобы повнушительней парень смотрелся (рис. 2).

    Ну и, наконец, готовая фигура (рис. 3). Проработаны руки, топор, рога, шлем и наплечники, и так, по мелочам…

    Чаще сохраняйтесь. Если хотите внести какие-нибудь радикальные изменения, и не уверены в результате - скопируйте весь спрайт в другое место экрана - потом посмотрите, какой из двух лучше.


    Этап 2. Frame by frame

    Есть два способа создания анимации - на основе ключевых кадров, и кадр за кадром. Ключевые кадры хороши, когда мы делаем крупного персонажа - тогда мы создаем его изображения в нужных нам позах, а промежуточные дорисовываем на «анимационном столе». Это такой столик, на который проецируется предыдущий и последующий кадры на котором, опираясь на них, удобно рисовать промежуточные кадры. Но для нашего случая такой метод непригоден, во-первых - из-за малого количества кадров, во-вторых - из-за размера: при «просвечивании» будет видна мешанина из пикселей, а в-третьих - BGE просто не поддерживает такую возможность. В общем - рисуем frame by frame.

    А. Просто «стояние». Для начала нужно определиться, что же он в этих кадрах будет делать. Ну, например, пусть он поигрывает топориком и сгибает колени.

    Создаем себе удобное рабочее место. Для этого переносим спрайт в левый верхний угол картинки (чтобы он отступал от верхней и левой границ экрана на знакоместо) копируем его рядом с самим собой, и копируем на второй экран (Paste+) в то же место. Т.е. новый кадр будет располагаться справа от исходного, и иметь на втором экране «под собой» копию исходного. Зачем это надо? Чтобы иметь возможность при рисовании в режиме увеличения контролировать качество, все время поглядывая на предыдущий кадр путем смены экранов (клавиша «L»).

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

    Выделяем («B») топор и переносим вниз на пиксель. Можно, в принципе, перерисовывать попиксельно (не так уж там и много пикселей), но если можно сэкономить время - почему бы и нет?

    На рис. 4 я перенес участок топора влево-вниз, чтобы показать выделение.

    Контролируя анимацию («L»), перерисовываем (смещаем) древко топора на 1 пиксель, обрабатываем руку (заменяя кое-где пиксели, чтобы казалось, что она шевельнулась) и меняем положение пальцев.

    Затем выделяем все туловище по коленки и переносим его вниз на пиксель. Смотрим нестыковки при помощи наших «волшебных» клавиш, и убираем их (нестыковки конечно). Рисуем коленки, стертые на предыдущем шаге, немного выступающими вперед. Контролируем качество.

    Ура! У нас есть первые два кадра (рис. 3 и 5)! Чувачок забавно пританцовывает на месте, готовясь дать кому-то в репу. Хотя, с другой стороны - может он просто хочет в туалет?

    Б. Удар! Нам нужно три кадра - замах (2) и удар (1). Добавляем еще один кадр в анимацию (как было описано выше).

    Нам нужно поднять и повернуть топор. Ничего не поделаешь, BGE не поддерживает поворот на произвольный угол, поэтому перерисовываем вручную. Можно попробовать его перенести выделением, а потом уже на месте - повернуть.

    Дорисовываем кадр. Мне пришлось слегка сместить топор вниз, потому что изначально я его неправильно расположил. Также я стер и заново нарисовал руку в новом положении, нарисовал открывшуюся часть брони сзади, переместил туловище на пиксель вниз, согнул колени и выдвинул левую ногу вперед (типа, для улучшения равновесия, хотя на самом деле - мне просто так захотелось). В конце я дорисовал открывшийся щит в левой руке персонажа (рис.6).

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

    И, наконец, мой любимый, - последний кадр. Все вспоминаем «Golden Axe»:) Удаляем (либо просто методом AND, либо познакоместово) большую часть картинки (рис. 8).

    После чего рисуем такую кривую (рис. 9) - «Путь топора». С первого раза может не получится - важно представить, как будет двигаться топор. Я переделывал кривую два раза. Тут помогает «контроль качества». Нормально нарисовать кривую я смог только когда понял, что топор в конце будет повернут плашмя.

    Дальше делаем стандартную прорисовку. Мне пришлось даже скопировать «вниз» (на второй экран) опорный кадр и передвинуть там верхнюю часть, чтобы было видно (при нажатии «L», естественно), как прорисовывать части тела, скрытые рукой и топором на прошлых кадрах (рис.10).

    С ударом разобрались. Теперь рыцарь может постоять за себя.

    В. Колдуем. Сначала надо придумать, что же, собственно, он будет делать? Насколько я помню по играм и паре-тройке книжек - колдуны делают умное лицо и что-то там бубнят. У нашего героя лицо скрыто за шлемом, да и сомневаюсь, что лицо рыцаря можно сделать умным, поэтому пусть он просто разведет руки. А «бубнение» попробуем показать движением головы.

    Копируем «опорный кадр» справа от готовых (если не влазит на экран - начинаем вторую линейку спрайтов).

    Итак, топор. Начинаем с его перемещения. Так как правая рука идет к нам, топор должен «сжиматься» по законам перспективы. Это сделаем просто - выделим правую часть лезвия и придвинем ее к левой, затем выделим новое топорище и переместим его влево, ближе к кисти руки (рис. 11). Проверяем… Надо все-таки увеличить по вертикали, и сделать правый край выше. Но это уже будем делать ручками. Заодно проработаем кисть руки, древко топора и саму руку, чтобы казалось, что она разворачивается («L»!). Получилось великолепно! То есть так, как и задумывалось (рис. 12).

    Теперь сделаем левую руку со щитом. Тут все просто - рисуем щит. Главное - попасть в размеры, чтобы зритель поверил, что его стало видно из-за топора, и не догадался, что его просто нагло пририсовали. Не забудьте и то, что буквально пару кадров назад он тоже был виден, так что имеет смысл проверить, как оно выглядит там.

    Ну и теперь - голова. Никто не произносит заклинания смотря прямо (во всяком случае, про таких героев не пишут книжки и не снимают кино). Тут надо либо поднять голову к небу, либо бубнить себе под нос. Что же предпочтет наш рыцарь?

    Перерисовываем голову, чтобы она смотрела вверх. Надо проконтролировать (какой клавишей?) реалистичность поворота - помните, что точка вращения находится не посередине черепа, а внизу, и смещена к затылку! Кстати, дальний рог необходимо переместить ниже и правее, ведь голова у нас находится в ракурсе, следовательно - подчиняется жестоким законам перспективы. Подкорректировав форму головы, получаем первый кадр «заклинания» (рис. 13).

    Копируем его, и создаем второй кадр. Просто и жестко - опускаем топор на пиксель (я это сделал вручную), щит - тоже на пиксель (я сначала опустил, а потом поднял… и так и так - хорошо, но противоположные движения обычно смотрятся лучше), голову смещаем вправо на пиксель, и - вуаля (рис. 14)!

    Правда, во время теста создается впечатления, что он читает рэп, поэтому добавим разных точечек/звездочек - мол магическая сила витает в воздухе.

    Г. Блок. Снова добавляем в конце один кадр, копируем туда самый первый, и дублируем последний кадр.

    Если при чтении заклинания рыцарь «раскрывался» на встречу магическим силам, то тут он должен «сжаться в комок», и закрыться от удара всеми доступными ему предметами. Реквизита мы ему выдали 2 штуки - щит и топор, ими он и попытается закрыться. Итак, начинаем!

    Сначала выделим все туловище от рогов до коленок, и сдвинем его на пиксель влево и пиксель вниз (как будто приседает). Затем выделяем голову и смещаем на пиксель вниз - втягивает в плечи (рис. 15). Контролируем результат…

    Выделяем лезвие топора, поворачиваем на 90 градусов против часовой стрелки, и ставим перед лицом. Вот что получилось (рис. 16).

    Жмем «L». Несколько нереалистично… Ну да и понятно - топор получился наклоненным в сторону героя… Надо повернуть его вручную. Смотрите: я слегка развернул лезвие, уменьшил дальнюю часть, увеличил ближнюю (перспектива!), приблизил нижнюю часть к герою, чтобы древко оказалось наклоненным вперед. Удалил предплечье и нарисовал заново, изменив положение локтя и плеча (наплечник остался на месте!). Нарисовал древко и переместил коленки вперед (в который уже раз!) (рис. 17).

    Далее - скопировал «вниз» кадр с персонажем, у которого открыт щит (второй кадр удара), и нарисовал щит здесь, ориентируясь на его положение в том кадре (не срисовал! Здесь щит приближен к телу, и слегка приподнят). Готово! Рыцарь «в домике» (рис. 18).

    Д. На нашего рыцаря покусились при помощи мощного заклинания. Ему должно стать плохо… А давайте нарисуем, что он шатается туда-сюда?

    Копируем и дублируем новый опорный кадр. Тело персонажа должно «расслабиться» и «осесть» под влиянием чар, поэтому - опустим голову и руки. Можно голову повернуть, чтобы было реалистичней, но мне лень, поэтому просто сдвинем ее на пиксель вниз. Топор же выделим и повернем чуток по часовой стрелке, чтобы потом древко располагалось параллельно земле. Также сместим его немного вниз и влево (рис. 19).

    Далее - рисуем древко горизонтально (не забываем сместить его немного назад), меняем положение руки, дорисовываем детали… После контроля обнаружилось вот что: не похоже, что ему плохо. Похоже, что он просто расслабился. Самым простым выходом в этом случае (как бы ни было сложно) все-таки повернуть голову вперед. Оказалось, все не так страшно - меняем несколько пикселей, и голова реалистично понурилась (рис. 20).

    Дублируем готовый кадр. Теперь надо сделать наклон вперед… К сожалению, в BGE мы не можем искажать выделение, но можно поступить хитро: мысленно разделим фигуру по вертикали на несколько частей и последовательно сдвинем их. Выделяем всего персонажа сверху по коленки, сдвигаем на пиксель вправо, затем полученную картинку выделяем по кисть руки и сдвигаем вправо, затем - по грудь и т.д. (рис. 21).

    Видно, что топор тоже искажен. Копируем в предыдущем кадре лезвие и вставляем в этот, сдвинув вправо на пиксель. Исправляем мелкие неточности, контролируем полученные кадры и добавляем точечки/звездочки, символизирующие magic power (рис. 22).

    Е. Быдыщщ! Наш герой получил в репу! Что же с ним при этом происходит? В реальной жизни полученный удар распространяется волной по телу, т.е., например, если пинок пришелся в грудь, то сначала смещается грудь, затем талия, голова, плечи, затем, бедра, предплечья, руки и т.д. Об этом необходимо помнить, когда мы делаем крупную многокадровую анимацию увечий. У нас же - всего два кадра и маленький спрайтик, но, тем не менее, выкидывать из головы это правило мы не будем. Во всяком случае - постараемся.

    А пока - копируем и дублируем исходный кадр.

    Решим, куда наш герой будет «получать»… Голова - самое безопасное место для рыцаря, поэтому - туда и вдарим! Сделаем просто - скопируем голову и развернем ее зеркально вокруг вертикальной оси. Затем - прилепим ее обратно, сдвинув назад.

    Здесь уже надо серьезно поработать - во-первых слегка развернуть голову в сторону зрителя (сдвинув пиксели лица вправо), иначе она не сможет повернуться из-за наплечников, которые тоже нужно развернуть, как ближний, так и дальний. Также нужно сдвинуть грудь влево (три пикселя). После контроля видно, что не сильно реалистично смотрится (рис. 23). Попробуем выделить всю верхнюю часть по грудь, и сместить влево… Вот так - нормально! Дублируем этот кадр.

    Со вторым кадром будет проще - смещаем тело по коленки вниз. Неплохо также сделать, чтобы он раскидывал руки - ко второму кадру удар уже должен до них дойти. Вспоминаем, что у нас уже есть хорошие «раскинутые руки» - в кадре «применения магии». Возвращаемся туда, копируем руки с топором и щитом и вставляем в наш кадр! Остается только убрать огрехи, проконтролировать «L»… В общем, убедится, что все красиво и органично… Я еще нарисовал слегка приподнятый носок левой ступни… Захотелось (рис. 24).

    И последний штрих - на первом кадре рисуем мультяшный «БЫДЫЩЩ!» (рис. 25).

    Ж. Ё-моё… Пришло время нашему герою умирать… Умирание - сложнее всего рисовать. Когда дело доходит до этого - уже привязываешься к герою, и как-то жалко его убивать (если это, конечно, не вампир, фашист или прочая мразь, которую «мочить» даже приятно).

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

    Тут есть одна сложность - у нас слишком мало места, чтобы нарисовать нормальное падение тела, поэтому будем делать это несколько утрированно/мультяшно. Приступим.

    Сперва выделим топор и сместим его на пиксель вниз (воткнем в землю). Затем развернем обратно голову. Она получится несколько выступающей вперед, но исправлять не надо - так более трагично. Затем выделяем голову и наплечники и смещаем их вправо-вниз (как будто тело сильно наклонилось вперед) (рис. 26).

    Затем дорисовываем руку в новом положении, передвигаем видимую ногу, исправляем наплечники и грудь, дорисовываем руку со щитом, и левое колено, высовывающееся из-за топора. Все время смотрим предыдущий кадр, чтобы все выглядело правильно и двигалось реально (рис. 27).

    Дублируем кадр. Удаляем из него все, кроме топора, головы и предплечья. Берем голову, поворачиваем ее чуток по часовой стрелке и кладем на землю прямо перед топором. Здесь можно не рисовать «перспективные» рога, ведь мертвая голова может лечь как угодно (рис. 28).

    Теперь обрабатываем - исправляем топор, рога и голову. Между рогами, на заднем плане, рисуем упавший щит, ногу сдвигаем на пиксель назад и сильнее сгибаем в области плюсны. Руку, держащую топор перерисовываем так, чтобы она смотрелась естественно (поворачиваем вперед вокруг оси запястья). Кисть руки тоже слегка меняем. Все лишние пиксели удаляем или (внизу) закрашиваем черным. В принципе готово, но я еще  сдвинул весь кадр на пиксель назад, по-моему, так смотрится более динамично (рис. 29).

    Все, outline анимация готова. Можно нажать на «Plaу» и насладится проделанной работой.


    Этап 3. Раскраска

    Это лучше всего делать в режиме XOR, попутно исправляя недостатки, которые мы просмотрели на предыдущих этапах. Чтобы точнее их выявить, имеет смысл перенести все спрайты в Sprite Master (или другую программу) и просмотреть анимацию целиком.

    Для начала определимся, где будут тени. Откуда падает свет? Допустим, он падает справа-спереди. Значит, тени рисуем вот где:

    задняя часть наплечника;

    задняя часть плеча;

    передний край локтя;

    задняя часть предплечья;

    затылок шлема;

    под шлемом;

    на левой части груди, под наплечником;

    на боку (справа от локтя);

    на правой руке (если влезет);

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

    Определились? Теперь рисуем эти тени на каждом спрайте (рис. 30). Это очень быстро! Главное - следить, чтобы не убрались детали (такое происходит, когда шахматка подходит к какой-нибудь линии с обеих сторон). Как бы то ни было - все недочеты мы уберем потом. «Оттененные» спрайты на рис. 31, я удалил опорные кадры, чтобы не загромождать картинку.

    http://abzac.retropc.ru/images/i26-1bit-02.png

    Остался последний штрих - нанесение черных теней, «висячих пикселей», «эмуляция антиалиасинга (т.е. сглаживания)» и исправление мелких недочетов.

    Черные тени надо делать с самой темной стороны тени. Тавтология, конечно… В общем, рисуем их так, чтобы объем фигуры стал еще более выраженным.

    «Висячие пиксели» ставим так, чтобы тень плавно переходила в белый цвет. Т.е., имеет смысл их поставить на наплечнике, в некоторых кадрах на груди, животе и т.д.

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

    Вот простейший пример. Есть три картинки с логотипом одного чувака (рис. 32). В первом варианте можно видеть пиксели во всей их красе. Смотрится плохо, и четко видны лесенки, особенно на прямых линиях. Во втором варианте я просто удалил крайние пиксели в местах излома - смотрится сглажено, гораздо лучше, чем в первом варианте. Линии здесь выглядят более тонкими… В третьем варианте я, наоборот, добавил пиксели в местах излома, с обеих сторон. Результат аналогичный предыдущему, но линии выглядят более толстыми. Оба этих эффекта мы должны (и обязаны!) использовать в наших спрайтах, например - на рогах, на топоре и т.д.

    Ну, а удаление недочетов - это уж на ваше усмотрение. Все, что режет глаз, мигает при анимации или просто не нравится - безжалостно уничтожается. В итоге получаются высококачественные спрайты (рис. 33), которые не стыдно отдать любому программисту для игры любой степени гениальности.

    http://abzac.retropc.ru/images/i26-1bit-04.png


    Заключение

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

    Пожалуйста, любые, комментарии, вопросы и пожелания отправляйте на мой e-mail: Surfin_Bird@tut.by или на форум zx.pk.ru

    Мне будет приятно узнать ваше мнение. До встречи в новых играх!

    © 2004-2013 Perspective group