Форум программистов, компьютерный форум, киберфорум
Наши страницы
Objective-C
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
landan
7 / 7 / 0
Регистрация: 07.07.2010
Сообщений: 157
1

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

19.11.2012, 02:08. Просмотров 835. Ответов 3
Метки нет (Все метки)

Здравствуйте, имеется такой код:
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.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.11.2012, 02:08
Ответы с готовыми решениями:

Выводится картинка на view сразу при запуске программы и только один раз
Ну собственно это продолжение вопроса на мой предыдущий вопрос про вывод...

Как выполнить код при запуске приложения один раз?
Изучая c# столкнулся с проблемой - как выполнить код при запуске приложения...

Как выполнить код только один раз (при запуске программы?)
Как известно, At module level, you can use only comments and declarative...

Как выполнить действие один раз?
Всем привет. Есть функция в конце которой есть вывод в текст бокс, как сделать...

Как в цикле выполнить определенное действие один раз?
for (int i = 0; i < Notes.Count; i++) { ...

3
zulkis
684 / 611 / 43
Регистрация: 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)...
0
landan
7 / 7 / 0
Регистрация: 07.07.2010
Сообщений: 157
19.11.2012, 21:08  [ТС] 3
Помогло удаление anEnemy из marray, но пришлось сменить foreach на обычный for.
0
zulkis
684 / 611 / 43
Регистрация: 13.01.2011
Сообщений: 1,724
20.11.2012, 01:11 4
Потому что нельзя удалять объект из массива во время работы fast enumeration.

Добавлено через 56 секунд
Точнее можно, но тогда нужно прекращать выполнение цикла после удаления.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.11.2012, 01:11

Как в цикле можно выполнить действие один раз?
Есть цикл, который выполняется n раз. Но 1 действие в этом цикле необходимо...

Как выполнить процедуру один раз не отключая таймера
Доброе время суток, скажите пожалуйста как можно реализовать выполнения...

уникальный код для входа на опрос. код действителен только один раз
Привет всем! возникла проблема типа "как воплотить в жизнь" в php. Сценарий...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru