Проблема с getChildByTag (cocos2d iPhone)

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

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

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

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

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

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


person Joethemonkey101    schedule 28.08.2011    source источник


Ответы (1)


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).

person Bongeh    schedule 30.08.2011
comment
Я знаю, что ты говоришь. Но ваша строка getChildByTag не включает никаких тегов... поэтому я пометил свой спрайт-лист как 3 и сделал [[self getChildByTag:3] getChildByTag:1]; Но, как вы могли подумать, когда я пытаюсь использовать hero, он говорит, что он не объявлен. Итак, как мне это сделать? - person Joethemonkey101; 30.08.2011
comment
делать то, что я сказал о перечислениях. Посмотрите их в примерах cocos2d. CCSprite *hero = (CCSprite *)[[self getChildByTag:3] getChildByTag:1]; Кроме того, при добавлении детей, как им нравится [self addChild:sprite tag:kTagWhatever]; - person Bongeh; 30.08.2011