2014-10-30 72 views
0

我對在Box2D身體上繪製雪碧產生了沉重的問題。Libgdx Box2D - 在身體上繪製雪碧 - 沉重的問題

我正在創造一個平臺遊戲,我之前在一個身體上繪製了一個精靈,但後來才意識到我的重力真的很飄。谷歌搜索後,我發現我應該使用Box2D時使用米,我改變了我的代碼使用像素到米的轉換比爲25.

從那時起,我無法讓所有的東西都工作,雖然我的精靈只是不會吸引我的身體。

攝像頭:

float width = Gdx.graphics.getWidth() * PIXELS_TO_METERS; 
float height = Gdx.graphics.getHeight() * PIXELS_TO_METERS; 

camera = new OrthographicCamera(width/2, height/2); 
camera.position.set(camera.viewportWidth/2, camera.viewportHeight/2, 0); 
camera.update(); 

這裏是我的身體代碼:

idleRegion = new TextureRegion(xeonTexture, 20, 13, 50, 65); 

xeonSprite = new Sprite(idleRegion); 

    //Physics 
bodyDef = new BodyDef(); 
bodyDef.type = BodyDef.BodyType.DynamicBody; 
bodyDef.position.set(100 * PIXELS_TO_METERS, 100 * PIXELS_TO_METERS); 
bodyDef.fixedRotation = true; 
body = world.createBody(bodyDef); 

PolygonShape shape = new PolygonShape(); 
shape.setAsBox((xeonSprite.getWidth()/2) * PIXELS_TO_METERS, (xeonSprite.getHeight()/2) * PIXELS_TO_METERS); 

FixtureDef fixtureDef = new FixtureDef(); 
fixtureDef.shape = shape; 
fixtureDef.density = 1f; 
fixtureDef.friction = 1f; 
fixtureDef.restitution = 0f; 
fixtureDef.isSensor = false; 

physicsFixture = body.createFixture(fixtureDef); 

這是我如何設置我的精靈位置:

final float widthD2 = (xeonSprite.getWidth()/2); 
final float heightD2 = (xeonSprite.getHeight()/2); 
final float angle = this.getBodyAngle(); 

xeonSprite.setOrigin(widthD2, heightD2); 
xeonSprite.setPosition(body.getPosition().x - xeonSprite.getWidth()/2, body.getPosition().y - xeonSprite.getHeight()/2); 
xeonSprite.setRotation((float) Math.toRadians(angle)); 

我也試過如下:

xeonSprite.setPosition(body.getPosition().x - xeonSprite.getWidth()/2 * METERS_TO_PIXELS, body.getPosition().y - xeonSprite.getHeight()/2 * METERS_TO_PIXELS); 

這裏是我畫我的雪碧:

penguinBatch.begin(); 
xeon.getPenguinSprite(stateTime, Gdx.graphics.getDeltaTime()).draw(penguinBatch); 
penguinBatch.end(); 
+2

不要使用Pixel來測量對話,只需設置好相機即可。例如,您是否希望在屏幕上看到x方向100米,相機的寬度應該爲100.相機將像素值爲您在引擎蓋下進行對話。更好的解決方案是使用'Viewport',閱讀wiki獲取更多信息。 – Springrbua 2014-10-30 15:43:51

+0

也添加了一些微不足道的方式來縮小/大量數量,看看,如果由於錯誤的縮放或中心沒有設置,精靈是「某處/巨大/微觀」等。 – cfrick 2014-10-30 18:13:39

回答

1

這又是的「像素不中你的遊戲世界中存在」另一種情況下,他們只是在那裏代表你的遊戲世界,以你的客戶。電視攝影師需要了解您的電視,因爲您需要了解您的客戶屏幕。抓住你想展示的東西,讓LibGDX完成剩下的工作。

因此,你永遠不應該使用像素。如果你想要像素完美的繪製,你可能需要設置你的相機的屏幕像素的數量,但在此之後,你把這些「像素」作爲單位。

Box2D 不是以每米像素工作。它適用於1 unit == 1 meter,你應該堅持。但像素應該代表多少米仍然取決於您。

如果你想畫一米x 1米中,您應該乘以一定數目您創建基於屏幕像素的像你現在這樣做,你應該只給它1 x 1代表框。

shape.setAsBox(1, 1); 

你的精靈應該是完全一樣的

xeonSprite.setSize(1, 1); 

而且你應該將其定位在相同的位置。這真的很簡單,1 UNIT == 1m,沒有什麼比它更多的了,相機完成剩下的工作。如果你想展示9米×16米的遊戲世界,你可以像這樣設置你的相機。

camera = new OrthographicCamera(9, 16); 

如果你要代表帝國大廈你會給身體和雪碧的大小57, 443,然後你的相機需要代表一個更大的區域,如果你不希望使一小部分的。如果你想精確地將屏幕高度放在屏幕上而不伸展,則需要進行自己的轉換。

float camHeight = 443; 
float aspectRatio = Gdx.graphics.width/Gdx.graphics.height 
float camWidth = aspectRatio * 443; 

雖然這些Gdx電話給你的客戶端運行你還是不應該把這些作爲對這些像素,因爲你不知道的像素在屏幕上什麼我會玩遊戲。

現在忘了帝國大廈例子,你的相機的中心位於0, 0世界空間,因此左下方是-4.5, -8所以你可能要翻譯它,不要忘了.update相機。您目前正在您的代碼中執行此操作。

如果您開始繪製精靈並更新Box2D,則會從屏幕中央看到一個球落下。當然,你需要不斷更新你的精靈位置,使其與身體位置相匹配,以便與Box2D身體一起移動。

只是忘記像素,除非你想編碼自己的相機或視口,你可能不想要,因爲你選擇了LibGDX。其他遊戲代碼不需要以任何方式處理像素。 OrthographicCamera可以通過camera.unproject(touchVector)計算出世界位置來爲您屏蔽位置。