【问题标题】:Andengine: PhysicsFactory.createCircleBody is creating a square body.. why?Andengine:PhysicsFactory.createCircleBody 正在创建一个方形体.. 为什么?
【发布时间】:2015-04-08 20:23:36
【问题描述】:

我正在使用它来创建一个玩家身体

private void addPlayer(){ 
        // viral -- add player
        final float startX = (CAMERA_WIDTH - this.mPlayerTextureRegion
                .getWidth()) / 2;
        final float startY = CAMERA_HEIGHT + 100;
        this.playerFace = new Sprite(startX, startY, this.mPlayerTextureRegion,
                this.getVertexBufferObjectManager());
        this.playerBody = PhysicsFactory.createCircleBody(this.mPhysicsWorld,
                playerFace, BodyType.DynamicBody, FIXTURE_DEF);
        final PhysicsHandler physicsHandler = new PhysicsHandler(playerFace);
        playerFace.registerUpdateHandler(physicsHandler);
        playerBody.setBullet(true);

        playerFaceHalfWidth = playerFace.getWidth() / 2;
        playerFaceHalfHeight = playerFace.getHeight() / 2;

        this.mScene.attachChild(playerFace);
        playerFace.setY(CAMERA_HEIGHT - playerFaceHalfHeight * 2);
    }

这就是我检测与其他精灵碰撞的方式:

protected void onManagedUpdate(float pSecondsElapsed) {
                if (playerFace.collidesWith(this)) {
                    // safe of touching border - else game over
                    if (!isPlayerInSafeZone()) {
                        Log.w("cd", "Game Over");
                        isGameInProgress = false;
                        mScene.setIgnoreUpdate(true);
                        processLevelEnd();
                    }
                }
            };

现在的问题是,即使我添加了一个圆形主体,当其他精灵接触玩家的 png 角时,也会检测到与玩家的碰撞。它是一个透明区域,图像中只有一个圆圈,为它创建了身体。为什么会这样?上面的代码有什么问题?

::根据 Lucaz 的输入更新:

这是我的联系人

private ContactListener createContactListener()
{
ContactListener contactListener = new ContactListener()
{
    @Override
    public void beginContact(Contact contact)
    {
        final Fixture x1 = contact.getFixtureA();
        final Fixture x2 = contact.getFixtureB();
        final String x1id = (String) x1.getBody().getUserData();
        final String x2id = (String) x2.getBody().getUserData();
        Log.w("cd", "x1 = " + x1id + " --- x2 = " + x2id);
    }

    @Override
    public void endContact(Contact contact)
    {

    }

    @Override
    public void preSolve(Contact contact, Manifold oldManifold)
    {

    }

    @Override
    public void postSolve(Contact contact, ContactImpulse impulse)
    {

    }
};
return contactListener;
}

这就是我为玩家和其他精灵设置用户数据的方式:

玩家:

    this.playerFace = new Sprite(startX, startY, this.mPlayerTextureRegion,
            this.getVertexBufferObjectManager());
    this.playerBody = PhysicsFactory.createCircleBody(this.mPhysicsWorld,
            playerFace, BodyType.DynamicBody, FIXTURE_DEF);
    playerBody.setBullet(true);
    playerBody.setUserData("player");

其他精灵(球):

    body = PhysicsFactory.createCircleBody(this.mPhysicsWorld, face,
            BodyType.DynamicBody, FIXTURE_DEF);
    body.setLinearVelocity(vector2);
    body.setBullet(true);
    body.setUserData("ball");

这就是我将监听器添加到物理世界的方式

this.mPhysicsWorld.setContactListener(createContactListener());

监听器被编写为打印碰撞对象的用户数据:

但是当一个精灵与玩家发生碰撞时,我得到了玩家的空值,但另一个精灵的用户数据如下所示......如何解决这个问题?

x1 = null --- x2 = ball

【问题讨论】:

  • 切换到 ContactListner 后,它会检测除玩家之外的所有精灵之间的碰撞...... :-((最重要的一个)......玩家身体/面部的设置方式有什么问题?

标签: android box2d andengine


【解决方案1】:

这是因为 collidesWith() 方法检查的是精灵的碰撞,而不是物体的碰撞。因此它会检查两个精灵是否重叠(即使它们是 png 图像,它们也将被视为不透明的矩形)。要检查物体之间的碰撞,还有另一种方法:

private ContactListener createContactListener()
{
ContactListener contactListener = new ContactListener()
{
    @Override
    public void beginContact(Contact contact)
    {
        final Fixture x1 = contact.getFixtureA();
        final Fixture x2 = contact.getFixtureB();
    }

    @Override
    public void endContact(Contact contact)
    {

    }

    @Override
    public void preSolve(Contact contact, Manifold oldManifold)
    {

    }

    @Override
    public void postSolve(Contact contact, ContactImpulse impulse)
    {

    }
};
return contactListener;
}

请看这个简单的教程:

http://www.matim-dev.com/handling-collisions-between-bodies.html

【讨论】:

  • 感谢卢卡兹!我试过这个,只有一个问题......当我为其他精灵主体设置用户数据时,我可以在联系监听器中获取它,但是当我为玩家主体设置用户数据时,我总是得到空......知道为什么吗?玩家身体创建代码有问题。
  • 另外,获取用户数据是识别对象的最佳方式吗?有没有更好的方法?
  • 我认为没有更好的方法,但如果它有帮助,您可以为所有同类物体使用一个名称(例如,枪支中的所有子弹都可以称为“bullet”而不是“bullet1” , bullet2" 等等)。关于你的玩家名字,你能发布你的联系人监听器是如何构建的吗?你的实际代码?
  • @Lukaz:用代码更新了问题......请看一下,如果我做错了什么,请告诉我......
  • 现在它正在检测除玩家之外的所有精灵之间的碰撞...... :-((最重要的一个)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-10
  • 2020-04-22
  • 2020-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-15
相关资源
最近更新 更多