Создание реалистичных игр для iPhone с помощью cocos2d

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

Эта статья — одна из серии статей, которые рассказывают о том, как создавать игры для iPhone на примере игры под названием ”Семь мостов”. Чтобы вспомнить о чем идет речь, прочитайте еще раз первую статью из серии, которая называется “Проектирование игр для iPhone” и посмотрите исходный код в Seven Bridges GitHub.

Эта статья познакомит вас с основами анимации. Мы рассмотрим действия в cocos2d, а также узнаем, как объединить их для создания сложных эффектов.

Простые действия

Все основные строительные блоки в cocos2d, такие как изображения и слои, являются производными от CCNode. Узлы взаимодействуют с действиями, которые выходят  в CCAction для создания движения на экране.

Основные действия cocos2d могут:

Мы начнем с простого действия CCBlink. В игре “Семь мостов” не используются мгновенные действия, но они одни из самых простых для понимания и выполнения.

Прежде чем мы сможем начать использовать любое действие, нам нужен узел. Мы начнем с PlayerNode из нашего примера.

Игровой узел очень прост по своей сути. Он показывает игровой спрайт, обрабатывает движения и анимацию игрока по экрану. PlayerNode фактически не относится к CCNode, но содержит CCSprite, который представляет собой единый образ и распространяет CCNode. Отделение игрового объекта от фактического изображения игрока, делает игровой объект более гибким и пластичным.

Нашему игровому узлу нужны цвета и LayerManagerLayerManager — это вспомогательный объект игры “Семь мостов”, который позволяет игровому узлу взаимодействовать с окружающим игровым миром. Вам не нужно писать код для объектов с LayerManager, но у вас есть возможность добавить стандартный код.

Давайте создадим нового игрока и поместим его на экран.

 PlayerNode* player = [[PlayerNode alloc] initWithColor:cBlack layerMgr:_layerMgr]; player.player.position = ccp(100, 100); 

PlayerNode предлагает указатель спрайта и использует LayerManager, чтобы добавить спрайт на экран. Это делает спрайт доступным, как свойство с именем player, и свойство с именем position. Полный код для создания LayerManager в LevelLayer.

Мерцающие действия могут выполняться непосредственно на игровом спрайте, потому что спрайты являются CCNode объектами, которые реализуют runAction метод. Вот как это работает:

 CCBlink* blink = [CCBlink actionWithDuration:10 blinks:5]; [player.player runAction:blink]; 

Большинство действий определяет статический actionWithDuration метод, который создает новый объект действия. CCBlink принимает продолжительность и количество раз, которое он должен мигать. Мы можем применить любые действия, которые мы только захотим для этого узла только путем передачи на runAction.

Запуск нескольких действий

В последней версии игры “Семь мостов” появляются телепорты. Когда игроки пользуются телепортом, это выглядит так, как — будто они в него прыгают.  Чтобы создать этот эффект, мы объединим три действия: rotate, fade и scale. Каждое из этих действий по отдельности занимает немного времени, но мы сделаем так, чтобы они работали одновременно. Соедините все три действия вмести и вы увидите, как игрок вращается и исчезает в телепорте, как-будто он уменьшается в размере (опять же, см. LevelLayer.mm).

 [player.player runAction:[CCRotateBy actionWithDuration:0.5 angle:360]]; [player.player runAction:[CCFadeTo actionWithDuration:0.5 opacity:0.0]]; [player.player runAction:[CCScaleTo actionWithDuration:0.5 scale:0.25]]; 

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

CCFadeTo изменяет непрозрачность игрока на указанное значение. Мы хотим, чтобы игрок полностью исчез, поэтому мы выставляем значение на 0.0.

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

Продолжительность этих действий равна CCBlink. При указании продолжительности для каждого действия, мы указываем, что все три должны начаться одновременно. Результат выглядит следующим образом:

Игра “Семь мостов” – прыжок в телепорт от Зака Гросбарта на Vimeo.

Объединение действий в последовательность

Вращение и выцветание — это здорово, но давайте рассмотрим изменение размеров спрайта. В нашем примере есть карта “Дома и цвета”, на которой представлены дома, которые игрок может посетить. Когда игрок заходит в него, дом становится серым.

Дома появляются благодаря объекту, похожему на PlayerNode, под названием HouseNode. Каждый из этих объектов является вспомогательным, который содержит спрайт. PlayerNode предоставляет игроку спрайт в свойстве с именем player, и HouseNode предоставляет спрайт дома в свойстве с именем house.

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

В предыдущем примере к игроку применялись одновременно три действия: вращение, уменьшение в размере, исчезновение. Для дома нам нужно использовать большое количество действий. Для этого мы будем использовать новый объект с именем CCSequence. Который объединит три действия, выполняемые один за одним.

Мы начнем с создания наших действий (HouseNode.mm) :

 float scale = 1.0; CCEaseExponentialIn* flipHalf = [CCEaseExponentialIn actionWithAction:[CCActionTween actionWithDuration:0.25 key:@"scaleX" from:-scale to:0.0]]; CCEaseExponentialOut* flipRemainingHalf = [CCEaseExponentialOut actionWithAction:[CCActionTween actionWithDuration:0.25 key:@"scaleX" from:0.0 to:scale]]; 

Cocos2d предоставляет ряд специальных действий, которые делают возможным построение промежуточных изображений. Все они являются производными от CCEase. Эти действия обеспечивают простой доступ к некоторым из основных анимационных движений, с помощью которых объекты естественно переходят друг в друга, как слайды. Эти же методы используются в сети для анимации  JavaScript.

CCEaseExponentialIn и CCEaseExponentialOut обеспечивают естественное движение в и из различных позиций, используя экспоненциальную кривую. Эта анимация включает в себя и CCTween, который может изменить любое свойство узла. Мы изменяем scaleX свойство, чтобы начать переворот.

Здесь очень много математики, но основные понятия просты для понимания. Благодаря пер …

Если вы хотите прочитать полностью статью, посетите сайт наших спонсоров

Comments are closed.