Box2d冲突断言错误

时间:2014-08-03 22:33:00

标签: android box2d andengine jbox2d

我正在使用 AndEngine锚点中心分支,所以我无法使用PhysicsEditor来创建实体/灯具,因为唯一的解析器PhysicsEditor-AndEngine&# 39;有点过时并且不支持锚定中心,所以我认为我可以使用RUBE而不是它AndEngineRubeLoaderExtension。到目前为止,我可以使用所有复杂的灯具创建我的身体,因为RUBE会将它们分成凸多边形(自动)。

解析器效果很好,我的身体也很好。但是我遇到了一些碰撞错误:

A/libc﹕ jni/Box2D/Dynamics/Contacts/b2ContactSolver.cpp:72: b2ContactSolver::b2ContactSolver(b2ContactSolverDef*): assertion "pointCount > 0" failed

A/libc﹕ Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1), thread 32158 (UpdateThread)

身体是飞机。如果我使用RUBE模型,当我碰到多个物体时(用户必须抓住一些硬币并与敌人分开(RUBE模型)),我得到这个例外,相反,如果我使用BoxBody,一切都很好。

让我想知道它是否与构成身体的非凸多边形有关(即使RUBE正确地创造了它们)......发生在任何人身上?

感谢。

修改 我忘了说我用RUBE创造了自己的身体,但是当我创建那个身体时我没有使用RUBE创建的世界,所以这里是我用来创建那个身体的代码我的世界:

private Body createPolygonBody(PhysicsWorld pPhysicsWorld, IShape pShape, BodyDef.BodyType pBodyType, FixtureDef pFixtureDef, Jb2dJsonLoader jsonLoader, String fixtureName) {
        BodyDef boxBodyDef = new BodyDef();
        boxBodyDef.type = pBodyType;

        float[] sceneCenterCoordinates = pShape.getSceneCenterCoordinates();
        boxBodyDef.position.x = sceneCenterCoordinates[Constants.VERTEX_INDEX_X] / PhysicsConstants.PIXEL_TO_METER_RATIO_DEFAULT;
        boxBodyDef.position.y = sceneCenterCoordinates[Constants.VERTEX_INDEX_Y] / PhysicsConstants.PIXEL_TO_METER_RATIO_DEFAULT;

        Body rubeBody = jsonLoader.getBodyByName(fixtureName);
        Body boxBody = pPhysicsWorld.createBody(boxBodyDef);
        // boxBody.setTransform(rubeBody.getPosition(), rubeBody.getAngle());
        boxBody.setLinearVelocity(rubeBody.getLinearVelocity());
        boxBody.setLinearDamping(rubeBody.getLinearDamping());
        boxBody.setAngularVelocity(rubeBody.getAngularVelocity());
        boxBody.setAngularDamping(rubeBody.getAngularDamping());
        boxBody.setSleepingAllowed(rubeBody.isSleepingAllowed());
        boxBody.setAwake(rubeBody.isAwake());
        boxBody.setFixedRotation(rubeBody.isFixedRotation());
        boxBody.setBullet(rubeBody.isBullet());
        boxBody.setActive(rubeBody.isActive());
        boxBody.setMassData(rubeBody.getMassData());

        Fixture[] bodyFixtures = jsonLoader.getFixturesByName(fixtureName);
        for (int i = 0; i < bodyFixtures.length; i++) {
            FixtureDef fixtureDef = pFixtureDef;
            fixtureDef.shape = bodyFixtures[i].getShape();
            boxBody.createFixture(fixtureDef);
        }
        return boxBody;
    }

也许这就是问题所在。我做的一切都正确吗?

EDIT2: 所以我已经替换了这段代码:

private void performCoinCollision(boolean coinIsBodyA, Contact contact) {
    if (coinIsBodyA) {
       contact.getFixtureA().setSensor(true);
    } else {
       contact.getFixtureB().setSensor(true);
    }
    contact.setEnabled(false);
    ...
}

使用:

private void performCoinCollision(boolean coinIsBodyA, Contact contact) {
    if (coinIsBodyA) {
       elementsToBeRemoved.add(contact.getFixtureA().getBody());
    } else {
       elementsToBeRemoved.add(contact.getFixtureB().getBody());
    }
    contact.setEnabled(false);
...
}

并将此onUpdate添加到physicWorld:

@Override
public void onUpdate(float pSecondsElapsed) {
    if (elementsToBeRemoved != null) {
        for (Body body : elementsToBeRemoved) {
            if (body != null) {
                physicsWorld.destroyBody(body);
            }
        }
    }
    elementsToBeRemoved.clear();
}

问题仍然存在。

1 个答案:

答案 0 :(得分:1)

我已经按照 iforce2d 建议,这是正确的程序,现在它正在运作:

private void performCoinCollision(boolean coinIsBodyA, Contact contact) {
    if (coinIsBodyA) {
       elementsToBeRemoved.add(contact.getFixtureA());
    } else {
       elementsToBeRemoved.add(contact.getFixtureB());
    }
    contact.setEnabled(false);
...
}

...

@Override
public void onUpdate(float pSecondsElapsed) {
    if (elementsToBeRemoved != null) {
        for (Fixture fixture : elementsToBeRemoved) {
             fixture.setSensor(true);
        }
    }
    elementsToBeRemoved.clear();
}

注意:在我的 EDIT2 中我正在采用相同的方法,而不是setSensor(true)我正在尝试删除正文。那种做法也失败了,不知道为什么。

编辑:问题是我试图摧毁已经被摧毁的尸体。解决方案是确保elementsToBeRemoved没有重复的主体