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
閉包。假如動作執行到一半就被移除,不好意思,這個閉包不會被調用了!