【发布时间】:2011-09-08 06:38:58
【问题描述】:
我对 Cocos2D 中的 addChild: 行为感到困惑,原因如下:
我有一个 CCNode 子类,它拥有一个 CCSprite 和一个 Box2DBody。 我是这个子类的 -init 方法,我将精灵添加到主 GameScene 的 CCSpriteBatchNode 中,如下所示:
//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 对我来说似乎很奇怪!
谢谢!
【问题讨论】:
-
您确定
batch在您使用它时已被初始化。尝试使用 NSLog 或断点,以确保向 nil 对象发送消息只是在 Objective-c 中静默失败 -
我看到的是您在内部将对象添加到 spriteBatch,而不是在您调用 initBallInWorld 的范围内,我打赌它是 GameScene。 CCScene 不应该是单例。你在滥用单例范式。修复可能不会解决你的问题,但它会让你成为一个更好的程序员。