В приложении я даю случайные кадры квадратам каждый раз, когда оно запускается. Я использую эту логику, чтобы убедиться,
а) каждый квадрат не слишком близко к игроку
и
б) каждый квадрат содержится внутри экрана
в) ни один квадрат не касается другого квадрата
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 в центре экрана. Мой код неверен? Потому что я не получаю ни одной из этих функций.
Edit: я действительно получаю одну из желаемых черт этого метода: ни один квадрат никогда не пересекает 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;
}
И теперь квадраты всегда находятся внутри слегка измененного (меньшего) прямоугольника для вида, и они никогда не пересекают квадрат игрока. Ура. Но они все равно появляются друг на друге. Почему?