2014-03-06 54 views
0

我正在使用LibGDX和Box2d來構建我的第一個Android遊戲。好極了!使用LibGDX不精確的Box2d座標

但是我遇到了Box2d的一些嚴重問題。

我有一個簡單的舞臺,底部有一個矩形的Box2d物體代表地面,另外兩個矩形的Box2d物體都在左邊和右邊,代表着牆壁。

A Screenshot

Another Screenshot

我也有一個盒子。這個盒子可以被觸摸,並使用applyLinearImpulse移動,就像被踢了一樣。它是一個DynamicBody。

會發生什麼情況是,在Box對象的draw()代碼中,Box對象的Box2d正文給我一個X軸的錯誤值。 Y軸的值很好。

截圖上的那些藍色「點」是我在body.getPosition()給出的框邊上打印的小紋理。請注意,在一個屏幕截圖中,點與實際的DebugRenderer矩形是如何對齊的,而其他的則不是。

這就是發生了什麼:當盒子移動時,對齊在運動中丟失。

盒子,地面和牆壁之間的碰撞恰好考慮到DebugRenderer呈現的區域。但body.getPosition()和fixture.testPoint()認爲這些藍點內的區域。

因此,不知何故,Box2d正在「維護」這兩個區域的同一個身體。

我認爲這可能是某種像素和米(我縮放100倍)轉換之間的某種「精度損失」,但Y軸使用相同的技術,並且很好。

所以,我想我可能會錯過一些東西。

編輯1

我是從盒座標轉換到世界座標。如果您在屏幕截圖中看到藍色調試精靈,它們幾乎完美地形成了框。

public static final float WORLD_TO_BOX = 0.01f; 
public static final float BOX_TO_WORLD = 100f; 

盒渲染代碼:

public void draw(Batch batch, float alpha) { 
    x = (body.getPosition().x - width/2) * TheBox.BOX_TO_WORLD; 
    y = (body.getPosition().y - height/2) * TheBox.BOX_TO_WORLD; 

    float xend = (body.getPosition().x + width/2) * TheBox.BOX_TO_WORLD; 
    float yend = (body.getPosition().y + height/2) * TheBox.BOX_TO_WORLD; 

    batch.draw(texture, x, y); 
    batch.draw(texture, x, yend); 
    batch.draw(texture, xend, yend); 
    batch.draw(texture, xend, y); 
} 

編輯2

我開始懷疑相機。我得到了DebugRenderer和一個scene2d Stage。下面是代碼:

我的屏幕分辨率(Nexus 5和它的肖像):

public static final int SCREEN_WIDTH = 1080; 
public static final int SCREEN_HEIGHT = 1920; 

在啓動時:

// ... 
    stage = new Stage(SCREEN_WIDTH, SCREEN_HEIGHT, true); 

    camera = new OrthographicCamera(); 
    camera.setToOrtho(false, SCREEN_WIDTH, SCREEN_HEIGHT); 

    debugMatrix = camera.combined.cpy(); 
    debugMatrix.scale(BOX_TO_WORLD, BOX_TO_WORLD, 1.0f); 
    debugRenderer = new Box2DDebugRenderer(); 
// ... 

現在,渲染()代碼:

public void render() { 
    Gdx.gl.glClearColor(0, 0, 0, 1); 
    Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT); 

    camera.update(); 

    world.step(1/45f, 6, 6); 
    world.clearForces(); 

    stage.act(Gdx.graphics.getDeltaTime()); 
    stage.draw(); 

    debugRenderer.render(world, debugMatrix); 
} 
+0

Box2D使用它自己的座標系。在繪圖之前是否將Box2D的座標系轉換爲libGDX的座標系? – kabb

+0

是的,我編輯了這個問題。 – xrash

+0

我不認爲精度損失是問題,因爲類似的轉換比例對我來說工作正常。你正在使用'OrthographicCamera'嗎? – user3312130

回答

1

看起來這個答案很簡單:

stage.setCamera(camera); 

我沒有設置OrthographicCamera到舞臺上,所以舞臺正在使用某種與我的東西不一致的默認相機。

它與Box2d最終沒有任何關係。 Box2d正在返回健康值,但由於舞臺分辨率錯誤,這些值與我屏幕中錯誤的位置相對應。