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

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

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值