【问题标题】:Andengine Box2d replace sprite with anotherAndengine Box2d 用另一个替换精灵
【发布时间】:2014-01-10 06:42:10
【问题描述】:

我已经使用 AndEngine 一年了,觉得是时候继续学习一些物理学了。 我按照 AndEngine 物理示例开始了一个滚球游戏,其中一个球在屏幕上滚动,使用加速度计将其引导到一个洞中。 我的球滚动正常,但不能让它掉进洞里。我用谷歌搜索并尝试了所有方法,但我能得到的最好结果是球与球洞相撞,要么弹开,要么滚过球洞。

这里有一些代码。

这是我的球。

    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 是我的洞。

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

这是我在 Scene 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
        }    
}

谁能解释一下如何将球换成球或其他方式来模拟球落入球内。 谢谢

【问题讨论】:

    标签: android box2d andengine collision-detection


    【解决方案1】:

    已解决。

    在 [Removing Body fully1] 找到了解决方案。您必须删除孔并在单独的线程中重置球。
    我创建了一个新方法 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();
                ......
    

    还有swap方法。

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

    希望这对其他人有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多