3

我正在使用 SpriteKit 和 GameplayKit 做一个小项目。这是我第一次使用实体/组件系统,我很喜欢它。但是现在,我需要跟踪我的实体状态(产卵、正常、移除),这样它们就不会在产卵阶段进行交互(这可能包括也可能不包括动画的动作)和他们的去除阶段。

到目前为止,我已经创建了一个 EntityStateComponent 实例化具有不同状态的 GKStateMachine ,并且由于不需要每帧更新它并不那么复杂。问题是这种状态与实体相关比与组件相关更多,我想知道从 GKEntity 子类化并在其中添加状态机而不是在组件中是否有意义。

你的意见?

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

4

1 回答 1

3

你是对的,状态是实体相关的,而不是组件相关的。将状态机直接放入实体中,或者创建一个所有实体都继承自的实体基类。

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")
    }
}
于 2017-01-05T19:57:59.523 回答