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 { // ノードのイベント生起 } }