2017-01-05 23 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

 Смежные вопросы

  • Нет связанных вопросов^_^