Cocos2d - использование getChildByTag из дочерних классов для получения объектов в сцене - PullRequest
0 голосов
/ 12 января 2011

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

Я решил, что вместо передачи ссылок на объекты в графе сцены я буду отмечать все узлы cocos2d, передавать значения тегов вокруг, а затем всякий раз, когда мне понадобится объект сцены, я просто использую директор для извлечения объекта с использованием тег.

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

Я использую следующий код для извлечения определенного узла:

CCNode* node = [[[[CCDirector sharedDirector] runningScene] getChildByTag:TAG_MY_LAYER] getChildByTag:TAG_MY_OBJECT];
if (node != nil ){
    NSAssert([node isKindOfClass:[myObject class]], @"node is not a myObject");
    myObject* mo = (myObject*)node;
    ...
    other stuff
    ....

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

Можно ли получить ссылку на часть графа сцены, из которой я могу вызвать getChildByTag, и он получит мой помеченный объект независимо от состояния перехода сцен?

Ответы [ 2 ]

3 голосов
/ 11 августа 2012

@ Эрик - как ваш ответ связан с заданным вопросом?

Вы можете переместить свой код в метод onEnter (), который, кажется, выполняется после завершения перехода к новой сцене, т. Е .:

-(void)onEnter {
   [super onEnter];

   CCNode* node = [[[[CCDirector sharedDirector] runningScene] getChildByTag:TAG_MY_LAYER] getChildByTag:TAG_MY_OBJECT];
   if (node != nil ){
     NSAssert([node isKindOfClass:[myObject class]], @"node is not a myObject");
     myObject* mo = (myObject*)node;
     ...
     other stuff
     ....
   }
}
0 голосов
/ 06 июня 2011

Вместо того, чтобы использовать этот подход, я предлагаю вам изучить классы Singleton.В этом случае класс SingleS GameSettings.h используется для отслеживания переменной globalScore.

В любом месте вашего кода вы теперь можете ссылаться на переменную, вызывая [[GameSettings sharedGameSettings] globalScore];

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

GameSettings.h

#import <Foundation/Foundation.h>
#import "cocos2d.h"

@interface GameSettings : NSObject {
  int globalScore;
}

@property (nonatomic, assign) int globalScore;

@end

GameSettings.m

#import "GameSettings.h"

@implementation GameSettings

@synthesize globalScore;

static GameSettings *sharedGameSettings = nil;

+(GameSettings *)sharedGameSettings
{
    @synchronized(self){
        if(sharedGameSettings == nil)
        {
            sharedGameSettings = [[self alloc] init];
        }
    }
    return sharedGameSettings;
}

+(id)allocWithZone:(NSZone *)zone{
    @synchronized(self)
    {
        if(sharedGameSettings == nil)
        {
            sharedGameSettings = [super allocWithZone:zone];
            return sharedGameSettings;
        }
    }
    return nil;
}


-(id)init{

    self = [super init];

    if(self){}
    return self;
}

Другая идея (если вам часто приходится передавать данные между сценами) - сделать одну сцену делегатом другой сцены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...