GKComponentSystem在更新周期中没有组件

时间:2016-03-19 23:09:36

标签: ios sprite-kit gameplay-kit

我正在玩SpriteKit和GameplayKit。但是当我运行我的代码时,我期待四处游荡的精灵什么也没做。

我用lldb打印出一些值,这是打印输出:

(lldb) po agentSystem.components
▿ 1 elements
  - [0] : <GKAgent2D: 0x7fc1b8e55ff0>

(lldb) po agentSystem.components
0 elements

第一个是在调用addComponentWithEntity:之后打印的。 第二个是用update:方法打印的。

当然这一直是精灵没有徘徊的原因,但是可能导致问题的原因是什么?

我甚至查看并使用了Apple的sample code for Agents中的代码,但这似乎仍无法解决问题。

这是我的场景代码:

import SpriteKit
import GameplayKit

class GameScene: SKScene
{
    //  MARK: - Properties

    let agentSystem = GKComponentSystem(componentClass: GKAgent2D.self)

    var lastUpdateTimeInterval: CFTimeInterval = 0.0


    //  MARK: - Scene Lifecycle

    override func didMoveToView(view: SKView)
    {
        //  Wave enemy
        let agent = GKAgent2D()
        agent.behavior = GKBehavior(goal: GKGoal(toWander: 10), weight: 100)

        let waveEnemy = WaveEnemy()
        waveEnemy.addComponent(agent)

        agentSystem.addComponentWithEntity(waveEnemy)

        let waveSprite = waveEnemy.componentForClass(VisualComponent)!.spriteNode
        waveSprite.position = CGPoint(x: frame.size.width * 0.5, y: frame.size.height * 0.5)

        addChild(waveSprite)
    }

    override func update(currentTime: CFTimeInterval)
    {
        if lastUpdateTimeInterval == 0
        {
            lastUpdateTimeInterval = currentTime
        }

        let deltaTime: CFTimeInterval = currentTime - lastUpdateTimeInterval
        lastUpdateTimeInterval = currentTime

        //  Update component system
        agentSystem.updateWithDeltaTime(deltaTime)
    }
}

1 个答案:

答案 0 :(得分:2)

我有类似的问题。事实证明我的GKEntity有一个弱引用它导致它自动从GKComponentSystem中删除。

在您的情况下,您正在创建需要保留的waveEnemy。您可以将它存储在场景中的数组中。

class GameScene: SKScene {

    ...

    var enemies = [GKEntity]()

    override func didMoveToView(view: SKView) {
        ...
        let waveEnemy = WaveEnemy()
        waveEnemy.addComponent(agent)
        enemies.append(waveEnemy) // Creates a strong reference for waveEnemy
        ...
    }

    ...

}