2017-01-05 13 views
2

私はSpriteKitとGameplayKitを使って小さなプロジェクトを進めています。エンティティ/コンポーネントシステムを使用したのは初めてのことです。私はそれを愛しています。しかし、今、私は自分のエンティティの状態(Spawning、Normal、Remove)を追跡する必要があるので、スポーンフェーズで相互作用しないようにしています(アニメーションを行うアクションを含む場合と含まない場合があります)。それらの除去段階。GKEntityと状態マシン

これまでは、さまざまな状態でGKStateMachineをインスタンス化するEntityStateComponentを作成しました。フレームごとに更新する必要はないため、複雑ではありません。問題は、この状態はコンポーネント関連のものよりも多くのエンティティ関連であり、GKEntityからサブクラス化し、コンポーネントの代わりにステートマシンを追加することが理にかなっているのだろうかと思います。

あなたの考えは?

PS:私はちょうど(コンビニエンスINITを持つようにGKEntityからすでにサブクラス化だ)あなたは右であるすべての成分

答えて

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

関連する問題