だからコンセプトはわかる。アイデアは、box2d は多かれ少なかれメートル単位で機能するため、ピクセルからメートルへの変換を行う必要があるということです。理にかなっています。ここでbox2d のチュートリアル/イントロに従っていました。変換を行うことについて言及し、使用する量の例をいくつか示します。これで問題ありませんが、このような手法を使用すると、デバッガ ボックスが本来の場所にレンダリングされないように見えます。ただし、衝突は期待どおりに機能します。
私の GameScreen クラスで、地面を初期化する方法は次のとおりです。
ground = new BodyDef();
// set the position half way up the ground
ground.position.set(0,16 * GameScreen.WORLD_TO_BOX);
groundBody = world.createBody(ground);
groundShape = new PolygonShape();
// make the height 16px so it doubles to 32
groundShape.setAsBox(Gdx.graphics.getWidth() * GameScreen.WORLD_TO_BOX, 16.0f * GameScreen.WORLD_TO_BOX);
groundBody.createFixture(groundShape, 0.0f);
その画面でのレンダリング方法は次のようになります。
public void render(float delta) {
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
camera.update();
stateTime += Gdx.graphics.getDeltaTime();
batch.begin();
batch.draw(background, 0, Gdx.graphics.getHeight() - 512, 512, 512);
batch.draw(trailingBackground, 512, Gdx.graphics.getHeight() - 512);
int heightToCover = Gdx.graphics.getHeight() - 512;
int widthToCover = Gdx.graphics.getWidth();
for(int w = 0; w < widthToCover; w += 32) {
for(int h = 0; h < heightToCover; h += 32) {
batch.draw(lightBackgroundTile, w, h, 32, 32);
}
}
player.update();
player.render(stateTime, batch);
batch.end();
levels.get(currentLevel).render(camera);
// physics updates
world.step(1/60f, 6, 2);
debugRenderer.render(world, camera.combined);
}
これはプレーヤー クラスのコンストラクターです。コリジョン box2d オブジェクトをどのようにセットアップするかを確認できます。スプライトの位置を調整するために上記のレンダリング ループで呼び出される update メソッドも貼り付けました。
public Player(int x, int y, World world) {
super();
playerTexture = new Texture(Gdx.files.internal("assets/hero.png"));
init(x, y, 128, 128, playerTexture, false, world);
bodyDef = new BodyDef();
bodyDef.type = BodyType.DynamicBody;
bodyDef.position.set(x * GameScreen.WORLD_TO_BOX, y * GameScreen.WORLD_TO_BOX);
body = getWorld().createBody(bodyDef);
collisionBox = new PolygonShape();
collisionBox.setAsBox(32 * GameScreen.WORLD_TO_BOX, 64 * GameScreen.WORLD_TO_BOX, new Vector2(64 * GameScreen.WORLD_TO_BOX, 64 * GameScreen.WORLD_TO_BOX), 0.0f);
FixtureDef fixtureDef = new FixtureDef();
fixtureDef.shape = collisionBox;
fixtureDef.density = 10f;
fixtureDef.friction = 0.4f;
fixtureDef.restitution = 0f;
body.createFixture(fixtureDef);
collisionBox.dispose();
addFrame(0, 0, 128, 128);
}
public void update() {
this.setX((int) ((body.getPosition().x) * GameScreen.BOX_TO_WORLD));
this.setY((int) ((body.getPosition().y) * GameScreen.BOX_TO_WORLD));
}
ここで、さまざまな計算、サイズなどでこれらの静的浮動小数点数の乗算を削除すると、衝突は正しく維持され、デバッガー ボックスが表示されます。ただし、生のピクセルを box2d に渡すのは間違っているように感じます。デバッグボックスがそのまま表示されない理由について、ここで見逃しているものはありますか?