我使用的是AndEngine锚定中心分支,所以我不能使用PhysicsEditor创建实体/夹具,因为唯一的解析器PhysicsEditor-AndEngine有点过时了,不支持锚定中心,所以我想我可以请改用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;
    }


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

编辑2:
因此,我替换了以下代码:

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


问题仍然存在。

最佳答案

我遵循了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没有重复的正文

关于android - Box2d碰撞断言错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25109761/

10-11 20:10