我使用的是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/