我有一个问题。我正在使用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的一半。所以,如果我把50放入hx,它实际上将是100。
shape.setAsBox(100/ PPM, 100 / PPM); <- Box
shape.setAsBox(99/ PPM, 99/ PPM); <- No Box
好像我从未创造过形状或装置......
所以我做了一些测试。我试过了:
setAsBox(99 * 2 / PPM, 99 * 2 / PPM).
猜猜......没事!
然后我使用了那个确切的陈述,但用100作为值。 Woah一个巨大的盒子!
然后,如果我这样做:
setAsBox(99 / PPM, 100 / PPM)
我上面有一条巨线(在Y轴上)。
然后,如果我这样做:
setAsBox(100 / PPM, 99 / PPM)
我在前面得到一条巨线(在X轴上)。
所以我首先忽略了这个问题。但是现在当我想加载精灵(基本上是我创建了玩家)时,形状问题阻止了我与平台的正确碰撞。
令人惊讶的是,玩家精灵决定在我创建的平台中途摔倒并停止下降(好像发生了碰撞。只有当hx和xy低于100(因此没有框)时才会发生这种情况。 但是如果我他们已经100或者更高,那么框出现并且我有正确的碰撞(除了由于框的大小,玩家精灵/位置在空中大声笑)。
现在为了检测玩家的碰撞,我创建了一个脚踏传感器,它位于玩家的下方。我这里也有问题。我创建一个盒子,并为它的中心位置赋予它一个Vector2。 Vector 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)从平铺地图中读取对象(使用平铺地图编辑器),并制作一个主体和夹具离开他们我通过导致错误禁用了系统,但是不行,仍然是盒子的问题!
本教程中的游戏有不同的窗口尺寸。但是,将它们切换到教程中的维度仍然没有问题,所以这不是问题。
我做错了什么?剩下的代码很好(我甚至回到教程的源代码只是为了让我的代码完全相同)!
答案 0 :(得分:0)
如果您的PPM定义为100,则它具有int
类型。因此,当你写99 / PPM
时它实际为零,因为将整数除以整数提供了一个被截断的整数。将您的PPM更改为100.0f
(因此其类型现为float
)