2015年5月22日金曜日

Spriteを物理体にするときの座標に注意

Spriteに物理シミュレーション(重力によって下に落としたり、別なスプライトとの衝突判定をつけたり)の対象とするためには、そのspriteに対して物理体というのを作ってやる必要がある。作る…というか、spriteのどの範囲を物理体にするか指定してやるのだな。

範囲が矩形の場合はsprite(ここでは_oni)を作った後に、以下のコードで指定する。

_oni.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:rect];

このrectの指定だが、UIViewにあたるSKScene上の絶対座標でなく、指定するSpriteの原点(デフォルトではSprite中心)からの相対座標で指定しないといけない。
わかんないで、上の例で100,380からの縦横64ピクセルの範囲を指定したら、Spriteの原点から右に100、上に380もずれた画面外から始まる縦横64ピクセルの範囲になってしまい、Spriteの位置に当たり判定が付かずにだいぶ迷ってしまった。

このため、正しいrectの設定は以下のコードになる。

CGRect rect = CGRectMake(-(_oni.frame.size.width / 2), -(_oni.frame.size.height / 2), _oni.frame.size.width_oni.frame.size.height);

原点が0,0ということになるので、width、heightそれぞれの半分の値をマイナスにしてrectのx、yにしてるわけね。
width、heightはそのまま。

考えてみりゃ、位置を変えるSpriteに親オブジェクトのSKSceneの絶対座標なんか使うわけないんだけど、引っかかったので書いておく。'`,、('∀`) '`,、

0 件のコメント:

コメントを投稿