странный контакт между телами - PullRequest
0 голосов
/ 14 ноября 2011

У меня странная проблема.выстрел моих игроков, когда он сталкивается с телом, уничтожает его без проблем, но, когда он попадает в два тела одновременно, он падает.

стреляющий игрок

b2Body *shooting = [_lhelper newBodyWithUniqueName:@"shoot" world:_world];
CCSprite *shootingSprite = (CCSprite *)shootingBody->GetUserData();
shootingBody.position = pos;
shootingBody->SetTransform(b2Vec2(pos.x/PTM_RATIO, 
                               pos.y/PTM_RATIO), 
                        CC_DEGREES_TO_RADIANS(angle));

контакт

if([spriteA tag] == ENEMY && [spriteB tag] == SHOT)
{


    int animIdx = [(NSNumber*)[spriteA userData] intValue];
    if(animIdx < 2)
    {
        [spriteA setTextureRect:MY_RECTS[animIdx]];
        [spriteA setUserData:[NSNumber numberWithInt:animIdx+1]];
    }
    else
    {
        [objectThatWillBeDeleted addObject:[NSValue valueWithPointer:bodyA]];

    }

    [objectThatWillBeDeleted addObject:[NSValue valueWithPointer:bodyB]];

}
else if([spriteB tag] == ENEMY && [spriteA tag] == SHOT)
{


    int animIdx = [(NSNumber*)[spriteB userData] intValue];

    if(animIdx < 2)
    {        
        [spriteB setTextureRect:MY_RECTS[animIdx]];    
        [spriteA setUserData:[NSNumber numberWithInt:animIdx+1]];
    }
    else
    {
        [objectThatWillBeDeleted addObject:[NSValue valueWithPointer:bodyB]];
    }

    [objectThatWillBeDeleted addObject:[NSValue valueWithPointer:bodyA]];

}

обновление

    std::vector<Contact>::iterator pos;
for(pos = _contactListener->_contacts.begin(); 
    pos != _contactListener->_contacts.end(); ++pos) 
{
    Contact contact = *pos;

    //[self checkBodies2:&contact];         

}


for(NSValue* val in objectThatWillBeDeleted)
{
    b2Body* body = (b2Body*)[val pointerValue];
    [_lhelper removeBody:body];
}

    [objectThatWillBeDeleted removeAllObjects];
}

}

Не понимаю, где ошибка.

1 Ответ

1 голос
/ 14 ноября 2011

Я тоже не понимаю, где ошибка, потому что вы не сказали, где она падает :) Но я думаю, вы пытаетесь уничтожить одно и то же тело дважды.

Когда выстрел поражает двух врагов за один и тот же шаг по времени, тело выстрела добавляется в список objectThatWillBeDeleted дважды.Вам просто нужно сделать этот список уникальным, прежде чем уничтожить его содержимое.

...