#objective-c #cocos2d-iphone #local-variables
#objective-c #cocos2d-iphone #локальные переменные
Вопрос:
Я наблюдаю некоторое странное поведение с локальной переменной во вложенном цикле for в objective-c.
Приведенный ниже код перебирает NSMutableArray, называемый visitors, размер которого может варьироваться от 1 до 20.
Я сохраняю локальную копию объекта в позиции i, а затем обрабатываю его ограничивающую рамку.
Затем я снова перебираю массив в рамках первого цикла, выбирая второй объект из списка и определяя его ограничивающую рамку.
Проверка на коллизию почти никогда не выполняется, когда объекты на экране перемещаются по кругу.
Когда я выполняю код с помощью отладчика, я наблюдаю во втором цикле for, что после установки переменной visitor2 она с этого момента никогда не меняется. Он продолжает указывать на тот же объект, пока вызов функции не будет завершен.
Все объекты в массиве visitors определенно являются полностью уникальными объектами, поскольку один и тот же объект не добавляется в массив дважды, я обязательно проверил это.
Я понятия не имею, что может быть причиной этого, я никогда не видел ничего подобного. Буду признателен за любую помощь.
Вот мой код:
for (int i = 0; i < [visitors count]; i )
{
// Obtain visitor from the list
Visitor* visitor1 = [visitors objectAtIndex: i];
// Calculate it's bounding box
CGRect visitor1rect = CGRectMake(visitor1.position.x - visitor1.size.x/2,
visitor1.position.y - visitor1.size.y/2,
visitor1.size.x, visitor1.size.y);
// Loop through all other visitors
for (int j = 0; j < [visitors count]; j )
{
// Don't check for a collision with self
if (i != j)
{
// Obtain a visitor from the list
Visitor* visitor2 = [visitors objectAtIndex: j];
// Calculate it's bounding box
CGRect visitor2rect = CGRectMake(visitor2.position.x - visitor2.size.x/2,
visitor2.position.y - visitor2.size.y/2,
visitor2.size.x, visitor2.size.y);
// Chcek of the two bounding boxes intersect
if ( CGRectContainsRect(visitor1rect, visitor2rect) ) {
// Do stuff
}
}
}
}
Комментарии:
1. Если вы инициализируете j как
int j = i 1
, вы проведете вдвое меньше тестов на столкновение, и вам не придется тестироватьi != j
… предполагая, что вы действительно собирались использоватьCGRectIntersectsRect
.2. Не знаю, как я раньше об этом не подумал. Приветствия.
Ответ №1:
Используйте CGRectIntersectsRect
для вашего теста пересечения вместо «содержит», что означает что-то другое. Если это устраняет вашу проблему, я бы предположил, что отладчик просто лжет вам о том, на что visitor2
указывает — код выглядит нормально.
Комментарии:
1. Я подумал, что делаю что-то глупое вроде этого, и отладчик просто барахлит. Огромное спасибо.