gpt4 book ai didi

android - Box2d 碰撞断言错误

转载 作者:行者123 更新时间:2023-11-29 01:40:17 24 4
gpt4 key购买 nike

我正在使用 AndEngine anchor-center 分支所以我不能使用 PhysicsEditor自唯一的解析器 PhysicsEditor-AndEngine 以来创建主体/夹具它有点过时并且不支持 anchor 中心,所以我想我可以改用 R.U.B.E,它是 AndEngineRubeLoaderExtension .到目前为止一切顺利,我可以用它们所有复杂的固定装置创建我的 body ,因为 RUBE 会(自动)将它们分成凸多边形。

解析器工作得很好,我有我的 body 。但我遇到了一些碰撞错误:

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)

body 是一架飞机。如果我使用 RUBE 模型,当我与多个对象碰撞时会出现此异常(用户必须捕获一些硬币并与敌人分开(也是 RUBE 模型)),相反,如果我使用 BoxBody,一切都很好。

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

谢谢。

编辑:我忘了说我正在用 RUBE 创建我的 body ,但我在创建那个 body 时并没有使用 RUBE 创建的世界,所以这是我用来在我的世界中创建那个 body 的代码:

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)。这种方法也失败了,不知道为什么。

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

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com