Я изучаю основы Box2D, используя LibGDX.Сегодня я прихожу к вам, ребята, потому что мне сложно понять, как работает Velocity.Я на самом деле использую два тела: одно DynamicBody (для игрока) и одно StaticBody (земля).На изображении это выглядит так: game_screen На данный момент все в порядке, я добавил систему управления, которая позволяет игроку использовать стрелки для перемещения (очевидно, вверх, влево и вправо).Проблема возникает, когда я хочу идти влево / вправо, когда используется Body.setLinearVelocity (somevalue, 0) , он движется хорошо, но у меня все еще есть небольшая величина Y скорость , котораяЯ не хочуЯ очень думаю, что это вызвано землей (каким-то образом с трением или что-то вроде этого), но я действительно ничего не знаю о физике в целом, поэтому я не могу сказать точно.Я хочу знать, есть ли способ переместить игрока влево и вправо с Y Linearvelocity на 0. Кстати, я хочу, чтобы Y LinearVelocity равнялся 0, потому что я использую «StateComponent», который он устанавливаетсостояние «Прыжок», если Y LinearVelocity больше 0. Код выглядит следующим образом:
@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;
Я также загрузил видео , на этом видео вы можете видеть, что когда я использую левую или правую клавишу со стрелкой для перемещения, скорость Y достигает значения, равного 0,000000001.Есть идеи почему?