2016-05-13 14 views
0

私はbox2dの摩擦ジョイントを使って簡単な例を作ろうとしています。私は、マウスまたは矢印キーで制御できる円を作成しました。円で押されるためのボックスもあります。問題は、私がボックスを押すと永遠に動き続けることです。補助スタティックボックスを追加したので、両方のボックスを摩擦ジョイントで結合してトップダウン摩擦をシミュレートすることができます。しかし、それは動作しません。ここにコードがあります。libgdx box2d摩擦ジョイントが動作しない

public class MyGdxGame extends ApplicationAdapter { 

    Camera camera; 
    int windowWidth, windowHeight; 

    World physicsWorld; 
    Box2DDebugRenderer debugRenderer; 

    Body frictionerBox; 

    Body boxBody; 
    Body circleBody; 

    @Override 
    public void create() { 
     camera = new OrthographicCamera(2, 2); 

     Box2D.init(); 
     physicsWorld = new World(new Vector2(0, 0), true); 
     debugRenderer = new Box2DDebugRenderer(); 

     // frictioner box 
     BodyDef bDef = new BodyDef(); 
     bDef.type = BodyDef.BodyType.StaticBody; 
     bDef.position.set(0, 0); 
     frictionerBox = physicsWorld.createBody(bDef); 
     PolygonShape fShape = new PolygonShape(); 
     fShape.setAsBox(10, 10); 
     FixtureDef fixDef = new FixtureDef(); 
     fixDef.shape = fShape; 
     fixDef.density = 1.f; 
     fixDef.friction = 1.f; 
     //Fixture fix = 
      frictionerBox.createFixture(fixDef); 

     // box 
     bDef = new BodyDef(); 
     bDef.type = BodyDef.BodyType.DynamicBody; 
     bDef.position.set(0, 50); 
     boxBody = physicsWorld.createBody(bDef); 
     PolygonShape bShape = new PolygonShape(); 
     bShape.setAsBox(25, 25); 
     fixDef = new FixtureDef(); 
     fixDef.shape = bShape; 
     fixDef.density = 1.f; 
     fixDef.friction = 1.f; 
     boxBody.createFixture(fixDef); 

     // circle 
     BodyDef cDef = new BodyDef(); 
     cDef.type = BodyDef.BodyType.DynamicBody; 
     cDef.position.set(20, 20); 
     circleBody = physicsWorld.createBody(cDef); 
     CircleShape cShape = new CircleShape(); 
     cShape.setRadius(12); 
     fixDef = new FixtureDef(); 
     fixDef.shape = cShape; 
     fixDef.density = 1.f; 
     circleBody.createFixture(fixDef); 

     FrictionJointDef frictionJointDef = new FrictionJointDef(); 
     frictionJointDef.maxForce = 10; 
     frictionJointDef.maxTorque = 10; 
     frictionJointDef.initialize(frictionerBox, boxBody, new Vector2(0, 0)); 
     physicsWorld.createJoint(frictionJointDef); 

     bShape.dispose(); 
     cShape.dispose(); 
     fShape.dispose(); 
    } 

    @Override 
    public void render() {  

     handleInput(); 

     physicsWorld.step(Gdx.graphics.getDeltaTime(), 6, 2); 


     Gdx.gl.glClearColor(0.2f, 0.2f, 0.2f, 1); 
     Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 

     debugRenderer.render(physicsWorld, camera.combined); 

    } 


    @Override 
    public void resize(int width, int height) 
    { 
     camera.viewportWidth = width; 
     camera.viewportHeight = height; 
     camera.update(); 
     windowWidth = width; 
     windowHeight = height; 
     System.out.println("resized"); 
    } 

    private void handleInput() 
    { 
     final float ARROW_SPEED = 60.0f; 
     final float MAX_SPEED = 200.f; 
     final float MIN_SPEED = 20.f; 
     float vx, vy; 
     if(Gdx.input.isTouched() || Gdx.input.isButtonPressed(Input.Buttons.LEFT)) 
     { 
      int tx = (Gdx.input.getX() - windowWidth/2); 
      int ty = -Gdx.input.getY() + windowHeight/2; 
      float cx = camera.position.x; 
      float cy = camera.position.y; 
      float px = circleBody.getPosition().x; 
      float py = circleBody.getPosition().y; 
      px = px - cx; 
      py = py - cy; 
      vx = tx - px; 
      vy = ty - py; 
      float speed = (float) Math.sqrt(vx*vx + vy*vy); 
      if(speed > MAX_SPEED) 
      { 
       vx = (vx/speed) * MAX_SPEED; 
       vy = (vy/speed) * MAX_SPEED; 
      } 
      if(speed > 0 && speed < MIN_SPEED) 
      { 
       vx = (vx/speed) * MIN_SPEED; 
       vy = (vy/speed) * MIN_SPEED; 
      } 
     } 

     else 
     { 
      vx = vy = 0; 
      if(Gdx.input.isKeyPressed(Input.Keys.W)) 
      { 
       vy += 1; 
      } 
      if(Gdx.input.isKeyPressed(Input.Keys.S)) 
      { 
       vy -= 1; 
      } 
      if(Gdx.input.isKeyPressed(Input.Keys.A)) 
      { 
       vx -= 1; 
      } 
      if(Gdx.input.isKeyPressed(Input.Keys.D)) 
      { 
       vx += 1; 
      } 
      float speed = (float) Math.sqrt(vx*vx + vy*vy); 
      if(speed > 0.f) 
      { 
       vx = (vx/speed) * ARROW_SPEED; 
       vy = (vy/speed) * ARROW_SPEED; 
      } 
     } 

     circleBody.setLinearVelocity(vx, vy); 

    } 

} 

私は間違っていますか?

+0

これはあなたにいくつかの助けhttp://stackoverflow.com/questions/11182997/in-libgdx-how-do-i-add-friction-to-a-box2d-body-object – Tauqir

+0

感謝を与えるかもしれません。私は私の記事を投稿する前にすでにこの質問を見たと思います。しかし、それは同じではありません。もう1つの質問は、2つの物体が接触したときの摩擦に関する質問です。私の質問では、身体が接触しなくても効果があるはずの摩擦ジョイントを参照します。とにかくありがとうございました ! – user1754322

答えて

0

私はそれを理解しました。摩擦が目立つようにするには、非常に高い値をmaxForcemaxTorqueに設定する必要があります。

frictionJointDef.maxForce = 1000000; 
frictionJointDef.maxTorque = 10000000; 
関連する問題