Форум программистов, компьютерный форум CyberForum.ru

Выполнить код в цыкле один раз - Objective-C

Восстановить пароль Регистрация
 
landan
7 / 7 / 0
Регистрация: 07.07.2010
Сообщений: 157
19.11.2012, 02:08     Выполнить код в цыкле один раз #1
Здравствуйте, имеется такой код:
Objective-C
1
[[CCScheduler sharedScheduler] scheduleSelector:@selector(update:) forTarget:self interval:0.01 paused:NO];
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
-(void) update:(ccTime)dt{
 
    for (CCSprite* anEnemy in marray)
    {
        for(CCSprite* aBullet in marray2)
        {
            CGRect rectForBullet=CGRectMake(aBullet.position.x-(aBullet.contentSize.width)/2, 
                                            aBullet.position.y-(aBullet.contentSize.height)/2,
                                            aBullet.contentSize.width, 
                                            aBullet.contentSize.height);
            
            CGRect rectForEnemy=CGRectMake(anEnemy.position.x-(anEnemy.contentSize.width)/2, 
                                           anEnemy.position.y-(anEnemy.contentSize.height)/2,
                                           anEnemy.contentSize.width, 
                                           anEnemy.contentSize.height);
            
            if (CGRectIntersectsRect(rectForEnemy, rectForBullet)) 
            {
                    [asteroidBatchNode removeChild:asteroid0 cleanup:YES];
                    [self createExplosion:anEnemy.position];
            }
        }
    }
}
Тут проверяется пересекание объектов и при истине нужный объект должен удаляться. Но проблема в том, что код внутри
Objective-C
1
2
3
4
5
if (CGRectIntersectsRect(rectForEnemy, rectForBullet)) 
            {
                    [asteroidBatchNode removeChild:asteroid0 cleanup:YES];
                    [self createExplosion:anEnemy.position];
            }
выполняется слишком много раз и [asteroidBatchNode removeChild:asteroid0 cleanup:YES]; пытается удалить уже не существующий объект, и соответственно эффект взрыва [self createExplosion:anEnemy.position]; также выполняется слишком много раз. Как сделать, что-бы в тот момент когда один объект пересекается с другим, код в условии if (CGRectIntersectsRect(rectForEnemy, rectForBullet)) выполнялся только один раз. Первое, что пришло в голову, это
Objective-C
1
2
3
4
5
6
7
8
9
int qwert=0;
...
if (CGRectIntersectsRect(rectForEnemy, rectForBullet)) 
            {      
if(qwert==0){
                    [asteroidBatchNode removeChild:asteroid0 cleanup:YES];
                    [self createExplosion:anEnemy.position];
qwert=1;}
            }
Но в таком случаи будет удаляться только первый-пересекшийся объект, не понятно где обнулить qwert.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.11.2012, 02:08     Выполнить код в цыкле один раз
Посмотрите здесь:

Objective-C Помогите, каждый раз выдает ошибку
Как выполнить код только один раз (при запуске программы?) VBA
Как в цикле можно выполнить действие один раз? C++
Objective-C Получение координат раз в n минут в бэкграунде. Get location every n minute in background
Как выполнить код при запуске приложения один раз? C#
Как выполнить процедуру один раз не отключая таймера Delphi

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zulkis
 Аватар для zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
19.11.2012, 19:12     Выполнить код в цыкле один раз #2

Не по теме:

цИкл

...

Добавлено через 9 минут
Цитата Сообщение от landan Посмотреть сообщение
CGRect rectForBullet=CGRectMake(aBullet.position.x-(aBullet.contentSize.width)/2,
* * * * * * * * * * * * * * * * * * * * * * aBullet.position.y-(aBullet.contentSize.height)/2,
* * * * * * * * * * * * * * * * * * * * * * aBullet.contentSize.width,
* * * * * * * * * * * * * * * * * * * * * * aBullet.contentSize.height);
CGRect rectForEnemy=CGRectMake(anEnemy.position.x-(anEnemy.contentSize.width)/2,
* * * * * * * * * * * * * * * * * * * * * *anEnemy.position.y-(anEnemy.contentSize.height)/2,
* * * * * * * * * * * * * * * * * * * * * *anEnemy.contentSize.width,
* * * * * * * * * * * * * * * * * * * * * *anEnemy.contentSize.height);
А зачем такие сложности? Как бы rect можно и просто так у sprite взять...

А насчет удаления - я не понимаю проблемы...
Ну нашли вы объект, который нужно удалить - удалили и break; не?

Добавлено через 5 минут
Objective-C
1
2
3
4
5
if (CGRectIntersectsRect(rectForEnemy, rectForBullet)) 
            {
                    [asteroidBatchNode removeChild:asteroid0 cleanup:YES];
                    [self createExplosion:anEnemy.position];
            }
И вот эта штука должна удалять anEnemy тогда уж.
И еще нужно вынести определение ректа для enemy за 2й цикл. А еще правильнее будет поменять их местами, ибо пулю же вы не удаляете при столкновении, только астероид(anEnemy)...
landan
7 / 7 / 0
Регистрация: 07.07.2010
Сообщений: 157
19.11.2012, 21:08  [ТС]     Выполнить код в цыкле один раз #3
Помогло удаление anEnemy из marray, но пришлось сменить foreach на обычный for.
zulkis
 Аватар для zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
20.11.2012, 01:11     Выполнить код в цыкле один раз #4
Потому что нельзя удалять объект из массива во время работы fast enumeration.

Добавлено через 56 секунд
Точнее можно, но тогда нужно прекращать выполнение цикла после удаления.
Yandex
Объявления
20.11.2012, 01:11     Выполнить код в цыкле один раз
Ответ Создать тему
Опции темы

Текущее время: 05:33. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru