Логика CGRect в Cocos2d - PullRequest
       39

Логика CGRect в Cocos2d

2 голосов
/ 29 декабря 2011

Я портирую 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. (нижний левый угол экрана) Может кто-нибудь направить меня в правильном направлении?

1 Ответ

1 голос
/ 30 декабря 2011

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

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

вместо

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

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

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

...