Swift GameplayKit暂停GKAgent而不暂停场景

时间:2016-02-23 14:26:02

标签: swift agents

暂停GKAgent的最佳方法是什么?

我的游戏在某些关卡中使用了一些代理,我需要在游戏暂停/ gameOver时暂停它们。

我不会在游戏中暂停整个SKScene而是暂停worldNode,因为即使游戏暂停,它也能让我更灵活地显示spriteKit。

我正在使用

 updateWithDeltaTime...

更新我的代理行为并相应地移动它们的方法。

我考虑过停止更新方法,但代理仍然会移动到他们最后一次知道的GKGoal。

我到目前为止找到的最佳解决方案是在游戏暂停时将代理速度/ maxSpeed设置为0。我在这里遇到的问题是,在恢复时,将速度重置为代理程序之前的速度有点痛苦,尤其是在使用具有自己行为的多个代理程序时。它们似乎也消失了,而不是在恢复时重新出现。

据我所知,没有agent.paused方法或类似内容。

什么是暂停代理而不暂停SKScene本身的好方法?

感谢您提供任何帮助和建议。

2 个答案:

答案 0 :(得分:1)

我想我现在找到了一个似乎有用的解决方案。

首先,我暂停游戏暂停时的udapteDeltaMethods。

我要查看我的所有实体并将代理委托设置为nil

  for entity in baseScene.entityManager.entities {
        if let soldier = entity as? BossWorld3Soldiers {
            soldier.agentComponent.delegate = nil
        }
    }

当我恢复比赛时,我称之为

  for entity in baseScene.entityManager.entities {
        if let soldier = entity as? BossWorld3Soldiers {
            let action1 = SKAction.waitForDuration(0.5)
            let action2 = SKAction.runBlock({ soldier.resetAgentDelegate() })
            baseScene.runAction(SKAction.sequence([action1, action2]))
        }
    }

resetAgentDelegate()方法只是我实体类中的一种方便方法,用于重置代理委托

 func resetAgentDelegate() {
    self.agentComponent.delegate = self
 }

我在重置代理委托之前稍微延迟了一段时间,因为没有延迟,enties / agent似乎在恢复GKGoals之前会进行大量跳跃/消失几秒钟。

答案 1 :(得分:0)

您是否已将行if worldNode.paused { return }放入GameScene的update

这对我有用

<强> GameScene:

override func update(currentTime: CFTimeInterval) {

        super.update(currentTime)

        // Don't perform any updates if the scene isn't in a view.
        guard view != nil else { return }

        let deltaTime = currentTime - lastUpdateTimeInterval
        lastUpdateTimeInterval = currentTime

        /*
        Don't evaluate any updates if the `worldNode` is paused.
        Pausing a subsection of the node tree allows the `camera`
        and `overlay` nodes to remain interactive.
        */
        if worldNode.paused { return }

        // Don't perform any updates if the scene isn't in a view.
        guard entityManagerGame != nil else { return }

        entityManagerGame.update(deltaTime)

    }