Поведение Cocos2D addChild

Меня смущает поведение addChild: в Cocos2D из-за следующего:

У меня есть подкласс CCNode, которому принадлежат CCSprite и Box2DBody. В методе -init этого подкласса я добавляю спрайт в CCSpriteBatchNode основной GameScene, например:

//Ball class, CCNode subclass with a CCSprite and a b2Body
-(id)initBallInWorld:(b2World *)word spriteFile:(NSString *)file
{
   //self = [super init] blablabla
   CCSpriteBatchNode *batch = [GameScene getSpriteBatch];  //singleton

   //create Box2dBody inside the world
   //create a CCSprite
   [batch addChild:sprite];   //Here is the confusion!
}

В основной GameScene я делаю: Ball *ball = [Ball ballInWorld...]

Если я сделаю [self addChild:ball], физика будет работать, как и ожидалось, но если я этого не сделаю, ballSprite застрянет на (0, 0)... почему? Пакет уже добавлен в GameScene, и ballSprite уже добавлен в пакет, этот лишний addChild мне кажется странным!

Спасибо!


person Fernando    schedule 07.09.2011    source источник
comment
Вы уверены, что batch инициализируется к тому времени, когда вы начнете его использовать. Попробуйте NSLog или точку останова, чтобы убедиться, что отправка сообщений нулевым объектам просто не работает в Objective-C.   -  person James Webster    schedule 07.09.2011
comment
Я вижу, что вы добавляете объект в spriteBatch внутренне, а не в область, где вы вызвали initBallInWorld, которая, я уверен, является GameScene. CCScene не должен быть синглтоном. Вы злоупотребляете парадигмой синглтона. Исправление, скорее всего, не решит вашу проблему, но сделает вас лучшим программистом.   -  person    schedule 07.09.2011


Ответы (1)


Спасибо за комментарии, но я разобрался.

Когда я вызываю статический [Ball ballInWorld:], CCSprite не сохраняется в классе Ball, а только внутри CCSpriteBatchNode, поэтому мне приходится использовать addChild:ball или использовать [[Ball alloc]init ...], чтобы сохранить спрайт ссылка живая.

GameScene — это CCLayer, я думаю, что его можно использовать как синглтон.

person Fernando    schedule 07.09.2011