2016-09-02 1 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); 

       } 

      } 

두 번째 충돌, 즉 접지에 문제가 있습니다. PLZ 이걸 해결하라고 말해?

+0

가 왜'ballBody.applyForceToCenter (20F, 20F, TRUE)'를 사용 DOU 도움이 될 수있는 당신의 몸의 각 코드 줄을 추가? 'beginContact()'메소드 전체를 주석 처리/삭제하십시오. 공 몸체의 복원은 튀는 소리를 처리해야합니다. –

+0

응답 주셔서 감사합니다, 나는 이미 시도하고 모든 연락처 수신기 부분을 제거, 문제가 동일합니다, 스프라이트는 두 번째 연락처 – Kharak

답변

0

형제, 그냥

body.setFixedRotation=true; 
+0

덕분에 몸을 분리하는 것입니다, 그것은 나를 위해 작동하지만 어떻게 문제가 어떤 설명을 해결 해야할지 모르겠다? – Kharak