Sprite kit Gameplaykit:使用虚拟机管理多个对象

Sprite kit Gameplaykit:使用虚拟机管理多个对象,sprite-kit,gameplay-kit,Sprite Kit,Gameplay Kit,我正在编写一个游戏,其中包含许多可由游戏玩家移动的开关精灵。我打算使用“游戏工具包”状态机来组织我的代码我不知道如何管理多个状态机-具体来说,我将交换机存储在一个数组中,并且每个交换机对象都包含一个状态机-如何从GKState类中引用“父”开关以更改其属性(在本例中运行新动画?) 这是我的开关类: class RailSwitch: SKSpriteNode { var switchID: Int var currentSwitchPosition: switchPosition var in

我正在编写一个游戏,其中包含许多可由游戏玩家移动的开关精灵。
我打算使用“游戏工具包”状态机来组织我的代码
我不知道如何管理多个状态机-具体来说,我将交换机存储在一个数组中,并且每个交换机对象都包含一个状态机-
如何从GKState类中引用“父”开关以更改其属性(在本例中运行新动画?)

这是我的开关类:

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")
}
这是我的交换机网络课程:

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]
        ))
}
我从游戏场景中启动切换:

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)
    }
这是我的问题。
在switch statemachine gkstate类中,我应该更改谁的动画?
我需要访问以某种方式保存状态机的父switch对象

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])
    }
}

一种考虑的方法不是将场景传递到每个状态的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)
}

另外,我更愿意使用
策略模式
来实现这种功能,除非下一个状态是由当前状态强烈决定的。策略更适合于外部因素决定下一个变化的情况。

我已经在线查看了,多个对象(例如多个敌人等)的每个实现都使用实体组件系统以及状态机。有没有一种方法可以避免实体组件系统来实现这一点?我的游戏太简单了,无法保证这一点