"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