GKEntity和状态机

时间:2017-01-05 16:35:16

标签: sprite-kit swift3 entity components gameplay-kit

我正在使用SpriteKit和GameplayKit处理一个小项目。这是我第一次使用实体/组件系统,而且我非常喜欢它。但是现在,我需要跟踪我的实体状态(产卵,正常,移除),以便他们在产卵阶段不进行交互(可能包括也可能不包括动画的动作)事情)和他们的删除阶段。

到目前为止,我已经创建了一个EntityStateComponent,它实现了具有不同状态的GKStateMachine,并且因为不需要每帧更新,所以它并不复杂。问题是这个状态与组件相关的实体相关性更多,我想知道从GKEntity继承并在那里添加状态机而不是在组件中是否有意义。

你的想法?

PS:我已经从GKEntity进行了子类化,只是为了创建一个方便的init()来创建所有组件

1 个答案:

答案 0 :(得分:2)

你是对的,国家是实体相关的,而不是与组件相关的。将状态机直接放入实体,或创建所有实体继承的实体基类。

class VisualEntityBase : GKEntity, VisualEntity {
    var node: SKSpriteNode!
    var stateMachine: GKStateMachine!


    // MARK: Initialization

    init(imageNamed: String, atStartPosition: CGPoint) {
        super.init()

        // Initialise Texture
        let texture = SKTexture(imageNamed: imageNamed)

        // Initialise Node
        self.node = SKSpriteNode(texture: texture, size: texture.size())
        self.node.position = atStartPosition

        // Initialise StateMachine
        self.stateMachine = GKStateMachine(states: [
            VisualEntityIdle(),
            VisualEntityPendingMove(),
            VisualEntityMoving()
        ])

        self.stateMachine.enter(VisualEntityIdle.self)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}