В приложении я задаю случайные кадры квадратам каждый раз, когда оно запускается. Я использую эту логику, чтобы убедиться,
а) каждый квадрат находится не слишком близко к игроку
и
б) каждый квадрат содержится в поле зрения на экране в) ни один квадрат не касается другого квадрата
for(UIButton* button in squareArray) {
BOOL shouldContinue = YES;
do {
int randX = arc4random() % 321;
int randY = arc4random() % 481;
button.frame = CGRectMake(randX, randY, button.frame.size.width, button.frame.size.height);
CGRect playerRect = CGRectMake(100, 180, 120, 120);
for(UIButton* b in squareArray)
if(!CGRectIntersectsRect(b.frame, button.frame) &&
!CGRectIntersectsRect(button.frame, playerRect) &&
CGRectContainsRect(self.view.frame, button.frame)) {
shouldContinue = NO;
}
} while (shouldContinue);
}
С этим кодом я ожидал бы, что каждый квадрат в SquareArray будет (после завершения цикла) полностью внутри границ представления, не пересекаясь ни с какими другими кнопками в массиве, и полностью вне границ прямоугольника playerRect , представляющий собой квадрат 120 х 120 в центре экрана. Мой код неправильный? Потому что я не получаю ни одной из этих функций.
Редактировать: на самом деле я получаю одну из желаемых черт этого метода: ни один квадрат никогда не пересекает playerRect. Но я все еще получаю квадраты, перекрывающие друг друга, и квадраты, которые частично не видны.
Редактировать 2:
Я внес эти изменения во вложенный цикл for:
for(UIButton* b in squareArray)
if(![b isEqual:button]) {
if(CGRectIntersectsRect(b.frame, button.frame) ||
CGRectIntersectsRect(button.frame, playerRect) ||
!CGRectContainsRect(CGRectMake(10, 10, 300, 460), button.frame))
shouldContinue = YES;
else
shouldContinue = NO;
}
И теперь квадраты всегда находятся внутри немного измененного (меньшего) прямоугольника для представления и никогда не пересекают квадрат игрока. Ура. Но они все равно появляются друг над другом. Почему?