2014-01-10 3 views
0

Я использую AndEngine уже год и чувствую, что пришло время перейти к какой-то физике. Я следовал примеру физики AndEngine, чтобы начать игру «Roll-a-Ball», где мяч прокручивается по экрану с помощью акселерометра, чтобы направлять его в отверстие. Я получил мяч, свернувшийся в норму, но он не может попасть в отверстие. Я Googled и пробовал все, но лучшее, что я могу получить, это мяч сталкивается с отверстием и либо отскакивает от него, либо перекатывается над ним.Andengine Box2d заменит спрайт другим

Вот код.

Это мой мяч.

ball = new AnimatedSprite(pX, pY,this.mBallFaceTextureRegion,this.getVertexBufferObjectManager()); 
    bodyBall = PhysicsFactory.createCircleBody(this.mPhysicsWorld,ball,BodyType.DynamicBody, FIXTURE_DEF); 
    bodyBall.setUserData("Ball"); 
    ball.animate(200); 

    this.mScene.attachChild(ball); 
    this.mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(ball, bodyBall, true, true)); 

Thia is my hole.

hole = new Sprite(pX, pY, this.hHoleFaceTextureRegion, this.getVertexBufferObjectManager()); 
    bodyHole = PhysicsFactory.createCircleBody(this.mPhysicsWorld, hole, BodyType.StaticBody, FIXTURE_DEF); 
    bodyHole.setUserData("Hole"); // ID for hole 
    this.mScene.attachChild(hole); 
    this.mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(hole, bodyHole, false, false)); 

Это мой ContactListener внутри сцены onCreateScene() с некоторыми из кода, который я пробовал.

this.mPhysicsWorld.setContactListener(new ContactListener() { 
    @Override 
    public void beginContact(final Contact pContact) { 
     final Body BodyA = pContact.getFixtureA().getBody(); 
     final Body BodyB = pContact.getFixtureB().getBody(); 

     if(BodyA.getUserData() == "Ball" && BodyB.getUserData() == "Hole"){ 
      ball.setPosition(hole); 
      // BodyA.setType(BodyType.StaticBody); // bodyBall 
      //mPhysicsWorld.destroyBody(BodyB); // bodyHole 
     }else if(BodyA.getUserData() == "Hole" && BodyB.getUserData() == "Ball"){ 
      ball.setPosition(hole); 
      // BodyB.setType(BodyType.StaticBody); // bodyBall 
      // hole.dispose(); // bodyHole 
     }  
} 

Может кто-то пожалуйста, объясните, как поменять отверстие для шарика или каким-либо другим способом, чтобы симулировать мяч сбросив в отверстие. СООБЩЕНИЕ

ответ

0

РЕШЕНИЕ.

Обнаружено решение на [Снятие кузова полностью 1]. Вы должны удалить отверстие и сбросить мяч в отдельном потоке.
Я создал новый метод SwapHoleAndBall() и вызвал его из beginContact.

Вот модифицированный код.

public void beginContact(final Contact pContact) { 
     final Body BodyA = pContact.getFixtureA().getBody(); 
     final Body BodyB = pContact.getFixtureB().getBody(); 

     if(BodyA.getUserData() == "Ball" && BodyB.getUserData() == "Hole"){ 
      SwapHoleAndBall(); 
      ...... 

И метод подкачки.

public void SwapHoleAndBall() { 
    final PhysicsConnector physicsConnector = 
      mPhysicsWorld.getPhysicsConnectorManager().findPhysicsConnectorByShape(hole); 

     mEngine.runOnUpdateThread(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       if (physicsConnector != null) 
       { 
        bodyBall.setTransform(bodyHole.getPosition(), 0); 
        mPhysicsWorld.unregisterPhysicsConnector(physicsConnector); 
        bodyHole.setActive(false); 
        mPhysicsWorld.destroyBody(bodyHole); 
        mScene.detachChild(hole); 
        bodyBall.setType(BodyType.StaticBody); 
       } 
      } 
     }); 
    } 

Надеюсь, это поможет кому-то еще.

Смежные вопросы