需要帮助为SKScene制作自定义协议

时间:2016-02-10 22:53:41

标签: ios swift sprite-kit protocols

我没有制作自己的协议的经验,我正在尝试创建一个,以便我可以将GameController dpad值发送到SKScene。一切都已连接并正确构建,但我的SKScene没有收到任何信息。

这是我的主视图控制器:

import GameController
import ...

protocol GetsDpadFromController {
    func dpadValueUpdate(dpadValue: CGPoint)
}

class GameViewController: UIViewController {

    var joystickController: GCController!
    var dpadData: GetsDpadFromController? = nil

    override func viewDidLoad() {
    super.viewDidLoad()

        NSNotificationCenter.defaultCenter().addObserver(self, selector: "addController:", name: GCControllerDidConnectNotification, object: nil)

    }
}

  func addController(sender: NSNotificationCenter) {
    self.joystickController = GCController.controllers().first
    self.joystickController.microGamepad?.reportsAbsoluteDpadValues = true
    self.joystickController.microGamepad?.valueChangedHandler = { (gamepad, element) -> Void in
        if element == self.joystickController.microGamepad?.dpad {
            let x: CGFloat = CGFloat((self.joystickController.microGamepad?.dpad.xAxis.value)!)
            let y: CGFloat = CGFloat((self.joystickController.microGamepad?.dpad.yAxis.value)!)
            let touchPosition: CGPoint = CGPointMake(x, y)

             if let delegate = self.dpadData {
                delegate.dpadValueUpdate(touchPosition)
            }
        }
    }
}

这是我的SKScene:

class Page04: SKScene, GetsDpadFromController {

    override init(size: CGSize){
    super.init(size: size)

    }

    func dpadValueUpdate(dpadValue: CGPoint) {
        print(dpadValue)
    }

}

SKScene中的dpadValueUpdate无法打印,因此我无法获取控制器数据。我之前从未制定过自己的协议,所以我不太确定我做错了什么。

有谁知道为什么SKScene没有收到数据?

1 个答案:

答案 0 :(得分:2)

您已正确声明GetsDpadFromController协议并使Page04场景符合该协议。

缺少的部分

查看您的代码,dpadData中的GameViewController属性始终为nil

所以这个IF的主体永远不会被执行。

if let delegate = self.dpadData {
    delegate.dpadValueUpdate(touchPosition)
}

用这个替换IF

let skView = self.view as! SKView
if let delegate = skView.scene as? GetsDpadFromController {
    delegate.dpadValueUpdate(touchPosition)
}

现在您正在检查当前场景是否符合GetsDpadFromController(对于Page04也是如此),如果是,您正在调用场景中的dpadValueUpdate

让我知道它是否有用。