2016-07-08 3 views
0

Libgdxフレームワークに問題があります。 Spriteを拡張するクラスを作成しようとしましたが、レンダリングするときにbodyがスプライトのテクスチャと揃っていないことがわかりました。ここでLibgdx Box2D本体とスプライトの整列問題

問題を示す画像である。

here is the image

あなたは以下のコードを参照することができます

public class GamePlay implements Screen { 

private GameMain game; 
private OrthographicCamera mainCamera; 
private Viewport viewport; 

private OrthographicCamera b2dcam; 
private Box2DDebugRenderer debugRenderer; 
private World world; 

private Texture background; 

private Brick brick; 
float timer = 0; 


public GamePlay(GameMain game) 
{ 
    this.game = game; 

    mainCamera = new OrthographicCamera(GameInfo.WIDTH, GameInfo.HEIGHT); 
    mainCamera.position.set(GameInfo.WIDTH/2, GameInfo.HEIGHT/2,0); 

    viewport = new FitViewport(GameInfo.WIDTH, GameInfo.HEIGHT, mainCamera); 

    b2dcam = new OrthographicCamera(); 
    b2dcam.setToOrtho(false, GameInfo.WIDTH/GameInfo.PPM, GameInfo.HEIGHT/GameInfo.PPM); 
    b2dcam.position.set(GameInfo.WIDTH/2f, GameInfo.HEIGHT/2f, 0); 

    debugRenderer = new Box2DDebugRenderer(); 
    world = new World(new Vector2(0,0), true); 

    background = new Texture("BGS/GameBG.png"); 

    brick = new Brick(world, "my brick"); 
    brick.setBricksPosition(cgp(20), cgp(20)); 


} 

//region Screen Methods 
@Override 
public void show() { 

} 

@Override 
public void render(float delta) { 
    Gdx.gl.glClearColor(0,0,0,1); 
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 

    game.getBatch().begin(); 
    game.getBatch().draw(background,0,0); 
    brick.draw(game.getBatch()); 
    game.getBatch().end(); 

    debugRenderer.render(world, b2dcam.combined); 

    world.step(Gdx.graphics.getDeltaTime(), 6,2); 
} 

@Override 
public void resize(int width, int height) { 

} 

@Override 
public void pause() { 

} 

@Override 
public void resume() { 

} 

@Override 
public void hide() { 

} 

@Override 
public void dispose() { 
    background.dispose(); 

} 
//endregion 


private float cgp(int gridPos) 
{ 
    return gridPos * GameInfo.gridSize; 
}} 



public class Brick extends Sprite { 

private World world; 
private Body body; 
private String name; 
private Fixture fixture; 

public Brick(World world, String name) 
{ 
    super(new Texture("Bricks/brick.png")); 
    this.world = world; 
    this.name = name; 


} 

void createBody() 
{ 
    BodyDef bodyDef = new BodyDef(); 
    bodyDef.type = BodyDef.BodyType.DynamicBody; 

    bodyDef.position.set((getX() - getWidth())/ GameInfo.PPM, (getY() + getHeight()/2)/ GameInfo.PPM); 

    body = world.createBody(bodyDef); 

    PolygonShape shape = new PolygonShape(); 

    shape.setAsBox((getWidth()/2)/GameInfo.PPM, (getHeight()/2)/GameInfo.PPM); 

    FixtureDef fixtureDef = new FixtureDef(); 
    fixtureDef.shape = shape; 

    fixture = body.createFixture(fixtureDef); 

    shape.dispose(); 

} 

public void setBricksPosition(float x, float y) 
{ 
    setPosition(x,y); 
    createBody(); 
} 

public void draw(SpriteBatch batch) 
{ 
    batch.draw(this, getX(), getY()); 
}} 
+1

MCVEへのコードを減らしてください: – kebs

答えて

0

BOX2Dデバッグレンダリング(体の実際の位置を示している)し、あなたをスプライトは "かなり近い"ので、遠く離れていないと思っています。問題は、box2dの位置対スクリーン位置対ピクセル対メーターの計算/変換の可能性が高いです。

あなたはPPM変換を行います。私はあなたのすべてのコードを見る時間がなかったが、2つの項目が非常に近いので、あなたの計算をもう一度チェックする。この行:

bodyDef.position.set((getX() - getWidth())/ GameInfo.PPM, (getY() + getHeight()/2)/ GameInfo.PPM); 

私の目をキャッチしました。デバッグとスプライトのレンダリングは、yに関しては正しいが、xではオフになる。あなたの高さはgetHeight()/ 2を使用しますが、getWidthは2で割ることはありません。

+0

答えをありがとう、私は間違って削除してしまいました。私が2で割ったとき、結果はあまりにも整列していません。別の問題があるはずですが、私はそれを得ることができません.. –

+0

投稿したコードが画像と一線を画していないと言っているのかどうかわかりません。とにかく、私はまだ計算の中でそれを考える。異なっているものを探してください。あるいは、彼らが "ラインアップ"するまでブルートフォースを変えてみてください。私が言ったように、あなたは近づいていますが、コードを見るのに便利な時間はありません。たとえば、getWidth()を減算しますが、getHeight()を追加すると、それはあまりにも違いがあります。 (私は今も暗闇の中で刺すようにしています) –

+0

助けてくれてありがとう。私は再びコードをチェックします:) –

0

最後に解決策を見つけました。 問題は自分のPPM値のために発生します。私は100に設定し、それを画面サイズに分割すると整数になりません。そこで私は160に変更しました。これを800と480の両方に分けることができ、問題は解決されました。

+0

PPMを浮動小数点(100.0fなど)に設定しようとしましたか?bodydef positionは浮動小数点数を受け取り、getXとgetWidthの戻り浮動を受け入れるVectorです。 PPMをintに設定すると、特定の画面サイズでしか分割できない場合があります。 –

+0

はい、ありがとうございました。これは正しい解決策です.. :) –

関連する問題