15.精灵进阶之给节点添加动作

来源:互联网 发布:淘宝总公司投诉电话 编辑:程序博客网 时间:2024/05/01 07:17

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:它可不会创建完毕就自娱自乐自己动起来。最简单的执行方式是调用noderunAction:方法,代码如下:

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闭包。假如动作执行到一半就被移除,不好意思,这个闭包不会被调用了!

1 0
原创粉丝点击