2014-09-28 98 views
3

當試圖使用Box2D編程遊戲時,我遇到了Box2D的問題。我填充了紋理和精靈長度的像素數字,以在它周圍創建一個框。一切都在正確的地方,但由於某種原因,一切都非常緩慢。通過在互聯網上查看,我發現如果你沒有將像素轉換成米數,box2d可能會把它看作非常大的物體。這似乎是一切行動緩慢的合乎邏輯的原因。Libgdx Box2D像素到米轉換?

我在這個網站上發現了類似的問題,但答案似乎沒有幫助。在大多數情況下,解決方案是使用縮放因子將像素數轉換爲米。我嘗試了這一點,但一切都錯了,並有錯誤的大小。這對我來說似乎是合乎邏輯的,因爲數字發生了變化,但意思相同。

我想知道是否有辦法讓像素意味着更少的米,所以所有東西都應該在相同的(像素)大小相同的地方,但意味着更少的米。 如果你有,你認爲可能有助於以不同的方式,我也喜歡對子級聽到它..

這裏是我的代碼用於創建相機

 width = Gdx.graphics.getWidth()/5; 
     height = Gdx.graphics.getHeight()/5; 

     camera = new OrthographicCamera(width, height); 
     camera.setToOrtho(false, 1628, 440); 
     camera.update(); 

這是我使用的方法創建一個對象:

public void Create(float X, float Y, float Width, float Height, float density, float friction, float restitution, World world){ 
    //Method to create an item 
    width = Width; 
    height = Height; 

    polygonDef = new BodyDef(); 
    polygonDef.type = BodyType.DynamicBody; 
    polygonDef.position.set(X + (Width/2f), Y + (Height/2f)); 

    polygonBody = world.createBody(polygonDef); 

    polygonShape = new PolygonShape(); 
    polygonShape.setAsBox(Width/2f, Height/2f); 

    polygonFixture = new FixtureDef(); 
    polygonFixture.shape = polygonShape; 
    polygonFixture.density = density; 
    polygonFixture.friction = friction; 
    polygonFixture.restitution = restitution; 

    polygonBody.createFixture(polygonFixture); 
} 

要創建一個項目,在這種情況下一個表,我用的是以下幾點:

Table = new Item(); 
    Table.Create(372f, 60f, 152f, 96f, 1.0f, 0.2f, 0.2f, world); 

精靈通過使用以下方法繪製在項目:

public void drawSprite(Sprite sprite){ 
    polygonBody.setUserData(sprite); 
    Utils.batch.begin(); 
    if(polygonBody.getUserData() instanceof Sprite){ 
     Sprite Sprite = (Sprite) polygonBody.getUserData(); 
     Sprite.setPosition(polygonBody.getPosition().x - Sprite.getWidth()/2, polygonBody.getPosition().y - Sprite.getHeight()/2); 
     Sprite.setRotation(polygonBody.getAngle() * MathUtils.radiansToDegrees); 
     Sprite.draw(Utils.batch); 
    } 
    Utils.batch.end(); 
} 

精靈也具有像素尺寸。

使用這種方法,它顯示在正確的地方的圖像,但一切都緩慢移動。 我想知道如何或者如果我不得不改變這個,使物體正確移動,和/或意味着更少。提前致謝。

回答

7

Box2D是一個完全獨立於您使用的圖形庫。它沒有任何精靈和紋理的概念。您在線閱讀的內容是正確的,您必須將像素轉換爲米,因爲Box2D適用於米(標準單位的距離)。

例如,如果您繪製了一個大小爲100x100像素的精靈,那就是您希望用戶在屏幕上看到的精靈的大小。在現實世界中,物體的大小應該是米而不是像素 - 所以如果你說1px = 1m,那麼它會將精靈映射到一個巨大的100x100米物體。在Box2D中,大型世界對象會減慢計算速度。所以你需要做的是將100個像素映射到更小的米數,例如1米 - 因此100x100px精靈將在Box2D世界中由1x1米物體表示。

Box2D不適用於非常小的數字和非常大的數字。所以保持在0.5到100之間,以保持良好的表現。

編輯: 好的。現在我收到你的問題。 不要編碼爲像素。就這麼簡單。我知道這需要一些時間才能理解(這對我來說)。但是一旦你掌握了它,它就會直線前進。 而不是像素,使用一個單位,比方說,你稱它爲米。 所以我們決定我們的視口應該是6mx5m。

所以初始化

Constants.VIEWPORT_WIDTH = 6; 
Constants.VIEWPORT_HEIGHT = 5; 
... 

void init() { 
    camera = new OrthographicCamera(Constants.VIEWPORT_WIDTH, Constants.VIEWPORT_HEIGHT); 
    camera.position.set(Constants.VIEWPORT_WIDTH/2, Constants.VIEWPORT_HEIGHT/2, 0); 
    camera.update(); 
} 

一旦你知道實際的寬度和高度,你可以調用下面的函數,以保持寬高比:

public void resize(int width, int height) { 
     camera.viewportHeight = (Constants.VIEWPORT_WIDTH/width) * height; 
     camera.update(); 
} 

resize()可以稱得上任何時候你改變你的屏幕大小(例如:屏幕方向更改時)。 resize()取實際的寬度和高度(320x480等),這是像素值。

現在你指定你的精靈大小,他們的位置等在這個新的世界大小6x5。你可以忘記像素。將填滿屏幕的精靈的最小尺寸將是6x5。

您現在可以使用與Box2D相同的單位。由於新尺寸將更小,Box2D不會成爲問題。如果我沒有記錯Box2D沒有任何單位。爲方便起見,我們只是稱它爲米。

現在你可能會問你在哪裏指定窗口的尺寸。這取決於平臺。下面的代碼顯示分辨率320x480一個窗口的桌面遊戲:

public class Main { 
    public static void main(String[] args) { 
     LwjglApplicationConfiguration cfg = new LwjglApplicationConfiguration(); 
     cfg.title = "my-game"; 
     cfg.useGL20 = false; 
     cfg.width = 480; 
     cfg.height = 320; 

     new LwjglApplication(new MyGame(), cfg); 
    } 
} 

我們的相機將在6×5視智能地映射到分辨率480x320。

+0

謝謝,所以如果我想這樣做,我該如何將像素映射到不同數量的米,我應該怎麼做? (我包括編碼用於創建一個項目,並在問題上繪製一個精靈) – dragonfly 2014-10-01 20:22:26

+0

編輯我的答案。 – sinu 2014-10-06 10:22:05

+0

謝謝,我已經找到了一種方法使它看起來正確,但我必須將精靈的位置轉換爲整個屏幕,以便一切看起來都在正確的位置,但實際的模擬是在較低的位置左角。這似乎是一個更好的主意,但 – dragonfly 2014-10-06 11:27:17