Android AndEngine GLES1在Box2D碰撞崩溃应用程序期间销毁和创建对象

Android AndEngine GLES1在Box2D碰撞崩溃应用程序期间销毁和创建对象,android,box2d,andengine,Android,Box2d,Andengine,我还在做一个连锁反应游戏的实现。我有很多粒子在屏幕上反弹,用户可以点击屏幕创建一个“粘性”粒子 当任何普通粒子击中用户的粘性粒子时,该普通粒子也需要变得粘性,因此任何击中它的东西都会变得粘性,等等连锁反应 但是,当普通球第一次与用户的粘球碰撞时,应用程序会在LogCat中崩溃,并出现以下错误: 0x0000005c处的致命信号11 SIGSGV代码=1,线程24936 以下是我在检测到碰撞时使用的函数。我已对导致错误的行进行了注释: private void ParticleCollis

我还在做一个连锁反应游戏的实现。我有很多粒子在屏幕上反弹,用户可以点击屏幕创建一个“粘性”粒子

当任何普通粒子击中用户的粘性粒子时,该普通粒子也需要变得粘性,因此任何击中它的东西都会变得粘性,等等连锁反应

但是,当普通球第一次与用户的粘球碰撞时,应用程序会在LogCat中崩溃,并出现以下错误:

0x0000005c处的致命信号11 SIGSGV代码=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方法的mpphysisWorld.setContactListener中有该代码,但我了解到您无法在ContactListener中创建实体。所以,我把代码移到了你看到的函数中,我从ContactListener调用了它

如果您对我的错误有任何意见或建议,我们将不胜感激


谢谢

在Step函数中,您无法更改世界上的任何内容。您需要在Step函数之后创建新的实体

如果您试图在contact listener回调中销毁实体,同样的问题也会发生,这似乎是一种更常见的情况,因此您可以尝试搜索与删除实体相关的问题,例如


典型的方法是拥有某种列表,可以从调用步骤的主循环和联系人侦听器内部访问该列表。通过添加到列表中,记下需要修改的内容,然后在Step函数之后的主循环中,您可以执行更改。

可能的重复项无法更改Step函数中的任何内容。在Step function.iforce2d之后创建新的主体-这是否意味着我不能修改ContactListener中的主体和装置?我是否应该在contact listener中标记对象,然后在LoadScene方法中更新主体/装置?iforce2d-如果您可以将注释更新为答案,我将接受它。谢谢你的指导!!