2016-10-07 4 views
1

私は、ゲームプレイヤーが移動できるいくつかのスイッチスプライトを持つゲームを書いています。
私は自分のコードを整理するために 'Game-play-kit'状態マシンを使用しようとしていました。
複数のステートマシンを管理する方法がわかりません。具体的には、スイッチをアレイに格納し、各スイッチオブジェクトにはステートマシンが含まれています。
GKStateクラスから 'parent'スイッチを参照するにはどうすればいいですか?私は内からスイッチを開始Gameplaykit:GKStatemachinesを使用した複数のオブジェクトの管理

class SwitchNetwork { 

var level : Int 
var switchNetwork = [RailSwitch]() 
var railSwitchAnimation : [switchAnimationState: switchAnimation] 

init (level:Int) { 
    self.level = level 
    self.switchNetwork = [] 
    self.railSwitchAnimation = [:] 
} 

func initialiseSwitches() { 

    /* one test example switch - in practice there will be many*/ 

    railSwitchAnimation = loadSwitchAnimations() 
    switchNetwork.append(RailSwitch(switchID: 1, 
     switchLocation: CGPointMake(400,300), 
     initialSwitchPosition: (.left) , 
     isSwitchLocked: false, 
     isLeftMiddleSwitch: true, 
     currentAnimation: railSwitchAnimation[.left]!, 
     texture: railSwitchAnimation[.left]!.textures[0] 
     )) 
} 

:これは私のスイッチネットワークのクラスである

class RailSwitch: SKSpriteNode { 

var switchID: Int 
var currentSwitchPosition: switchPosition 
var initialSwitchPosition: switchPosition 
var switchLocation: CGPoint 
var isSwitchLocked: Bool 
var isLeftMiddleSwitch: Bool 
var currentAnimation: switchAnimation /* this is a dictionary of animation textures */ 

var stateMachine : GKStateMachine! 


init(switchID: Int, 
    switchLocation: CGPoint, 
    initialSwitchPosition: switchPosition, 
    isSwitchLocked: Bool, 
    isLeftMiddleSwitch: Bool, 
    currentAnimation: switchAnimation, 
    texture:SKTexture!) { 

    self.switchID = switchID 
    self.switchLocation = switchLocation 
    self.initialSwitchPosition = initialSwitchPosition 
    self.currentSwitchPosition = initialSwitchPosition 
    self.isSwitchLocked = isSwitchLocked 
    self.isLeftMiddleSwitch = isLeftMiddleSwitch 
    self.currentAnimation = currentAnimation 


    super.init (texture: texture!, color: UIColor.clearColor(), size: texture!.size()) 

} 



required init?(coder aDecoder: NSCoder) { 
    fatalError("init(coder:) has not been implemented") 
} 

:(?新しいアニメーションを実行しているこの場合)の特性

は、これは私のスイッチクラスですGameScene:

func initiateSwitchNetwork() { 

    for thisSwitch in 0 ... switches.switchNetwork.count - 1 { 

     switches.switchNetwork[thisSwitch].stateMachine = GKStateMachine(states: [ 
      GameStart(scene: self), 
      SwitchLeft(scene: self), 
      SwitchRight(scene: self), 
      SwitchMiddle(scene: self), 
      SwitchLeftLocked(scene: self), 
      SwitchRightLocked(scene: self), 
      SwitchMiddleLocked(scene: self)]) 
     switches.switchNetwork[thisSwitch].stateMachine.enterState(GameStart) 
    } 

ここに私の質問があります。
スイッチのstatemachine gkstateクラスの中から、誰がアニメーションを変更しますか?
何とかステートマシンを保持する親スイッチオブジェクトにアクセスする必要がありますか?

class GameStart: GKState { 


    unowned let scene: GameScene 

    init(scene: SKScene) { 
     self.scene = scene as! GameScene 

     super.init() 
    } 

    override func didEnterWithPreviousState(previousState: GKState?) { 
     // scene.addChild(scene.switches.switchNetwork[0].currentAnimation.textures[0]) 
    } 
} 
+0

私はオンラインで見ており、複数のオブジェクト(複数の敵など)のすべての実装は、ステートマシンに加えてエンティティコンポーネントシステムを利用しています。これを達成するためにエンティティコンポーネントシステムを回避する方法はありますか?私のゲームはあまりに簡単であることを保証することはできません –

答えて

0

シーンを各状態のinit関数に渡す代わりに、代わりに親スイッチへの参照を渡すことができますか?したがって、あなたの国のinit関数は次のようになります。

init(switch: RailSwitch) { 
    self.railSwitch = switch 
    super.init() 
} 

次に、あなたのRailSwitchあなたは状態のupdateWithDeltaTime機能で呼ぶようなアニメーションを変更する機能を持っているかもしれません。

override func updateWithDeltaTime(seconds: NSTimeInterval) { 
    self.railSwitch.changeAnimation(to switchTexture: .left) 
} 

各状態でstateMachineにアクセスできることに注意してください。余談として

override func updateWithDeltaTime(seconds: NSTimeInterval) { 
    self.stateMachine?.enterState(SwitchRight.self) 
} 

、Iは、スイッチの次の状態が強く、現在の状態によって決定されない限り、この種の機能を実装するためにStrategy Patternを使用することを好むだろう。戦略は、外的要因が次の変化を決定する場合に適しています。

関連する問題