2016-07-24 63 views
3

我有一個空閒的玩家動畫,我想在一些動畫之間做一個平滑的過渡。閒置的動畫是默認的動畫,從那個轉換我想能夠切換到另一個狀態(讓我們說打架),然後回到閒置狀態。對於閒置的角色動畫的代碼是目前這樣的:SpriteKit動畫之間的適當轉換

self.addChild(playerAnimation) 
playerAnimation.runAction(SKAction.repeatActionForever(
      SKAction.animateWithTextures(playerAnimationManager.idleManAnimation.textureArray, timePerFrame: 0.1))) 

現在,這個計劃永遠繼續下去,現在,但我需要攔截,並在此基礎之上添加一個新的動畫(這是相同的角色,處於新的狀態)。我在想,我應該停止閒置的動畫,切換到新的,然後在完成時回到空閒狀態,但我不相信這是鏈接動畫的最佳方式,我還沒有真正找到一個很好的資源來解釋如何去做吧。

有什麼建議嗎?謝謝 !

回答

1

根據你的紋理數組的多短,你可能可以做到這一點。

我會嘗試我如何使用objective C和使用Swift

  1. 首先使屬性或變量,可以通過在這個類文件中的任何子程序調用看到沒有代碼來解釋。它應該是Boolean並且應該設置爲NO。你可以稱它爲idleFlag

  2. 接下來製作一個方法,將動畫更改爲對抗模式。這種變化將通過刪除空閒動畫並將其替換爲拼圖動畫來實現。該方法也設置爲idleFlagNO。我們將方法稱爲「beginFightAnim

  3. 最後,在您的repeatActionForEver空閒動畫中,緊接着您的animateWithTextures動畫,添加runBlock動畫。在這個模塊中定義一個靜態變量(一個將在塊的調用中被記住的變量)並將其增加+1,添加一個「if語句」,看起來像這樣 - >if (my_static_var == number_of_frames_in_texture_animations && idleFlag)。而在「if語句」靜態變量設置爲0,並呼籲「beginFightAnim

這一切後,你必須做的改變動畫設置idleFlagYES

希望它的作品!

如果您有任何問題,請在下面評論。

+0

這聽起來的確是一個合理的解決方案。讓我嘗試一下,看看它是如何工作的,謝謝! – Spyros

0

我想做一系列的例子,使它更容易理解這件事。假設你有你的節點稱爲playerAnimation,與如果你想在實時攔截動畫知道什麼框架在那一瞬間運行,你可以做,你必須

player-idle1.png 
player-idle2.png 
player-idle3.png 
... 

一個plist中的典型atlasc:

override func update(currentTime: CFTimeInterval) { 
    if String(playerAnimation.texture).rangeOfString("player-idle") != nil { 
     print(String(playerAnimation.texture)) 
    } 
} 

此時,在您爲動作分配「鑰匙」(withKey:"idleAnimation")後,您可以在開始下一個動畫時停止特定的空閒動作。

的另一個好處是建立一個結構,以每次知道您的播放器狀態,並在每次啓動一個新的動作或動畫時間修改這個變量:

enum PlayerStatus: Int { 
    case Idle = 1 
    case Fight = 2 
    case Run = 3 
    case Jump = 4 
    case Die = 5 
    ... 
} 

var currentStatus: PlayerStatus! 
+0

這是否適合您?上次我在animateWithTextures事件中嘗試從sprite獲取紋理時,它會返回原始紋理,而不是動畫,我最終編寫了自己的操作來處理這個問題。 – Knight0fDragon

+0

是的,試圖在發佈之前保證安全。我使用我的文件夾地圖集創建的atlasc與我的所有框架,當您構建應用程序並在內容包中搜索時,您會發現atlasc。我可以在動畫過程中一步一步地看到所有的幀名,所以現在我不知道關於它的問題。 –

+0

幀名不是我所關心的,它獲得了您使用的實際紋理,它實際上是打印idle1,idle2,idle3..etc? – Knight0fDragon