AndEngine GLES1在Box2D碰撞期间摧毁并创建对象崩溃应用程序

时间:2014-06-06 13:38:17

标签: android box2d andengine

我正在(仍在)实施连锁反应游戏。我有很多粒子在屏幕周围弹跳,用户可以点击屏幕创建一个单一的粘性'颗粒

当任何正常粒子撞击使用者的粘性粒子时,正常粒子也需要变粘,所以击中它的任何东西都会变粘,等等(连锁反应吧!)

然而,当普通球第一次与用户的粘球碰撞时,应用程序在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调用它。

对于我的错误提出任何意见或建议将不胜感激!!

谢谢!

1 个答案:

答案 0 :(得分:0)

您无法在Step功能中更改世界上的任何内容。您需要在Step功能之后创建新的主体。

如果你试图破坏联系人监听器回调中的一个主体,也会出现同样的问题,这似乎是一个更常见的情况,所以你可以尝试搜索与删除主体有关的问题,例如。 AndEngine Sprite/Box2D Body removal crashes my program with no error/exception information?

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