2017-01-05 55 views
2

我正在使用SpriteKit和GameplayKit开展一个小项目。这是我第一次使用实体/组件系统,我很喜欢它。但是现在,我需要跟踪我的实体状态(产卵,正常,移除),以便它们在产卵阶段不会相互作用(这可能包括也可能不包括动画动画)他们的消除阶段。GKEntity和状态机

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

您的想法?

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

回答

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") 
    } 
} 
+0

非常感谢!我不想向我的GKEntity子类添加任何东西,因为这是“教科书”的做法,但是必须使用可选的链接,并且在某个时刻被迫解开包装。无论如何,在组件内部进行每帧更新是不可能的。 – BadgerBadger

+1

这篇文章(https://www.gamedev.net/resources/_/technical/game-programming/implementing-component-entity-systems-r3382)帮助我理解了'ECS',值得一读,如果你避难没有看到它。 –

+0

谢谢!非常丰富! – BadgerBadger