[英]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.