java - body 在不施加任何力的情况下移动? (方框2d)

标签 java box2d libgdx

所以我正在 2d 盒子中制作游戏。在一个部分中,我需要一个具有恒定弹跳高度的球。我将球的恢复设置为 1,并且不对其施加任何力(当然重力除外)。现在,这个球在每次弹跳时都会弹得更高一点,直到它离开屏幕的顶部边缘。这段代码有什么问题?

    public class Ball implements ApplicationListener {
 World world ;  
 Box2DDebugRenderer debugRenderer;  
 OrthographicCamera camera;  
 static final float BOX_STEP=1/60f;  
 static final int BOX_VELOCITY_ITERATIONS=8;  
 static final int BOX_POSITION_ITERATIONS=3;  
 static final float WORLD_TO_BOX=0.01f;  
 static final float BOX_WORLD_TO=100f;  
 Rectangle ball;
 Body body;
 /* (non-Javadoc)
 * @see com.badlogic.gdx.ApplicationListener#create()
 */
@Override  
 public void create() {
     world = new World(new Vector2(0, -10), true);
      camera = new OrthographicCamera(); 

      camera.viewportHeight = 480;  
      camera.viewportWidth = 800;  
      camera.position.set(camera.viewportWidth * .5f, camera.viewportHeight * .5f, 0f);  
      camera.update();
      //Ground body  
      BodyDef groundBodyDef =new BodyDef();  
      groundBodyDef.position.set(new Vector2(0, 10 * WORLD_TO_BOX));  
      Body groundBody = world.createBody(groundBodyDef);  
      PolygonShape groundBox = new PolygonShape();
      float w = (camera.viewportWidth * 2) * WORLD_TO_BOX;
      float h = 10.0f * WORLD_TO_BOX;
      groundBox.setAsBox(w,h);  
      groundBody.createFixture(groundBox, 0.0f); 
      String a="gb";
      groundBody.setUserData(a);
      //Dynamic Body  
      BodyDef bodyDef = new BodyDef();  
      bodyDef.type = BodyType.DynamicBody;  
      float posX = (camera.viewportWidth / 8) * WORLD_TO_BOX;
      float posY = (camera.viewportHeight / 2) * WORLD_TO_BOX;
      bodyDef.position.set(posX, posY);
      body = world.createBody(bodyDef);  
   // create a Rectangle to logically represent the ball
      CircleShape dynamicCircle = new CircleShape();  
      dynamicCircle.setRadius(1f);  
      FixtureDef fixtureDef = new FixtureDef();  
      fixtureDef.shape = dynamicCircle;  
      fixtureDef.density = 1.0f;  
      fixtureDef.friction = 0.0f;  
      fixtureDef.restitution =1f;
      body.createFixture(fixtureDef);
      debugRenderer = new Box2DDebugRenderer();  
 }
 @Override  
 public void dispose() {  
 }  
 @Override  
 public void render() {            
      Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);  
      debugProjection.set(camera.combined);
      debugProjection.scl(BOX_WORLD_TO);
      debugRenderer.render(world, debugProjection);  
      world.step(BOX_STEP, BOX_VELOCITY_ITERATIONS, BOX_POSITION_ITERATIONS);
          }



 @Override  
 public void resize(int width, int height) {  
 }  
 @Override  
 public void pause() {  
 }  
 @Override  
 public void resume() {  
 }  
}

最佳答案

这可能是由 numerical instability 引起的。重复计算球的位置不可避免地会引入微小的数值误差(因为 float 只能容纳有限数量的数字)。这些可能会随着迭代、反弹而不断增长和累加。

你可以尝试使用恢复0.9999999之类的。但很可能没有恢复值可以提供所需的结果。

尝试主动补偿数值不稳定性,例如通过在可以非迭代计算值的情况下控制球的位置和/或速度。 (我不知道Box2D。也许当球落地时你可以重置它的速度或其他什么。)

关于java - body 在不施加任何力的情况下移动? (方框2d),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20016142/

相关文章:

java - 在没有特定于 Flash 的服务器的情况下在 Java 和 Flash 之间进行通信

java - 如果变量为空,如何删除行

java - HashMap 没有得到预期的输出?

java - LibGDX instanceof 和这个

java - 悬停时显示信息或文本的 Libgdx UI

java - .Net 中生成的 SHA1 哈希的 java 等价物是什么?

java - 使用 box2d 和 libgdx 中的顶点构建镜像体

java - 关于 OrthographicCamera 的 libGDX

java - 将 BitmapFont.draw 从自定义 Actor 添加到 ScrollPane/Table

system - Libgdx - 如何仅在按住鼠标按钮时生成粒子?