2017-05-07 8 views
1

私は大学のクラスのプロジェクトとしてゲームを作っています。私のメインキャラクター(木)が地面に当たったとき、それは地面LibGdx Box2dコリソンがスプライトと一致しない

screenshot 1

との短い停止したときのギャップも大きい少しプラットフォーム上のプレイヤーの土地

screenshot 2

キャラクターと地面のボディを作成するための私のコードはこれです。

地面がそれ自身のクラスである

public class Material { 
    private Texture image; 
    private Body body; 
    private Sprite sprite; 

    public Material(Texture t, int x, int y, int w, int h){ 
     image = t; 
     sprite = new Sprite(t); 
     body = BoxBuilder.createBody(x, y, w, h, true); 
     body.setUserData("Ground"); 
    } 

    public void draw(){ 
     // returns a SpriteBatch 
     SpriteBatch batch = GlobalBatch.getInstance(); 
     sprite.setPosition(body.getPosition().x * PPM, body.getPosition().y * PPM); 
     batch.begin(); 
     sprite.draw(batch); 
     batch.end(); 
    } 

    public void dispose(){ 
     image.dispose(); 
    } 
} 

地面

public void draw(){ 
    for(Material m : worldObjects){ 
     m.draw(); 
    } 
} 
を描画するためのコードが は

public void create(){ 
    // do stuff 

    // global vars 
    body = createBody(0, 480, 313, 260, false); 

    texture = new Texture("tree.PNG"); 
    sprite = new Sprite(texture); 

    // do stuff 
} 

public void render(){ 
    // do stuff 
    sprite.setPosition(body.getPosition().x*PPM, body.getPosition().y*PPM); 
    batch.begin() 
    sprite.draw(batch) 
    batch.end() 
    // do stuff 
} 

とPPM(メーターあたりのピクセル)が

文字を描画するための私のコードです

public static final float PPM = 32; 

私は知らないwここでの問題は何か、私はそのキャラクターを地面に着地させ、その上に着地させたくない。だから誰かが私にこれを引き起こしていることを教えてくれたり、box2dについてもっと学ぶための良いチュートリアルを教えてくれたら、それを感謝します。

+0

ために多分キャンバスサイズは、画像よりも大きいです。キャンバスと画像の高さが等しいことを確認してください。 –

+0

地面は個々のタイルでできていて、libgdxはキャンバスを世話しませんか? – Das

+0

'Box2DDebugRenderer'を使ってあなたの体の境界をチェックしてください。 – Aryan

答えて

1

PolygonShapeでボディを作成するとボディがそのポリゴンの中央にくるので、ボディの位置で描画するときは中心から描画を開始します。PolygonShapeしたがって、左下隅に描画する必要があります。

材質クラス

で置き換える

sprite.setPosition(body.getPosition().x * PPM, body.getPosition().y * PPM); 

sprite.setPosition(body.getPosition().x*PPM-sprite.getWidth()/2,body.getPosition().y-sprite.getHeight()/2); 
sprite.setRotation(body.getAngle()*MathUtils.radDeg); 

そして文字のドローも変更

sprite.setPosition(body.getPosition().x*PPM, body.getPosition().y*PPM); 
私はあなたが Materialクラスならびに文字に設定された幅と高さのために Spriteのサイズを設定していないあなたのコードで見たよう

sprite.setPosition(body.getPosition().x*PPM-sprite.getWidth()/2, body.getPosition().y*PPM-sprite.getHeight()/2); 
sprite.setRotation(body.getAngle()*MathUtils.radDeg); 

。マテリアルクラスで

sprite = new Sprite(t); 
sprite.setSize(w,h); 

と文字

body = createBody(0, 480, 313, 260, false); 
texture = new Texture("tree.PNG"); 
sprite = new Sprite(texture); 
sprite.setSize(313,260); 
関連する問題