Добавление и доступ к CCSprites

У меня возникают проблемы с вставкой нескольких дочерних элементов одного и того же спрайта и доступом к нему (или установкой для них позиций во время выполнения). Пожалуйста, посоветуйте любой подходящий метод, желательно указать на мою ошибку. Вот мой подход.

//In the Init Method...

//int i is defined in the start.

    for (i = 1; i < 4; i++)

    {

        hurdle = [CCSprite spriteWithFile:@"hurdle1.png"];

        [self addChild:hurdle z:i tag:i];

        hurdle.position = CGPointMake(150 * i, 0);

    }

Он распространяет все спрайты на холсте. затем в какой-то «Функции ОБНОВЛЕНИЯ» я вызываю это.

hurdle.position = CGPointMake(hurdle.position.x - 5, 10);

if (hurdle.position.x <= -5) {
    hurdle.position = ccp(480, 10);
}

Это работает, но, как и ожидалось, только один экземпляр перемещается по горизонтали. Я хочу, чтобы все экземпляры были перемещены, поэтому я пытаюсь использовать это....

for (i = 1; i < 4; i++){

   [hurdle getChildByTag:i].position = CGPointMake(hurdle.position.x - 5, 10);

//OR
   [hurdle getChildByTag:i].position = CGPointMake([hurdle getChildByTag:i].position.x - 5, 10);

}

Я пробовал получать журналы в разных местах и ​​понял, что getChildByTag не работает так, как я пытаюсь его использовать.


person Naveed Abbas    schedule 18.01.2012    source источник


Ответы (2)


Проблема в последнем блоке кода. Вы должны сделать локальную ссылку на каждый CCSprite в цикле for.

Поскольку вы добавили спрайты в self, вы получите их как дочерние элементы self.

for (i = 1; i < 4; i++){
   CCSprite * enumHurdle = [self getChildByTag:i];
   enumHurdle.position = CGPointMake(enumHurdle.position.x - 5, 10);
}

Будьте осторожны, если вы создаете другие спрайты таким же образом в той же сцене. Плохой дизайн — давать любым двум спрайтам один и тот же тег.

РЕДАКТИРОВАТЬ о том, чтобы избежать дублирования тегов.

Если вы знаете, сколько спрайтов у вас будет. Используйте перечисление тегов и обращайтесь к спрайтам по имени.

Если нет, то знание того, сколько групп и ограничение на размер групп могут сделать его управляемым.

т.е. скажем, у вас есть 3 части кода, где вы генерируете подобные спрайты. Вы можете включить enum в свой .m (в строке @implementation) и указать там ограничения

// Choose names that describe the groups of sprites
enum { kGroupOne = 0, // limiting the size of each group to 100 
    kGroupTwo = 100, // (besides the last group, but that is not important)
    kGroupThree = 200, 
};

Затем, когда вы создаете каждую группу

// group 1
for (i = kGroupOne; i < 4; i++){
   // set up code here
}

// group 2 
// g2_size is made up, insert whatever you want
for (i = kGroupTwo; i < g2_size; i++) {
   // set up code here
}
.
.
.

Затем, чтобы получить в группах

for (i = kGroupOne; i < 4; i++){
   CCSprite * enumHurdle = [self getChildByTag:i];
   enumHurdle.position = CGPointMake(enumHurdle.position.x - 5, 10);
}
.
.
.

Надеюсь, это пробудит ваше творчество. Теперь повеселитесь.

person Jesse Black    schedule 18.01.2012
comment
что я должен объявить enumHurdle как? CCSprite? - person Naveed Abbas; 18.01.2012
comment
Спасибо большое за вашу помощь. Но теперь я ничего не знаю о добавлении большего количества спрайтов, но хочу избежать совместного использования одного и того же тега: D - person Naveed Abbas; 18.01.2012
comment
Еще раз спасибо. Я использовал разные циклы FOR, начинающиеся и заканчивающиеся на разных значениях, таких как (1 - 4) и (5-8), но я использую эту переменную цикла FOR в качестве множителя для их расстояния (oooops): D, который я уверен, будет остаются основной проблемой. Пока большое спасибо за вашу помощь. Кто-то посоветовал мне добавить фиктивный спрайт и сделать дочерним элементом этого фиктивного спрайта. Но и это до сих пор остается неразгаданной тайной. - person Naveed Abbas; 18.01.2012

Что-то, что я часто делаю, это группировать объекты одного типа, с которыми я хочу действовать аналогичным образом, добавляя их в CCNode и добавляя этот CCNode в слой.

Я бы создал класс, производный от CCNode.

Затем я могу поместить всю свою логику в этот узел и получить доступ к нему через [самостоятельных детей]

for(CCSprite *hurdle in [self children]) {
    // Do what you need to do
}
person Tone    schedule 18.01.2012