2014-01-10 21 views
0

我一直在使用AndEngine一年,现在感觉是时候转向某些物理。 我跟着AndEngine物理示例开始了一个滚球游戏,使用加速度计将球引导到一个洞中,在屏幕上滚动球。 我把我的球滚动OK,但不能让它掉进洞里。我已经谷歌搜索,并尝试了一切,但我可​​以得到的最好的是球与孔相撞,或者反弹或翻转它。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)); 

蒂亚是我的洞。

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

这是我的场景onCreateScene()的一些代码,我已经试过里面ContactListener。

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

已解决。

在[Removing Body completely 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); 
       } 
      } 
     }); 
    } 

希望这会帮助别人。

相关问题