15.给节点添加动作上集
团队博客:Optional Swift Blog
个人博客:Colourful Code
在场景中随心所欲的绘制精灵固然不错,但这依旧不可阻止它是一张静态图片的命运,这不是游戏!为了提高游戏的可玩性,游戏应该允许我们移动精灵从某位置到另外一个位置,稍稍加上一些逻辑性更佳。Sprite Kit
使用动画的主要机制就是Action
。到目前为主想必你也见识和了解了一些动作,现在是时候更加深入地探索动作是怎样构建和执行的!
首先明确Action
是一个对象,它定义了一系列变化能够作用于场景。大多数情况下是这样的,动作将changes
应用到节点上,让其(节点)来执行它(动作)。打个比方,如果你要移动一个精灵横跨屏幕(从屏幕组左侧移动到屏幕最右侧),你首先需要创建一个move action
然后告诉这个精灵去run
这个动作。之后就是Sprite Kit
的事情了,执行这个动画(让节点从一个位置移动另外一个位置),直到整个动作完成才算结束。
动作是 Self-Contained 对象
每一个动作都是一个不透明的对象,来描述你要对场景做出的改变。所有动作都是由SKAction
来实现;至于其他可见的子类,抱歉,没有!要知道,不管你要构造(初始化)一个什么类型的动作,都必须使用class method
,类方法往往都是那样用的:SKAction.XXX
。以下是动作最常被应用的地方:
- 改变节点的位置和方向
- 改变节点的大小
- 改变节点透明度
- 通过一组纹理有顺序的改变节点的内容,如此就感觉在播放动画
- 为节点着色
- 播放简短的声音
- 将一个节点从节点数中移除
- 调用闭包
- 由selector或者某个对象调用
当我们创建了一个动作之后,例如let myAction:SKAction?
,也许一开始我想让它作为移动动作,过了一会我想它变成旋转动作,这是被允许的。专业术语来说:动作的类型是可以被改变的。
动作的类型:
首先你跳转到SKAction文件中,往下拉你会发现extension SKAction{...}
中定义了灰常多的动作,有移动、放大、旋转等等,而它们的共同点就是都是类方法。Maybe类型就是在说Action是移动类呢?还是旋转类呢?还是….
Node Run Actions
动作“纪律性”很强,只有当你告诉节点去执行它,该动作才会被执行,ps:它可不会创建完毕就自娱自乐自己动起来。最简单的执行方式是调用node的runAction:
方法,代码如下:
let moveNodeUp = SKAction.moveByX(0.0, y: 100.0, duration: 1.0)
rocketNode.runAction(moveNodeUp)
首先我们定义了一个move
的动作,它有个执行时间限定:1.0秒。因此告诉rocketNode
节点:请在1秒内做完这个移动动作,x方向不变,y方向增加100。执行完毕,该动作就从该节点上移除。
假如说当前已经有一个动作正在执行了,你又定义了一个动作并且添加给节点,根据先来后到原则,后来的必须等待前面动作执行完再轮到它,不过后面的高级篇会有惊喜。
顺便提及,只要一个节点正在执行动作,那么节点中hasActions
属性必定是true
。
取消正在执行的动作
想要取消正在执行的动作,我们只需要调用removeAllActions
方法即可。一旦调用,该节点上的所有动作顷刻间就被移除。这里要提及一个假设,倘若当前正在执行一个动作,时间为10秒,当执行到5秒时,我突然移除了,那么会怎样?答案是前面做完的就做完了,后面没做的肯定不让做!
动作执行完毕后收到Callback
这里要谈及runAction:completion
方法了,你会发现它和runAction
的区别就在于一个completion
闭包,前者是动作执行完毕,再调用执行给定的completion
闭包。假如动作执行到一半就被移除,不好意思,这个闭包不会被调用了!