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, которая выполняет эту функцию для вас. Таким образом, вы можете легко скопировать его по мере необходимости.

Другие вопросы по тегам