SpriteKit の touch event と座標変換

SpriteKit の Scene では縦方向の原点が下で、UIView では上になるという違いがある。なんでそんなことすんの?という疑問なんですが、SpriteKit はゲームで利用することが多く、重力を計算するとき原点が下にあった方が理解しやすいからなんだろうなと勝手に想像をしています。

それは置いておくとして、実務上、touch された位置を取得してその位置に object を移動させよう、なんてことを考えると、原点どっちだ?というのを気にしないといけません。単純に上下反転すればいんじゃ無いの? と思いがちで、始めその線で書いてみたんですがどうにも動きが不自然。

なんかいい方法ないのか?と探したところ、Apple の document を参照すると、locationInNode という便利な method があるじゃないですか、こんな感じで。

    UITouch* touch = [touches anyObject];

    CGPoint newLocation = [touch locationInNode:self.scene];

この class は SKShapeNode の sub class なんで、self.scene がそのまま通るとは思わなかったのですが、通ってしまえばこっちのもの、よしとしよう。