"Assertion failed: (m_bodyCount < m_bodyCapacity), function Add, file libs/Box2D/Dynamics/b2Island.h, line 65."
這就是它在控制檯中的崩潰。當我試圖摧毀一個b2Body時,遊戲崩潰,我該怎麼辦?
[self removeChild:(CCSprite*)body->GetUserData() cleanup:YES];
body->SetTransform(b2Vec2(30, 30), 0); //moving the body out of the scene so it doesnt collide anymore!
world->DestroyBody(body);
我想我做了正確的東西..
@property (nonatomic, assign) b2Body *body;
這是我如何「讓」的屬性
我不明白爲什麼它不工作,「身體」是正確的指針,因爲我可以從身體的UserData中檢索信息,比如設置在身體的肌酸中的標籤,所以這不應該是一個問題。有人知道我的代碼有什麼問題嗎?
謝謝。
編輯在:
-(void) tick: (ccTime) dt //Main loop
{
if (ballFired) {
Magnet *aMagnet = [magnetArray objectAtIndex:0];
world->DestroyBody(aMagnet.body); //It crashes here!
}
int32 velocityIterations = 8;
int32 positionIterations = 1;
// Instruct the world to perform a single step of simulation. It is
// generally best to keep the time step and iterations fixed.
world->Step(dt, velocityIterations, positionIterations);
//Iterate over the bodies in the physics world
for (b = world->GetBodyList(); b; b = b->GetNext())
{
if (b->GetUserData() != NULL) {
//Synchronize the AtlasSprites position and rotation with the corresponding body
CCSprite *myActor = (CCSprite*)b->GetUserData();
myActor.position = CGPointMake(b->GetPosition().x * PTM_RATIO, b>GetPosition().y * PTM_RATIO);
myActor.rotation = -1 * CC_RADIANS_TO_DEGREES(b->GetAngle());
}
}
}
心不是這個世界外面解決嗎?
編輯2:
ContactListener::ContactListener(){};
void ContactListener::BeginContact(b2Contact* contact)
{
// Box2d objects that collided
b2Fixture* fixtureA = contact->GetFixtureA();
b2Fixture* fixtureB = contact->GetFixtureB();
CCSprite* actorA = (CCSprite*) fixtureA->GetBody()->GetUserData();
CCSprite* actorB = (CCSprite*) fixtureB->GetBody()->GetUserData();
if(actorA == nil || actorB == nil) return;
b2WorldManifold* worldManifold = new b2WorldManifold();
contact->GetWorldManifold(worldManifold);
Kollisjon *kollisjon = [Kollisjon sharedKollisjon];
if (actorA.tag == 1) {
NSLog(@"OK1");
kollisjon.kollidertBody = fixtureB->GetBody();
kollisjon.world->DestroyBody(kollisjon.kollidertBody); //Isnt this ok?
}
else if (actorB.tag == 1) {
NSLog(@"OK2");
kollisjon.kollidertBody = fixtureA->GetBody();
kollisjon.world->DestroyBody(kollisjon.kollidertBody); //Isnt this ok?
}
}
這難道不是時間步之外?請幫我在這裏...
謝謝
斷言正在觸發,因爲有更多的身體比能力!這就是我對你的所有,因爲我對這個API沒有經驗。 – Joe
你是否正在嘗試在時間步或中途做到這一點?使用線程也許?我的猜測是你正在重寫引擎內部的東西,看看b2World :: Solve,在開始的時候,島上的最大人體數量被設置爲世界中的身體數量,因爲評論說'最糟糕的案件'。在接下來的主循環('構建並模擬所有喚醒的島嶼')的某個地方,循環變量被弄亂是我能看到的唯一的事情。不要在碰撞回調期間改變世界,如果這就是你正在做的事情。 – iforce2d
如果在我檢測到與ContactListener發生碰撞後摧毀身體就有資格作爲「在回調之後改變世界」,那麼是的,我正在這樣做。 – JulenissensHjelper