2014-10-30 62 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)计算出世界位置来为您屏蔽位置。