2016-07-25 101 views
0

我有一個GKAgent2D,用於控制向目的地移動的SKNode敵人的移動。當場景暫停時,GameplayKit不會暫停

當我暫停代理進入的SKScene時,敵人節點似乎繼續移動而不顯示這種移動。所有可見的動作停止(敵人停止移動)。如果我等待5秒鐘,然後解除暫停場景,就好像敵人從未停止移動,並且它會彈出到原本沒有暫停場景的地方,並且它會繼續像往常一樣從該點移開。

我查看了Apple爲用戶創建的示例演示遊戲,名爲DemoBot,它們通過簡單地將update:(NSTimeInterval *)currentTime方法與返回值相結合來實現類似於我正在使用的「修復」。這裏是我的代碼目前的樣子:

- (void)update:(NSTimeInterval)currentTime { 

    [super update:currentTime]; 

    if (_lastUpdateTime == 0) _lastUpdateTime = currentTime; 

    float delta = currentTime - _lastUpdateTime; 
    _lastUpdateTime = currentTime; 

    // Stop updating if the `worldNode` is paused. 
    if (worldNode.paused) { return }; 

    for (GKComponentSystem *componentSystem in componentSystems) { 
     [componentSystem updateWithDeltaTime:deltaTime]; 
    } 

} 

但我無法深入瞭解,並找出他們在做什麼其他確保GKGoal目標是現行生效的右停止時暫停發生。我甚至記錄了agentDidUpdate方法,當我暫停場景時它會停止發射,所以我真的不知道它如何繼續移動。

如果有人知道答案,請讓我知道。謝謝!

更新:我甚至嘗試暫停已制訂的目標移動的各個節點:

- (void)didPauseScene { 

    worldNode.paused = YES; 

    /* 
    <<Animations>> 
    */ 

    for (OEnemy *enemy /*my subclass*/ in enemyArray) { 
     enemy.paused = YES; 
    } 
} 

但是,這仍然沒有持續,因爲他們會不暫停現場停止GKGoals ..

UPDATE 2

:即停止劑冷字面上除去劑系統目的的唯一解決方案

這是一個非常難過的解決方案,因爲我希望有一種更優雅/適當的方式來停止目標,而不是完全從場景中刪除所有內容。然而,另一個問題是即使在這種情況下,如果沒有發生暫停,重置暫停後暫停的目標會產生相同的跳到他們所處位置的問題。

+0

那是code * your *'update'方法還是Apple's?我們需要看到你的幫助。 – andyvn22

+0

我已更新我的帖子來回答你的問題。它是*我的*代碼。 –

+0

Sprite Kit暫停已被竊聽,我將猜測同一個bug在遊戲玩法套件中進行。如果您的場景暫停並且未被暫停,那麼您的所有孩子都會暫停並取消暫停。覆蓋場景中已暫停的變量,並讓setter未設置屬性的值 – Knight0fDragon

回答

1

如果另一個目標沒有改變它,代理將繼續沿着它們的最後已知有效速度。如果您希望代理停止,您可以嘗試使用GKGoal的goalToReachTargetSpeed :.

0

對於那些GKGoal goalToReachTargetSpeed:不起作用。

從實體中刪除我的MovementComponent工作對我來說:

let movementComponent = entity.component(ofType: MovementComponent.self)! 
entity.removeComponent(ofType: MovementComponent.self) 
componentSystem.removeComponent(moveComponent) 

當你恢復你的遊戲,請確保您創建你的運動組件的一個新實例並再次將其添加到實體:

let movementComponent = MovementComponent() 
entity.addComponent(movementComponent) 
componentSystem.addComponent(moveComponent) 

當使用GKComponentSystem更新移動部件時,還要確保相應地移除和添加移動部件。