【发布时间】:2014-07-29 03:35:00
【问题描述】:
我有一个问题。我正在使用 libGDX 创建一个游戏,并且一直在按照本教程进行制作 (https://www.youtube.com/watch?v=-Z_N5gHcl0k)。所以我按照教程进行操作,是的,一切都很顺利。现在我根据我在教程中学到的知识开始一个新项目(一切(如相机等)都已正确设置)!
我的问题在于 Box2D,我在其中将形状添加到固定装置。
假设我正在制作一个盒子。
public void createBox() {
BodyDef bdef = new BodyDef();
FixtureDef fdef = new FixtureDef();
bdef.position.set(200 / PPM, 500 / PPM);
bdef.type = BodyType.DynamicBody;
Body body = world.createBody(bdef);
PolygonShape shape = new PolygonShape();
shape.setAsBox(hx/ PPM, hy/ PPM);
fdef.shape = shape;
fdef.filter.categoryBits = B2DVars.BIT_BOX;
fdef.filter.maskBits = B2DVars.BIT_PLATFORMS;
body.createFixture(fdef).setUserData("box");
}
PPM 等于 100。它基本上是用来缩小到 Box2D 中每米的像素数量。
我的问题在这里:
Shape.setAsBox(hx / PPM, hy/ PPM);
hx 和 hy 代表 x 的一半和 y 的一半。所以如果我给 hx 加上 50,它实际上是 100。
shape.setAsBox(100/ PPM, 100 / PPM); <- Box
shape.setAsBox(99/ PPM, 99/ PPM); <- No Box
就好像我从未创建过形状或固定装置...
所以我做了一些测试。我试过了:
setAsBox(99 * 2 / PPM, 99 * 2 / PPM).
你猜怎么着...没什么!
然后我使用了那个确切的语句,但用 100 作为值。哇,一个大盒子!
如果我这样做:
setAsBox(99 / PPM, 100 / PPM)
我在上方(在 Y 轴上)看到一条巨线。
如果我这样做:
setAsBox(100 / PPM, 99 / PPM)
我在前面(在 X 轴上)有一条巨大的线。
所以我一开始忽略了这个问题。但是现在当我想加载一个精灵(基本上是我创建了播放器)时,形状问题阻止了我与平台发生适当的碰撞。
但令人惊讶的是,玩家精灵决定在我创建的平台中途下落并停止下落(好像发生了碰撞。这仅在 hx 和 xy 低于 100 时才会发生(因此没有盒子)。 但是如果我他们是 100 或更高,盒子就会出现并且我有适当的碰撞(除了由于盒子的大小,玩家精灵/位置在空中哈哈)。
现在为了检测玩家的碰撞,我创建了一个位于玩家下方的足部传感器。我这里也有问题。我创建了一个盒子并给它一个 Vector2 作为它的中心位置。向量 2 的 Y 值必须为 -100 才能显示框。如果它高于或低于任何东西,则不会出现任何内容。 X 值必须为 0。
shape.setAsBox(100 / PPM, 100 / PPM, new Vector2(0, -100 / PPM), 0); <- Box
shape.setAsBox(99/ PPM, 99/ PPM, new Vector2(0, -99 / PPM), 0); <- No Box
播放器代码
private void createPlayer() {
MapLayer layer = map.getLayers().get("Spawn");
BodyDef bdef = new BodyDef();
FixtureDef fdef = new FixtureDef();
// Get X and Y coords of the playerSpawn map object
float x = layer.getObjects().get("playerSpawn").getProperties()
.get("x", Float.class);
float y = layer.getObjects().get("playerSpawn").getProperties()
.get("y", Float.class);
// set position of body
bdef.position.set(x / PPM, y / PPM);
bdef.type = BodyType.DynamicBody;
// bdef.linearVelocity.set(1f, 0);
Body body = world.createBody(bdef);
PolygonShape shape = new PolygonShape();
shape.setAsBox(100 / PPM, 100 / PPM); <- Issue code
fdef.shape = shape;
fdef.filter.categoryBits = B2DVars.PLAYER;
fdef.filter.maskBits = B2DVars.BIT_PLATFORMS;
body.createFixture(fdef).setUserData("player");
// create foot sensor <- Used for collision detection at players feet
shape.setAsBox(100 / PPM, 100 / PPM, new Vector2(1, -100 / PPM), 0); <- Issue code
fdef.shape = shape;
fdef.isSensor = true;
fdef.filter.categoryBits = B2DVars.PLAYER;
fdef.filter.maskBits = B2DVars.BIT_PLATFORMS;
body.createFixture(fdef).setUserData("foot");
player = new Player(body);
body.setUserData(player);
}
现在平台工作的原因是因为我正在使用一个系统(可在此处找到:http://bitbucket.dermetfan.net/libgdx-utils/wiki/Box2DMapObjectParser)从平铺地图中读取对象(使用平铺地图编辑器),并使用它们制作身体和固定装置。我禁用了系统,以防它因导致错误而负责,但不,盒子仍然存在同样的问题!
顺便说一下,教程中的游戏的窗口尺寸与我的不同。但是,将它们切换到教程中的尺寸,仍然没有问题,所以这不是问题。
我做错了什么?其余代码都很好(我什至回到教程的源代码只是为了让我的代码相同)!
【问题讨论】: