SKSceneとUIViewとの座標変換

SpriteKitのSKSceneの座標系は、UIViewの左上座標とは異なり、y軸が反転した左下座標系になっています。そのため、UIGestureRecognizerのようなUIView側の座標系をSpriteKitに持ち込むには、座標系を変換してあげなくてはいけません。

具体的には、SKSceneメソッドconvertPointFromView(_:)convertPointToView(_:)を使います。

// UIView上の座標をSKScene上の座標に変換する
func convertPointFromView(_ point: CGPoint) -> CGPoint

// SKScene上の座標をUIView上の座標に変換する
func convertPointToView(_ point: CGPoint) -> CGPoint

UIPanGestureRecognizerを使ってスプライトをドラッグしようとしていて、ハマりかけました。結局、その時のコードは次のようになりました。

    @IBAction func panned(recognizer: UIPanGestureRecognizer) {
        let location = recognizer.locationInView(_spriteView)
        // タッチ座標をSKScene上の座標に変換。これを忘れていた
        let sklocation = _spriteView.scene!.convertPointFromView(location)

        if let node = _spriteView.scene?.nodeAtPoint(sklocation)
            where node is SKSpriteNode
        {
            // ノードのイベント生起
        }
    }