我正在使用SpriteKit和GameplayKit处理一个小项目。这是我第一次使用实体/组件系统,而且我非常喜欢它。但是现在,我需要跟踪我的实体状态(产卵,正常,移除),以便他们在产卵阶段不进行交互(可能包括也可能不包括动画的动作)事情)和他们的删除阶段。
到目前为止,我已经创建了一个EntityStateComponent,它实现了具有不同状态的GKStateMachine,并且因为不需要每帧更新,所以它并不复杂。问题是这个状态与组件相关的实体相关性更多,我想知道从GKEntity继承并在那里添加状态机而不是在组件中是否有意义。
你的想法?
PS:我已经从GKEntity进行了子类化,只是为了创建一个方便的init()来创建所有组件
答案 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")
}
}