SKAction — динамика в игре — Часть 6

Рисование спрайтов на сцене, это круто, но статический спрайт это всего лишь картинка, а не игра. Чтобы создать геймплей, вы должны уметь двигать спрайты по экрану и выполнять другие различные действия. В Sprite Kit для этого есть специальный механизм SKAction. В предыдущих частях вы уже видели какую-то часть этого механизма. Теперь мы изучим систему SKAction гораздо глубже. Поехали.

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

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

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

Действие SKAction могжет быть либо мгновенным или не мгновенным: 
— Мгновенное действие начинается и завершается в одном кадре анимации. Например, удаление спрайта, потому что узел не может быть удален частично ))).

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

Запуск SKAction в спрайте
SKAction выполняется когда вы говорите спрайту запустить его. Самый простой способ запустить SKAction является вызов метода runAction у спрайта. Следующий код создает SKAction движения спрайта и потом запускается спрайтом rocketNode:

SKAction *moveNodeUp = [SKAction moveByX:0.0 y:100.0 duration:1.0];
[rocketNode runAction: moveNodeUp];

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

Поскольку обработка действий привязана к сцене, действия обрабатываются только тогда, когда спрайт является частью дерева узлов, приведенной сцены. Вы можете воспользоваться этой ситуацией, заранее создав спрайт-узел, привязать к нему SKAction, и ждать нужного вам момента, чтобы добавить спрайт на сцену. Когда узел добавляется на сцену, он начинает выполнять свои SKAction немедленно. Если спрайт выполняет любое действие, его свойство hasActions возвращает YES.

Отмена выполнения SKAction
Для отмены выполнения SKAction в спрайте, вызовите у спрайта метод removeAllActions. Все действия будут немедленно удалены из спрайта. Если в спрайте были не моментальные SKAction, все изменения которые уже внесенны в спрайт, остаются нетронутыми и дальнейшие изменения не выполняются.

Callback при завершении SKAction
Метод runAction:completion: идентичен методу runAction: но после завершения действия вызывается блок. Если действие удаляется до завершения, обратный вызов завершения никогда не вызывается.

В следующей части, опишу как запускать неколько SKAction параллельно или последовательно и как управлять всем этим.

Если, у тебя появляются вопросы пиши в комментах

  • Pavel

    Жаль, что это все теория…