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

發佈了75 篇原創文章 · 獲贊 70 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章