Cocos2d - несколько спрайтов на родительском узле, а не на слое

Я пытаюсь разместить серию спрайтов на слое, но поскольку я хочу переместить все спрайты как группу, я создал CocosNode, установил для него тот же размер, что и экран, и разместил его в центре screen, затем добавьте спрайты к этому узлу (lightNode) вместо того, чтобы добавлять их к слою.

Я вижу, что спрайты не отображаются в правильных (одинаковых?) Положениях по сравнению с тем, когда я помещаю их в слой, а не в lightNode.

Я сделал тестовую программу, чтобы показать проблему, используя шаблон приложения XCode Cocos2d «Hello World» - затем я заменил метод -init () класса HelloWorld в HelloWorldScene.m этим кодом.

-(id) init
{
    if( (self=[super init] )) 
    {
        // create my parent node that will contain all the related sprites
        lightPane = [[CocosNode alloc] init];
        CGSize paneSize = { 480, 320 };
        [lightPane setContentSize:paneSize]; 
        [lightPane setPosition:ccp(240, 160)];

        // add pane to layer     
        [self addChild:lightPane z:0];

        // add a series of sprites to demonstrate the problem 
        int y = 40;
        int x;
        for (x=30; x<300; x+=20)
        {
            Sprite *sp = [Sprite spriteWithFile:@"pause.png"];
            [sp setPosition:ccp(x, y)];

            NSLog(@"Next sprite at position (%d, %d)", x, y);

            [lightPane addChild:sp z:1];
            //[self addChild:sp z:1]; 
            x+= 20;
        }
    }
    return self;
}

Этот код ссылается на файл PNG с именем "pause.png" - просто возьмите любое маленькое изображение размером около 30x30 пикселей и поместите его в этот проект, чтобы запустить его.

Вы увидите, что спрайты появляются примерно на полпути экрана, начиная с середины и направляясь вправо.

Если вы закомментируете строку, добавляющую спрайт в lightPane, и не закомментируете строку под ней, а затем повторно запустите образец, вы увидите, что спрайты (правильно) появляются в координатах, которые они должны.

Очевидно, это как-то связано с CocosNode, который я использую как родительский для спрайтов. Кто-нибудь видит, что я здесь делаю не так ??


person Jordan Bigel    schedule 12.12.2009    source источник
comment
правильно сформулированный вопрос и хороший образец кода! +1   -  person nash    schedule 14.12.2009


Ответы (2)


Вы хотите установить положение lightPane на 0,0. По умолчанию положение не центрируется, это нижний левый угол.

person Colin Gislason    schedule 12.12.2009
comment
Дох! По какой-то причине я ожидал, что CocosNode будет вести себя как Sprite - я считаю, что его привязка установлена ​​в центре ?? В любом случае, вы правы, он должен быть на 0,0, а не в центре. Спасибо! - person Jordan Bigel; 12.12.2009
comment
ИЛИ - я установил для узла lightPane значение привязки 0,5,0,5. Могу поклясться, что пробовал это раньше, и это не сработало. Но я думаю, что я установил привязку на 240,160, а не на 0,5, .5 - оказывается, привязка пропорциональна размеру контента, а не абсолютной точке, поэтому .5, .5 означает половину высоты. и на половину ширины. - person Jordan Bigel; 12.12.2009
comment
Я думаю, что у спрайтов якорь находится по центру, поэтому действия ведут себя так, как ожидалось. например представьте, что вы вращаете спрайт и вращаете его снизу слева. - person Colin Gislason; 12.12.2009

Имейте в виду, что если вы перейдете к атласу спрайтов, это не сработает. Нет, если вы не перейдете на новую версию Cocos2d (1.9, которая находится в стадии бета-тестирования). Версия 1.9 позволит вам выполнять сложное родительство спрайтов атласа.

person David Whatley    schedule 12.12.2009