我正在(仍在)实施连锁反应游戏。我有很多粒子在屏幕周围弹跳,用户可以点击屏幕创建一个单一的粘性'颗粒
当任何正常粒子撞击使用者的粘性粒子时,正常粒子也需要变粘,所以击中它的任何东西都会变粘,等等(连锁反应吧!)
然而,当普通球第一次与用户的粘球碰撞时,应用程序在LogCat中崩溃并出现以下错误:
致命信号11(SIGSGV)位于0x0000005c(代码= 1),线程24936(链式反应)
这是我在检测到碰撞时使用的函数(我已经注释了导致错误的行):
private void ParticleCollision(Contact contact)
{
if (contact.getFixtureA().getBody().getUserData() != null &&
contact.getFixtureB().getBody().getUserData() != null)
{
final String objA = (String)contact.getFixtureA().getBody().getUserData();
Body bodyA = contact.getFixtureA().getBody();
final String objB = (String)contact.getFixtureB().getBody().getUserData();
Body bodyB = contact.getFixtureB().getBody();
// Get the body objects for each of the bodies in the collision
Body pBody2 = objA.startsWith("particle_") ? bodyA : bodyB;
String cud = (String)pBody2.getUserData();
// Find the normal body in the collision in our mBodyList array
for (int i=0; i < mBodyList.size(); i++)
{
Body b = mBodyList.get(i);
String tud = (String)b.getUserData();
if(cud.equals(tud))
{
// We have a match
// Get the cooresponding Particle (to get it's X/Y pos)
Particle p = mParticleList.get(i);
float x = p.getX();
float y = p.getY();
// Remove the particle that collided from our Lists
mParticleList.remove(i);
mFixtureList.remove(i);
mBodyList.remove(i);
// Remove the particle from the scene and the Body from the PhysicsWorld
mScene.detachChild(p);
mPhysicsWorld.destroyBody(b);
// Create a new sticky particle where the old one was
particle = new Particle(x, y, mPurpleParticleTextureRegion, 100);
particle.setScale(0.3f);
mScene.attachChild(particle);
particleFixture = PhysicsFactory.createFixtureDef(10, 0.9f, 0.1f);
// Using the debugger, I see that this next line is causing the error
particle_body = PhysicsFactory.createBoxBody(mPhysicsWorld, particle, BodyType.StaticBody, particleFixture);
particle_body.setUserData("sticky");
mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(particle, particle_body, true, false));
// Save this info to the sticky particle lists
mStickyParticleList.add(particle);
mStickyBodyList.add(particle_body);
mStickyFixtureList.add(particleFixture);
}
}
}
}
以前我在beginContact()方法的mPhysicsWorld.setContactListener()中有代码,但我读到你无法在ContactListener中创建实体。所以,我将代码移动到你看到的函数,我从ContactListener调用它。
对于我的错误提出任何意见或建议将不胜感激!!
谢谢!
答案 0 :(得分:0)
您无法在Step功能中更改世界上的任何内容。您需要在Step功能之后创建新的主体。
如果你试图破坏联系人监听器回调中的一个主体,也会出现同样的问题,这似乎是一个更常见的情况,所以你可以尝试搜索与删除主体有关的问题,例如。 AndEngine Sprite/Box2D Body removal crashes my program with no error/exception information?
典型的方法是拥有某种列表,可以从主循环(调用Step())和联系人监听器内部访问。通过添加到列表中记下需要修改的内容,并在Step函数之后立即执行主循环,即可执行更改。