簡體   English   中英

Box2D碰撞崩潰時,AndEngine GLES1銷毀並創建對象

[英]AndEngine GLES1 Destroy and Create Object During Box2D Collision crashes app

我正在(仍在)實施“連鎖反應”游戲。 我在屏幕周圍有很多粒子反彈,用戶可以點擊屏幕以創建單個“粘性”粒子。

當任何普通粒子碰到用戶的粘性粒子時,該普通粒子也需要變得發粘,因此擊中它的任何東西都將變為粘性,依此類推(鏈反應正確!)。

但是,普通球第一次與用戶的粘性球相撞時,應用程序崩潰並在LogCat中出現以下錯誤:

致命信號11(SIGSGV)位於0x0000005c(代碼= 1),線程24936(chainreaction)

這是檢測到沖突時使用的功能(我已注釋導致錯誤的行):

    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);
            }
        }
    }
}

以前,我在mPhysicsWorld.setContactListener()中的beginContact()方法中具有該代碼,但是我讀到您無法在ContactListener中創建主體。 因此,我將代碼移到了您看到的函數中,並從ContactListener進行調用。

任何關於我錯的評論或建議,將不勝感激!

謝謝!!

您不能在Step函數中更改世界。 您需要在Step函數之后創建新的主體。

如果您嘗試破壞聯系人偵聽器回調中的主體,則會發生相同的問題,這似乎是更常見的情況,因此您可以嘗試搜索與刪除主體相關的問題,例如。 AndEngine Sprite / Box2D Body刪除使我的程序崩潰,沒有錯誤/異常信息?

典型的方法是具有某種類型的列表,可以從主循環(在其中調用Step()的調用)和聯系偵聽器內部進行訪問。 通過添加到列表中來記錄需要修改的內容,並在緊接Step功能之后的主循環中執行更改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM