libGDXで、Box2Dを使用するときに、うっかり間違ったまま使っていたポイントを紹介します。
(Box2Dの基本的な使い方は割愛します。)
まちがった長方形の作り方
長方形の剛体を作るとき、こんなコードを書きます。
Texture img = new Texture("square.png");
Sprite sprite = new Sprite(img);
float w = sprite.getWidth(); // 100px
float h = sprite.getHeight(); // 100px
// ここから剛体の定義
BodyDef bodyDef = new BodyDef();
bodyDef.type = BodyDef.BodyType.DynamicBody;
bodyDef.position.set(300, 200);
Body body = world.createBody(bodyDef);
body.setUserData(sprite);
PolygonShape shape = new PolygonShape();
shape.setAsBox(w, h); // <===== ここ注目!
FixtureDef fixtureDef = new FixtureDef();
fixtureDef.shape = shape;
fixtureDef.density = 1.0f;
fixtureDef.friction = 1.0f;
fixtureDef.restitution = 0.6f;
body.createFixture(fixtureDef);
shape.dispose();
PolygonShapeオブジェクトを作成して、横幅、縦幅を指定して形を指定しています。
square.pngが100x100(px)なので、100x100px相当の剛体が定義できません。
Box2Dで計算した座標にあわせて、Spriteを描画すると、以下のようになります。
(Spriteの描画位置は、中心があうようにしています。)
(四角の外側にある、細い線はDebugRendererの表示で、剛体の境界を示します。)
画像の倍の大きさの剛体が定義されていることがわかります。
正しい長方形の作り方
PolygonShape.setAsBox(float, float)のソースコードを見ると、横幅・縦幅ともに半分の値を指定するよう、javadocに書いてありました。
したがって、縦幅・横幅を半分にしましょう。
PolygonShape shape = new PolygonShape();
- shape.setAsBox(w, h); // <===== ここ注目!
+shape.setAsBox(w/2, h/2);// <===== それぞれ半分
画像サイズとぴったりになりました。
まとめ
- 長方形の剛体定義は、横・縦半分の値を指定する。
- JavaDocコメントで引数の意味は確認する。
※実は、setAsBoxは縦横半分があたりまえなんでしょうか?
Box2Dに詳しいわけではないので、詳しい人教えてください。