読者です 読者をやめる 読者になる 読者になる

夏までにiPhone アプリつくってみっか!

趣味でiPhone/Androidアプリを開発し、日々勉強した事を書いています。オープンワールド系レースゲームをUnityで開発中です。

【cocos2d】convertToWorldSpace, convertToWorldSpaceAR 親に聞くか自分に聞くか

cocos2d

cocos2dで原点が異なるオブジェクト同士、あるいはタッチ位置とオブジェクトの座標を比較するときに便利なconvertToWorldSpace系のメソッドですが、良く理解していなかったので少し調べました。

convertToWorldSpaceの類似メソッドとしてconvertToWorldSpaceARというものもあるのでそれらの違いについても書きたいと思います。

まず、converttoWorldSpaceメソッドですが、親のオブジェクトに対して自分の座標をパラメーターで渡すとスクリーン座標=ワールド座標での自分の座標が得られます。

例えば、

CGPoint worldPosition = [self.parent convertToWorldSpace:self.position];

のようにすると自分が画面上の座標のどの位置にあるかがわかります。
親オブジェクトにメッセージを送るのは、self.positionは親オブジェクトの原点を基準にした座標だからです。
親オブジェクトの座標は、オブジェクトの左下が原点(0, 0)となります。
つまり、convertToWorldSpaceは、メッセージ送信先のオブジェクトの原点を基準に、引数の座標をオフセットとして足した位置のワールド座標を返してくれるものです。

ならば、convertToWorldSpaceARはどういうものかというと、Anchor Relativeという名が示すとおりconvertToWorldSpaceの、アンカーポイントを基準としたバージョンとなります。
メッセージを受けるオブジェクトのアンカーポイントを基準として、引数の座標をオフセットとして足した位置がワールド座標に変換されます。

アンカーポイントとは自分のオブジェクトのどの位置をself.positionで示す位置に合わせるかを指定するためのもので、デフォールトではccp(0.5, 0.5)となっています。値の範囲は0〜1なので、ccp(0.5, 0.5)は自分のオブジェクトの中心となります。
なお、ccp(0,5, 0.5) はCGPointMake(0.5, 0.5)と同じ意味です。

このconvertToWorldSpaceARを使うと、自分のワールド座標を自分自身に問い合わせる事ができます。自分の位置=アンカーポイントの位置なのでオフセットは(0, 0)になります。

CGPoint worldPosition = [self convertToWorldSpaceAR:CGPointZero];

なお、CGPointZero = CGPointMake(0, 0) = ccp(0, 0)です。

実際にプログラムを組んで確認してみました。

    CGPoint worldSelf = [self convertToWorldSpaceAR:CGPointZero]; //自分に問い合わせる
    CGPoint worldPare = [self.parent convertToWorldSpace:self.position]; //親に問い合わせる
    NSLog(@"selfX = %f, selfY = %f", worldSelf.x, worldSelf.y);
    NSLog(@"pareX = %f, pareY = %f", worldPare.x, worldPare.y);

結果は次の通りです。

selfX = 272.219910, selfY = 249.483902
pareX = 272.219910, pareY = 249.483902

自分に問い合わせても親に問い合わせても全く同じ結果を得る事ができました。

convertToWorldSpaceで親に問い合わせる方が引数にself.positionが入るのでぱっと見て何をやっているのかわかりやすいと思います。