2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

libGDX & Box2Dで、長方形の剛体を作るときの注意

Last updated at Posted at 2015-02-10

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の表示で、剛体の境界を示します。)

large_shape.png

画像の倍の大きさの剛体が定義されていることがわかります。

正しい長方形の作り方

PolygonShape.setAsBox(float, float)のソースコードを見ると、横幅・縦幅ともに半分の値を指定するよう、javadocに書いてありました。

したがって、縦幅・横幅を半分にしましょう。

  PolygonShape shape = new PolygonShape();
- shape.setAsBox(w, h);    // <===== ここ注目!
 +shape.setAsBox(w/2, h/2);// <===== それぞれ半分

画像サイズとぴったりになりました。

correct_shape.png

まとめ

  • 長方形の剛体定義は、横・縦半分の値を指定する。
  • JavaDocコメントで引数の意味は確認する。

※実は、setAsBoxは縦横半分があたりまえなんでしょうか?
Box2Dに詳しいわけではないので、詳しい人教えてください。

使用したコード @ gist

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?