我正在使用LibGDX学习Box2D的基础知识。我今天来到你们这里是因为我很难理解Velocity的工作原理。 我实际上使用了两个主体:一个是DynamicBody(用于播放器),另一个是StaticBody(地面)。在图片中看起来像这样: game_screen 现在,没有错,我接下来添加了一个ControlSystem,它允许玩家使用方向箭头移动(明显地向上,向左和向右)。问题出在我想向左/向右走时,每当使用 Body.setLinearVelocity(somevalue,0)时,它移动得很好,但是我仍然有 Y速度 >我不想要的。我高度认为这是由地面引起的(某种程度上是由摩擦或类似的东西引起的),但是我对一般物理学一无所知,所以我不能说真的。我想知道是否有一种方法可以将 Y Linearvelocity 设置为0左右移动播放器。 顺便说一句,我希望将此Y LinearVelocity设置为0,因为如果 Y LinearVelocity大于0,我使用一个“ StateComponent”将状态设置为“ JUMPING”。 代码如下:
@Override
protected void processEntity(Entity entity, float deltaTime) {
BodyComponent bodyComp = bodm.get(entity);
StateCompent state = sm.get(entity);
TextureComponent texComp = texm.get(entity);
if(bodyComp.body.getLinearVelocity().y > 0){
state.set(StateCompent.STATE_FALLING);
}
if(bodyComp.body.getLinearVelocity().y == 0){
if(state.get() == StateCompent.STATE_FALLING){
state.set(StateCompent.STATE_NORMAL);
}
if(bodyComp.body.getLinearVelocity().x != 0){
state.set(StateCompent.STATE_MOVING);
}
}
if(controller.left){
bodyComp.body.setLinearVelocity(MathUtils.lerp(bodyComp.body.getLinearVelocity().x, -2f, 0.2f),bodyComp.body.getLinearVelocity().y);
if(!texComp.region.isFlipX()){
texComp.region.flip(true, false);
}
}
if(controller.right){
bodyComp.body.setLinearVelocity(MathUtils.lerp(bodyComp.body.getLinearVelocity().x, 2f, 0.2f),bodyComp.body.getLinearVelocity().y);
if(texComp.region.isFlipX()){
texComp.region.flip(true, false);
}
}
if(!controller.left && ! controller.right){
bodyComp.body.setLinearVelocity(MathUtils.lerp(bodyComp.body.getLinearVelocity().x, 0, 0.1f),bodyComp.body.getLinearVelocity().y);
}
if(controller.up && (state.get() == StateCompent.STATE_NORMAL || state.get() == StateCompent.STATE_MOVING)){
bodyComp.body.applyLinearImpulse(0,10f, bodyComp.body.getWorldCenter().x, bodyComp.body.getWorldCenter().y, true);
state.set(StateCompent.STATE_JUMPING);
}
// Hud to delete later
hudBatch.begin();
layout.setText(font, " X velocity : " + Float.toString(bodyComp.body.getLinearVelocity().x));
font.draw(hudBatch, " X velocity : " + Float.toString(bodyComp.body.getLinearVelocity().x), Gdx.graphics.getWidth() - (layout.width + 20), Gdx.graphics.getHeight() - layout.height);
layout.setText(font, " Y velocity : " + Float.toString(bodyComp.body.getLinearVelocity().y));
font.draw(hudBatch, " Y velocity : " + Float.toString(bodyComp.body.getLinearVelocity().y), Gdx.graphics.getWidth() - (layout.width + 20), Gdx.graphics.getHeight() - (layout.height + 20));
font.draw(hudBatch, "State : " + Integer.toString(state.get()), 20, Gdx.graphics.getHeight() - 20 );
hudBatch.end();
也许需要的话,我的两个身体的FixtureDef:
fixtureDef.density = 1f;
fixtureDef.friction = 0.2f;
fixtureDef.restitution = 0.01f;
我还上传了video,您可以在此视频中看到,当我使用向左或向右箭头键移动Velocity Y时,速度最高可达0,000000001。知道为什么吗?
答案 0 :(得分:0)
大多数物理引擎自然在两个方向上都有一点点速度,尤其是在碰撞过程中。只需将此因素纳入您的跳转检查中即可,例如将阈值略高于0。
答案 1 :(得分:0)
好的,我发现了一些很有趣的东西。由于这个问题,我感到很惊讶,因为我首先关注了this tutorial,并且在其中效果很好。我刚刚注意到,在本教程中,我们为播放器使用了Circle形状,因此我尝试了一下,并且效果很好。可能是因为联系点较少或类似的东西。