Удаление спрайтов из массива в physicscollision

#objective-c #cocos2d-iphone

#objective-c #cocos2d-iphone

Вопрос:

     - (BOOL)ccPhysicsCollisionBegin:(CCPhysicsCollisionPair *)pair monsterCollision:    (CCNode *)monster projectileCollision:(CCNode *)projectile {

    for (CCSprite *spr in spriteArray)
    {
        if (_monster1.lives == 0) 
        {
            NSMutableArray *spritesToRemove = [[NSMutableArray alloc] init];                
            // Remove the sprite from its parent here.
            [spr removeFromParent];
            // However, leave the "spr" in ssprites array - just "mark" it for deletion.
            [spritesToRemove addObject:spr];

            if ([spritesToRemove count]> 0) {

                [spriteArray removeObjectsInArray:spritesToRemove];
            }
        }
    }

[projectile removeFromParent];
return YES;
 

}

Я получаю сообщение об ошибке:

* Завершение работы приложения из-за неперехваченного исключения ‘NSRangeException’, причина: ‘* — [__NSArrayM objectAtIndex:]: индекс 0 выходит за пределы пустого массива’.

Я хочу, чтобы произошло следующее: когда монстр поражен, если его жизни равны 0, он удаляется из физического мира. Независимо от того, где я помещаю бит removeobjects, я получаю ту же ошибку. Спасибо. Это было исправлено путем перемещения бита removeObjects за пределы цикла. Следующий бит — это то, почему я этого хотел, чтобы удалить монстра из этого массива, возможно, я иду неправильным путем, и вы можете получить его из физического тела монстра, которого я не знаю.

     -(void)update:(CCTime)delta
    {

 int multiplier = 0;

for (CCSprite* tempSprite in spriteArray)
{
    CGPoint nodePosition = tempSprite.position;


    if (nodePosition.x > 470) {

    multiplier  ;

    structurelife = structurelife-(1*multiplier);

    }


}
 

}

Комментарии:

1. переместите [spriteArray removeObjectsInArray:spritesToRemove]; после цикла for . В нынешнем виде вы пытаетесь удалять спрайты на каждой итерации.

2. Ваш код немного запутанный, и я бы предложил его переписать. Основываясь на том, что вы написали, что вам следует делать, это посмотреть, нужно ли удалять этого монстра, который был поражен, со сцены. Но почему вы смотрите на что-то под названием _monster, когда это не обязательно монстр, который был поражен (при условии, что их больше одного)? Почему вы перебираете что-либо в этом методе? Похоже, в цикле нет смысла. Почему у вас есть временный массив объектов для удаления, в котором будет только 1 элемент, основанный на том, что вы написали, просто чтобы удалить их в следующей строке?

3. Это исправлено, спасибо. @AllenS Я хочу добавить экземпляры монстров в spriteArray, а затем проверить каждый отдельный спрайт в массиве, чтобы узнать, есть ли у него 0 жизней, а затем удалить его. Я создал класс Monster, который создает экземпляры monster1 с целым числом жизней. Если этот monster1 добавлен в массив, как я могу проверить жизни каждого из них? Вы правы, это нужно переписать, так как теперь все монстры удаляются, когда я убиваю одного, я просто не знаю, как это сделать.

4. Почему вы удаляете других монстров из массива в методе столкновения, вызванном другим монстром? Ваш физический метод выглядит так, как будто он проходит через монстра, который попал в него? Почему бы просто не вычесть жизнь из этого монстра, посмотреть, равна ли жизнь 0, и если да, удалить этого монстра? Основываясь на коде, который вы опубликовали в этой теме и в другой, я еще не вижу необходимости иметь массив монстров. Если единственная цель массива — определить, у какого монстра 0 жизней, то вам это не нужно. Всякий раз, когда попадает монстр, вы уже знаете о нем. Просто протестируйте этого монстра и удалите, если 0.

5. Причина создания массива заключается в том, чтобы постоянно проверять положение каждого монстра, если они находятся за линией на оси x, то это считается потерей вами жизни. Может быть, я иду по этому пути совершенно неправильно, я не знаю, я просто экспериментирую, чтобы посмотреть, что работает.