2017-01-05 2 views
2

저는 SpriteKit 및 GameplayKit을 사용하여 작은 프로젝트를 진행하고 있습니다. 엔티티/구성 요소 시스템을 사용하는 것은 처음이고 그것을 사랑합니다. 하지만 이제는 스폰산 단계에서 상호 작용하지 않도록 본인 상태 (스폰, 정상, 제거)를 추적해야하는 시점에 있습니다 (해당 항목을 움직이는 동작을 포함 할 수도 있고 포함하지 않을 수도 있음). 그들의 제거 단계.GKEntity 및 상태 머신

지금까지 여러 상태로 GKStateMachine을 인스턴스화하는 EntityStateComponent를 만들었습니다. 프레임마다 업데이트 할 필요가 없으므로 복잡하지 않습니다. 문제는이 상태가 관련된 요소보다 관련된 엔티티가 더 많다는 것입니다. GKEntity에서 하위 클래스를 만들고 구성 요소 대신에 상태 시스템을 추가하는 것이 합리적인지 궁금합니다.

의견이 있으십니까?

PS : 난 그냥 모든 구성 요소

답변

2

자네 말이 맞아를 만듭니다) (편의 초기화를 가지고 이미 GKEntity에서 하위 클래스라는 해요, 상태가 기업 관련 인, 관련 구성 요소가 아닙니다. 상태 머신을 엔티티에 직접 넣거나 모든 엔티티가 상속하는 엔티티 기본 클래스를 작성하십시오.

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

이 [article] (https://www.gamedev.net/resources/_/technical/game-programming/implementing-component-entity-systems-r3382)은 당신이 천국이라면 읽을만한 가치가있는'ECS'를 이해하는 데 도움이되었습니다. 그것을 보지 못했습니다. –

+0

감사합니다! 매우 유익한! – BadgerBadger