2016-05-13 9 views
0

Ich versuche, ein einfaches Beispiel mit den Reibungsverbindungen von box2d zu machen. Ich habe einen Kreis erstellt, der mit der Maus oder den Pfeiltasten gesteuert werden kann. Es gibt auch eine Box, die mit dem Kreis geschoben werden soll. Das Problem ist, dass wenn ich die Box schiebe, es sich für immer bewegt. Ich habe eine zusätzliche statische Box hinzugefügt, so dass ich beide Boxen mit einer Reibungsverbindung verbinden kann, um die Reibung von oben nach unten zu simulieren. Aber es funktioniert nicht. Hier ist der Code.libgdx box2d Reibungsverbindung funktioniert nicht

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); 

    } 

} 

Was mache ich falsch?

+0

das Sie vielleicht etwas Hilfe http://stackoverflow.com/questions/11182997/in-libgdx-how-do-i-add-friction-to-a-box2d-body-object – Tauqir

+0

Dank geben. Ich denke, ich habe diese Frage schon gesehen, bevor ich meine gepostet habe. Aber es ist nicht dasselbe. Die andere Frage betrifft die Reibung, wenn zwei Körper in Kontakt kommen. In meiner Frage beziehe ich mich auf Reibungsverbindungen, die auch dann wirksam sein sollten, wenn die Körper nicht in Kontakt kommen. Trotzdem danke ! – user1754322

Antwort

0

Ich fand es heraus. Es scheint, dass, um die Reibung bemerkbar zu machen, sehr hohe Werte auf maxForce und maxTorque eingestellt werden müssen.

frictionJointDef.maxForce = 1000000; 
frictionJointDef.maxTorque = 10000000; 
Verwandte Themen