2017-05-07 54 views
1

我正在製作一個遊戲作爲大學課程的一個項目。當我的主角(樹)撞擊地面時,它停止短地面LibGdx Box2d collison與精靈不匹配

screenshot 1

和當小平臺上播放的土地那差距就更大

screenshot 2

我的代碼,用於創建角色和地面的主體是

public static Body createBody(int x, int y, float width, float height, boolean isStatic){ 
     Body body; 

     BodyDef def = new BodyDef(); 

     if(isStatic){ 
      def.type = BodyDef.BodyType.StaticBody; 
     } 
     else { 
      def.type = BodyDef.BodyType.DynamicBody; 
     } 


     def.position.set(x/PPM , y/PPM); 

     // returns a World object  
     body = GlobalWorld.getInstance().createBody(def); 

     PolygonShape shape = new PolygonShape(); 

     shape.setAsBox(width/2/PPM, height/2/PPM); 

     body.createFixture(shape, 1.0f); 

     shape.dispose(); 
     return body; 
} 

代碼地面是在它自己的類

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; 

我不知道這裏的問題是什麼,我希望角色落地,而不是落地。所以如果有人能告訴我是什麼導致了這個問題,或者指點我一個關於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); 

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

正如我在你的代碼中看到你不是在Material類以及爲字符所以設置寬度和高度設置的Sprite大小。

材料類

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);