2016-09-02 9 views
0

私はボールが地面に直接衝突したとき、私のゲームに3体、上から落ちるボールの動体、静的な地面、またはキネマティックボディは重力の下でその罰金、しかし、ボールが最初に地面に動的なボディと衝突し、その後地面にバウンスすると、奇妙なことがスプライトの葉の体を発生し、画面から飛ぶ。 私はそれを理解するためにBox2DDebugRendererを使いました。地面の私のコードはここにある if(ground!= null)world.destroyBody(ground);スプライト画像は、Libgdxの静的地面に衝突した後にその動的なボディを残した

BodyDef bodyDef = new BodyDef(); 
    bodyDef.type = BodyDef.BodyType.StaticBody; 

    FixtureDef fixtureDef = new FixtureDef(); 

    PolygonShape shape = new PolygonShape(); 
    shape.setAsBox(camera.viewportWidth, 5); 

    fixtureDef.shape = shape; 
    fixtureDef.friction=0.2f; 
    fixtureDef.filter.categoryBits = WORLD_ENTITY; 
    fixtureDef.filter.maskBits = PHYSICS_ENTITY; 

    ground = world.createBody(bodyDef); 
    ground.createFixture(fixtureDef); 
    ground.setTransform(0, 0, 0); 

    shape.dispose();' 

地面

private Body createBody(String name, float x, float y, float rotation) { 
     BodyDef bodyDef = new BodyDef(); 
     bodyDef.type = BodyDef.BodyType.DynamicBody; 
     Body body = playerPhysics.createBody(name, world, bodyDef, SCALE, SCALE); 

     body.setTransform(x, y, rotation); 
     body.setLinearDamping(50f); 
     body.setGravityScale(0); 
     body.setFixedRotation(true); 


     return body; 
    } 

の体のための私のコードは、メソッドを作成中に連絡処理する方法

@Override 
    public void render() { 
     Gdx.gl.glClearColor(0.57f, 0.77f, 0.85f, 1); 
     Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 
     stepWorld(); 
     viewport.apply(); 
     elapsedTime+=Gdx.graphics.getDeltaTime(); 


     position =playerBody.getPosition(); 

     float width =player.getRegionWidth()*SCALE; 
     float height=player.getRegionHeight()*SCALE; 

     batch.begin(); 
      if (Gdx.input.isKeyPressed(Input.Keys.SPACE)) 
       batch.draw(headerAnimation.getKeyFrame(elapsedTime,true),position.x,position.y,width,height); 
       else drawSprite("2",position.x,position.y); 

     for (Body body : ballBodies) { 
      body.applyTorque(torque, false); 
      ball.setRotation((float) Math.toDegrees(body.getAngle())); 
      batch.draw(ball, body.getPosition().x-ball.getWidth()/2,body.getPosition().y-ball.getWidth()/2, ball.getOriginX() 
        , ball.getOriginY(), ball.getWidth(), ball.getHeight(), ball.getScaleX(), ball. 
          getScaleY(), ball.getRotation()); 
     } 

     if (TimeUtils.millis() - lastDropTime > 3000) dropBall(); 

     Iterator<Body> iterator = ballBodies.iterator(); 
     while (iterator.hasNext()) { 
      Body body = iterator.next(); 
      if (body.getPosition().y<=7&&body.getLinearVelocity().len()<0.4f&& 
        body.getAngularVelocity()<0.4f) { 

       world.destroyBody(body); 
       iterator.remove(); 
      } 
     } 

     batch.end(); 

     debugRenderer.render(world, camera.combined); 
    } 

コードをレンダリング私の体

public Body dropBall() { 
     Body body; 
     BodyDef bodyDef = new BodyDef(); 
     bodyDef.type = BodyDef.BodyType.DynamicBody; 
     bodyDef.position.set(MathUtils.random(0,50),50); 
     body = world.createBody(bodyDef); 
     ballBodies.add(body); 
     CircleShape circleShape = new CircleShape(); 
     circleShape.setPosition(new Vector2(0, 0)); 
     circleShape.setRadius(25*SCALE); 
     FixtureDef fixtureDef = new FixtureDef(); 
     fixtureDef.shape = circleShape; 
     fixtureDef.density = 0.1f; 
     fixtureDef.restitution = 0.7f; 
     fixtureDef.filter.categoryBits = PHYSICS_ENTITY; 
     fixtureDef.filter.maskBits = WORLD_ENTITY; 
     body.createFixture(fixtureDef); 
       circleShape.dispose(); 


     lastDropTime = TimeUtils.millis(); 
     return body; 


    } 

を落下ための私のコード

public void beginContact(Contact contact) { 
       if((contact.getFixtureA().getBody() == ballBody) && 
         (contact.getFixtureB().getBody()==playerBody) 
         || (contact.getFixtureA().getBody() == playerBody 
         && contact.getFixtureB().getBody()==ballBody)) { 
        ballBody.applyForceToCenter(20f,20f,true); 

       } 
       if((contact.getFixtureA().getBody() == ballBody) && 
         (contact.getFixtureB().getBody()==ground) 
         || (contact.getFixtureA().getBody() == ground 
         && contact.getFixtureB().getBody()==ballBody)) { 
        ballBody.applyForceToCenter(0,50f,true); 

       } 

      } 

第2の衝突すなわち地面に問題があります。 PLZはこれを解決するために私に教えてください?

+0

は、なぜあなたは 'ballBody.applyForceToCenter(20F、20F、真)'を使用DOU役に立つかもしれあなたの体のそれぞれにコード行を追加しますか? 'beginContact()'メソッド全体をコメント/削除します。ボール本体の復元は、バウンスを処理する必要があります。 –

+0

回答ありがとう、私はすでに試してみましたが、すべての連絡先リスナーの部分を削除しました。問題は同じです、スプライトは2回目の連絡の後に本体を外しています – Kharak

答えて

0

broが、ちょうど

body.setFixedRotation=true; 
+0

ありがとう、それは私のために働くが、 – Kharak

関連する問題