CCSpriteBatchNode и CCArray, поиск неактивных объектов
Для простой игры у меня есть 4 разные платформы (все на одной странице). Я первоначально добавляю 5 каждого к CCSpriteBatchNode и устанавливаю их все как невидимые. Когда я устанавливаю свои платформы, я хочу взять платформу определенного типа из моего CCSpriteBatchNode и изменить ее, чтобы сделать ее видимой и расположить ее.
У меня проблемы с поиском платформ определенного типа, которые не видны. Или наоборот?
Я знаю, что вы можете использовать [batchnode getchildbytag: tag], но, насколько мне известно, возвращает только один спрайт. Есть ли способ, которым я могу поместить указатели на каждую платформу определенного типа в массив, чтобы я мог перебирать массив и находить все невидимые спрайты?
Спасибо!
2 ответа
Как предлагает Драма, у вас не будет выбора, кроме как "перебирать" детей. Что касается определения того, какой спрайт соответствует какой платформе, существует несколько способов. Простым было бы использовать свойство "tag" спрайта - при условии, что вы не используете его для каких-либо других целей.
// some constants
static int _tagForIcyPlatform = 101;
static int _tagForRedHotPlatform = 102;
... etc
// where you create the platforms
CCSptiteBatchNode *platforms= [CCSpriteBatchNode batchNodeWithFile:@"mapItems_playObjects.pvr.gz"];
CCSprite *sp = [CCSprite striteWithSpriteFrameName:@"platform_icy.png"];
sp.tag = _tagForIcyPlatform;
[platforms addChild:sp];
sp = [CCSprite striteWithSpriteFrameName:@"platform_redHot.png"];
sp.tag = _tagForRedNotPlatform;
[platforms addChild:sp];
// ... etc
// where you want to change properties of
-(void) setVisibilityOf:(int) aPlatformTag to:(BOOL) aVisibility {
for (CCNode *child in platforms.children) {
if (child.tag != aPlatformTag) continue;
child.visible = aVisibility;
}
}
еще раз, это работает, если вы не используете теги дочерних платформ для других целей. Если вам нужны теги для каких-то других целей, рассмотрите возможность использования NSMutableArray в классе, по одному для каждого типа платформы, и сохраните в этом массиве указатель на ваши спрайты соответствующего типа.
Там нет супер простой способ сделать это. Вам нужно будет пройти через детей и осмотреть каждого ребенка в отдельности.
Для эффективности кодирования рассмотрите возможность добавления категории в CCSpriteBatchNode, которая выполняет эту функцию для вас. Таким образом, вы можете легко скопировать его по мере необходимости.