我正在使用基于box2d的游戏,它检测到我的玩家身体与敌人的身体相撞,但是当我在敌人的关键点为敌人编写destroybody方法时,我的敌人无法摧毁并出错,我的应用程序崩溃了。 我告诉你我的代码
std::vector<b2Body *>toDestroy;
std::vector<MyContact>::iterator pos;
for(pos = contactListener->_contacts.begin();
pos != contactListener->_contacts.end(); ++pos) {
MyContact contact = *pos;
b2Body *bodyA = contact.fixtureA->GetBody();
b2Body *bodyB = contact.fixtureB->GetBody();
if (bodyA->GetUserData() != NULL && bodyB->GetUserData() != NULL)
{
CCSprite *spriteA = (CCSprite *) bodyA->GetUserData();
CCSprite *spriteB = (CCSprite *) bodyB->GetUserData();
if (spriteA.tag == 1 && spriteB.tag == 2)
{
// SpriteA = PlayerSprite
// SpriteB = EnemySprite
NSString *t=[NSString stringWithFormat:@"Game Over"];
label.string=t;
[self removeChild:spriteB cleanup:YES];
world->DestroyBody(bodyB);
}
else if (spriteA.tag == 2 && spriteB.tag == 1)
{
//toDestroy.push_back(bodyB);
NSLog(@"Enemy Touch");
}
}
}
这里我的spriteB无法销毁。 还有一件事是敌人的精灵进入了Enemy.mm文件。
请帮助我,我遇到了这个问题。 提前致谢
答案 0 :(得分:0)
你制造一个基本的错误,处理敌人与玩家接触敌人的联系(它只是事物的顺序),你应该对待这两种情况,因为你不知道他们到达的顺序。 你也没有正确使用toDestroy。
std::vector<b2Body *>toDestroy;
std::vector<MyContact>::iterator pos;
for(pos = contactListener->_contacts.begin();
pos != contactListener->_contacts.end(); ++pos) {
MyContact contact = *pos;
b2Body *bodyA = contact.fixtureA->GetBody();
b2Body *bodyB = contact.fixtureB->GetBody();
if (bodyA->GetUserData() != NULL && bodyB->GetUserData() != NULL)
{
CCSprite *spriteA = (CCSprite *) bodyA->GetUserData();
CCSprite *spriteB = (CCSprite *) bodyB->GetUserData();
if ((spriteA.tag == 1 && spriteB.tag == 2) ||(spriteA.tag == 2 && spriteB.tag == 1))
{
// SpriteA = PlayerSprite
// SpriteB = EnemySprite
NSString *t=[NSString stringWithFormat:@"Game Over"];
label.string=t;
[self removeChild:spriteB cleanup:YES];
toDestroy.push_back(bodyB);
}
}
}
//iterate and delete everything from toDestroy