Добавление и доступ к CCSprites - PullRequest
1 голос
/ 18 января 2012

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

//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 не работает так, как япытаясь использовать его.

Ответы [ 2 ]

2 голосов
/ 18 января 2012

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

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

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

Beбудьте осторожны, если вы создадите другие спрайты таким же образом в той же сцене.Неправильно назначать любые два спрайта одному и тому же тегу.

ПРАВКА, чтобы избежать дублирования тегов.

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

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

т.е., скажем, у вас есть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);
}
.
.
.

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

0 голосов
/ 18 января 2012

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

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

Тогда я могу поместить всю свою логику в этот узел и получить доступ через [self children]

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