2016-02-14 27 views
0

我花了一些時間尋找到的排隊,甚至閱讀本http://www.raywenderlich.com/79149/grand-central-dispatch-tutorial-swift-part-1這是有幫助的各種方法,但我覺得我越讀入GCD,更多的困惑和不確定我成爲自己的關於正確的方法。有人能給我一個建議嗎?在我的雨燕遊戲如何排隊事件

我的目標是這樣的:我在做一個遊戲,玩家可以失去健康,由於一些遊戲事件。玩家在頂部有一個健康欄(心臟),每當他們被擊中時,我都會讓心臟在0.1秒的時間間隔內向上飛行。我探索某種隊列的原因是,在某些情況下,玩家可能會非常迅速地失去健康,以至於事件的發生速度比動畫快。因此,它有時會「跳過」心臟,因爲它無法跟上健康損失。這只是在一些傷害較高的地方。即使沒有動畫,它仍然偶爾發生,雖然我覺得有點少。

所以我想我能做的是排隊等待每一次健康損失事件,這樣就會強制事件順序進行,但是我沒有成功(它仍然超速並跳過了心臟,第10顆心,第8顆心和第5顆,然後它說遊戲結束了,我想慢下來,把心取出,以便看到它們消失)。

這是我嘗試代碼:

 dispatch_async(dispatch_get_main_queue(), { 
      heartToRemove!.runAction(
       SKAction.sequence([SKAction.moveByX(0, y:50, duration:0.1), 
        SKAction.runBlock 
        { 
         heartToRemove!.removeFromParent() 
         self.hearts.removeLast() 
        }])) 
       }) 

這樣的想法是運行在隊列3個動作: 首先,移動心臟了。接下來,從父視覺刪除(因此它消失關閉遊戲不僅僅是的正上方),最後從SKNodes(心)的數組中刪除它,以便下一次心臟被移除,它進入在未來的一如果這是合理的,那麼線不是一回事。

我也試過dispatch_sync但只是凍結了我的比賽,我認爲是錯誤的。還有其他建議嗎?

謝謝你這麼多的時間!

回答

1

您可以使用項目的數量在你的壁爐陣列,以抵消動畫時間

類似:

let wait = SKAction.waitForDuration(0.1 * NSTimeInterval(hearts.count-1)) 
    let move = SKAction.moveByX(0, y:50, duration:0.1) 
    let remove = SKAction.runBlock() 
       { 
        heartToRemove!.removeFromParent() 
        self.hearts.removeLast() 
       }   
    heartToRemove!.runAction(SKAction.sequence([ wait, move, remove ])) 

然後,你將不必擔心排隊的行動。