Логика CGRect в Cocos2d

Я портирую 2D-игру с UIKit на Cocos2d. Одна его часть, которая устанавливает рамки для пяти разных квадратов, выглядела так, когда я использовал UIKit:

- (void)setFrames {
    [playerSquare setCenter:CGPointMake(160, 240)];

    for(int iii = 0; iii < [squares count]; iii++) {
        int randX = arc4random() % 321;
        int randY = arc4random() % 481;

        [(UIButton*)[squares objectAtIndex:iii] setFrame:CGRectMake(randX, randY, [(UIButton*)[squares objectAtIndex:iii] frame].size.width, [(UIButton*)[squares objectAtIndex:iii] frame].size.height)];

        CGRect playerRect = CGRectMake(80, 160, 160, 160);

        for(UIButton* b in squares) {
            if((CGRectIntersectsRect(b.frame, [(UIButton*)[squares objectAtIndex:iii] frame]) && ![b isEqual:[squares objectAtIndex:iii]])) {
                //make sure no two squares touch
                iii--;
                break;
            } else if(CGRectIntersectsRect(playerRect, [(UIButton*)[squares objectAtIndex:iii] frame])) {
                //no square is close to center of the screen
                iii--;
                break;
            } else if(!CGRectContainsRect(CGRectMake(10, 10, 300, 460), [(UIButton*)[squares objectAtIndex:iii] frame])) {
                //no square is close to the edges of the screen
                iii--;
                break;
            }
        }
    }
}

До сих пор я пытался сделать то же самое в cocos2d:

- (void)setFrames {
    for(int idx = 0; idx < [squares count]; idx--) {
        int randX = arc4random() % 321;
        int randY = arc4random() % 481;

        [(CCSprite*)[squares objectAtIndex:idx] setPosition:ccp(randX, randY)];

        CGRect playerRect = CGRectMake(80, 160, 160, 160);

        for(CCSprite* b in squares) {
            if( (CGRectIntersectsRect(b.boundingBox, [(CCSprite*)[squares objectAtIndex:idx] boundingBox]) && ![b isEqual:[squares objectAtIndex:idx]]) ) {
                //make sure no two squares touch
                idx--;
                break;
            } else if(CGRectIntersectsRect(playerRect, [(CCSprite*)[squares objectAtIndex:idx] boundingBox])) {
                //no square is close to center of the screen
                idx--;
                break;
            } else if(!CGRectContainsRect(CGRectMake(10, 10, 300, 460), [(CCSprite*)[squares objectAtIndex:idx] boundingBox])) {
                //no square is close to the edges of the screen
                idx--;
                break;
            }
        }
    }
}

Но этот модифицированный метод не работает. Один из квадратов помещается в правильное положение, но остальные четыре всегда появляются в точке cocos2d 0, 0. (нижний левый угол экрана) Кто-нибудь может указать мне правильное направление?


person eric.mitchell    schedule 29.12.2011    source источник
comment
Что такое координаты randX randY? Я предполагаю, что они вряд ли будут равны 0,0 для 3 из 4 спрайтов, поэтому я могу только представить, что вы снова измените положение где-то еще.   -  person LearnCocos2D    schedule 30.12.2011
comment
Посмотрите еще раз на объявление цикла for :) Все станет ясно.   -  person eric.mitchell    schedule 30.12.2011


Ответы (1)


Я только что понял проблему - не могу поверить, что сделал это. В какой-то момент в этом методе я установил цикл for как:

for(int idx = [squares count] - 1; idx >= 0; idx--)

вместо

for(int idx = 0; idx < [squares count]; idx++)

Как вы можете видеть в приведенном выше коде, я забыл изменить часть цикла с уменьшением на увеличение с уменьшения. Итак, причина, по которой устанавливался только первый спрайт, заключалась в том, что цикл начинался с 0, затем idx уменьшалось до тех пор, пока не превышало нижнюю границу int и не достигало верхней границы ints, что было больше [squares count]. Итак, единственная проблема с моим новым кодом заключалась в разнице между idx++ и idx--.

Разочаровывающая ошибка.

person eric.mitchell    schedule 29.12.2011