2013年2月22日金曜日

【cocos2d】プロパティ"position"と"boundingBox.origin"では取得できる値が違う

cocos2dでスプライトの座標を取得する際に、たまに意図しない値が取得されているのに気付きました。調べてみると、どうやら座標を取得するプロパティ"position"と"boundingBox.origin"とでは取得できる値が違う事が分かりました。

何はともあれ例を

とりあえずスプライトを表示して座標を取得してみます。
CGSize winSize = [[CCDirector sharedDirector] winSize];

CCSprite *sp=[CCSprite spriteWithFile:@"image.png"];
sp.position=ccp(winSize.width/2, winSize.height/2);
[self addChild:sp];

CCLOG(@"%f %f", sp.position.x, sp.position.y);
CCLOG(@"%f %f", sp.boundingBox.origin.x, sp.boundingBox.origin.y);

//ログ出力結果
160.000000 240.000000
131.500000 211.500000
ログ出力結果を見てもらえば分かるのですが値に違いがあります。
boundingBox.originで取得した方が値が少なくなっています。cocos2dの世界では通常、画面の左下が原点(0, 0)となっています。boundingBox.originで取得した方が原点に近いものになっていました。

なぜ?

なぜでしょうか。私もまだはっきりとはしていないのですが以下のエントリーの内容が関係しているのではないかなと思います。

UIViewについて - Inside Out / Objective-C Blog

UIViewに関しての記事なのですが、こちらの記事から気になった部分を抜粋します。

矩形の原点であるoriginは「The origin is located in the lower-left of the rectangle.」、左下(lower-left)を指していると読めるではありませんか。

~ 中略 ~

やはり、originは画面の左上です。

lower-leftとは、iPhone画面の座標系(X軸は右にプラス、Y軸は下にプラス)上でのlower-left、見かけの左上を示すということのようです。

参考: UIViewについて - Inside Out / Objective-C Blog

iPhoneから見たら左下を示しているが、人(製作している側)から見たら左上をさしている(ように見える)、という解釈でいいのでしょうか(自身ありません・・・)。

cocos2dの場合では左下が基準になるのでboundingBox.originの取得すると原点から計算した値が取得された、ということなのかなと思います。

追記: 2013/02/22

以前の記事「frameとboundsの違い」で"origin"について書いていました。

originは左上隅、つまり原点からの距離を取得するみたいです。

おわり

間違いなどありましたらコメントいただけると幸いです。

参考記事

UIViewについて - Inside Out / Objective-C Blog

0 件のコメント:

コメントを投稿