【问题标题】:Cocos2D addChild behaviourCocos2D addChild 行为
【发布时间】: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 不应该是单例。你在滥用单例范式。修复可能不会解决你的问题,但它会让你成为一个更好的程序员。

标签: cocos2d-iphone addchild


【解决方案1】:

感谢cmets,但我想通了。

当我调用静态 [Ball ballInWorld:] 时,CCSprite 不会保留在 Ball 类中,而只保留在 CCSpriteBatchNode 中,所以我必须使用 addChild:ball 或使用 [[Ball alloc]init ...] 来保持精灵参考活着。

GameScene 是一个 CCLayer,我认为可以将其用作单例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-09
    • 2015-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-20
    相关资源
    最近更新 更多