我正在使用 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();
}
问题仍然存在。
答案 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
没有重复的主体