Проблема с getChildByTag (cocos2d iPhone) - PullRequest
0 голосов
/ 29 августа 2011

У меня есть сцена под названием Level1, которая забирает героя и врага из слоя под названием GameLayer. Я слышал, что эффективный способ сделать это - использовать теги и получать их, используя getChildByTag. Я попробовал это, но у меня много проблем. Я использую SneakyInput. На уровне 1 есть левый джойстик (для движения противника) и правый джойстик (для стрельбы снарядами). У меня есть метод addEnemy и addHero в моем GameLayer, который я вызываю. Все, что я упомянул, работает.

В моей сцене уровня 1 у меня есть метод moveHero (который, очевидно, должен перемещать героя с помощью джойстика). Благодаря базовой отладке я знаю, что проблема в строке geteChildByTag. Я проверяю позицию героя через NSLog, и он говорит 0,0. Что странно, потому что на экране вы можете увидеть героя. Но я также понял, что вызываю метод addHero без использования getChildByTag.

Надеюсь, мне здесь ясно. Я загрузил GameLayer.h и GameLayer.m на 4shared. http://www.4shared.com/file/PqhjoMFy/GameLayer.html

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

Кстати: нет ошибок или сбоев. Это просто не работает.

Заранее спасибо.

1 Ответ

0 голосов
/ 30 августа 2011

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

Выу вас есть серьезные проблемы с вашим кодом.

Во-первых ..

GameLayer *heroInstance = [[GameLayer alloc] init];
CCSprite *hero = (CCSprite *)[heroInstance getChildByTag:1];
NSLog(@"Hero position X: %f", hero.position.x);
NSLog(@"Hero position Y: %f", hero.position.y);

Это никогда не сработает, heroInstance - совершенно новый объект, у него нет детей, также вы только что создалиутечка памяти здесь.

Ваш герой является дочерним элементом спрайт-листа, который является дочерним элементом сцены.

Чтобы сослаться на своего ребенка, вы должны вызвать getChildByTag в своем спрайт-листе (который вам, вероятно, нуженчтобы ссылаться, вызывая getChildByTag на вашей сцене ..

как-то так.

[[self-getChildByTag: spritesheet] getChildByTag: hero];

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

...