【问题标题】:init methods inheriting from CCNode从 CCNode 继承的 init 方法
【发布时间】:2013-03-14 22:03:37
【问题描述】:

我有一个关于在继承自 CCNode 的 Player 类中创建自定义初始化方法的问题。不确定我是否需要改用其他路线并创建类方法:

+ (id) addSprite: (CCSprite*) sprite andSpriteBatchNode: (CCSpriteBatchNode*) spriteBatch;
更多类方法....

Player类中,我有一个指定的init方法,以及一些方便的init方法。
- (id) init;
- (id) initWithSpriteBatchNode: (CCSpriteBatchNode*) spriteBatch;
- (id) initWithSprite: (CCSprite*) sprite andSpriteBatchNode: (CCSpriteBatchNode*) spriteBatch; //指定的init方法

当我在我的 Level 类中实例化这个类时,我无法直接调用我的任何自定义 init 方法。我要做的是:

Player *player = [Player node];
[player initWithSprite: sprite andSpriteBatchNode: spriteBatch;]; //不确定这是否正确还是会泄漏内存

我认为任何一个都应该工作,因为它们只是在实例级别上做同样的事情,其他方法在名称上。

请指教。

【问题讨论】:

    标签: objective-c cocos2d-iphone ccnode


    【解决方案1】:

    这里的问题是你 Player 继承自 CCNode 不提供精灵或批处理节点的功能仅仅是因为 CCNode 只是一个逻辑节点。

    相反,如果您从 CCSprite 继承,您可以轻松地做您需要的事情:

    @interface CCPlayer : CCSprite
    {
    
    }
    
    - (id) initWithSpriteBatchNode: (CCSpriteBatchNode*) spriteBatch;
    
    @end
    
    @implementation CCPlayer
    
    - (id) initWithSpriteBatchNode: (CCSpriteBatchNode*) spriteBatch
    {
      if ((self = [super initWithSpriteBatchNode:spriteBatch]))
      {
        // custom code
      }
    
      return self;
    }
    
    @end
    

    现在你可以做到了

    CCPlayer *player = [[[CCPlayer alloc] initWithBatchNode:batchNode] autorelease];
    [somewhere addChild:player];
    

    当然,如果你的玩家精灵在逻辑上是一个单一的精灵,这当然是可行的,如果你有,假设更多的部分,那么你将需要使用合成:

    @interface CCPlayer : CCNode
    {
      CCSprite *body
    }
    
    -(id)init;
    
    @end
    
    @implementation CCPlayer
    
    -(id)init
    {
      if ((self = [super init]))
      {
        body = [CCSprite spriteWith:...;
        [self addChild:body];
      }
    
      return self;
    }
    

    【讨论】:

    • 查看您的代码清除了我的困惑、过度思考和困惑。由于几个不同的原因,我从 CCNode 继承。 1)我只想继承我需要的东西(保持 objs 轻)和 2)我将切换精灵,所以合成是我使用 CCSprite 的首选方法。我想我之前可能把自己弄糊涂了。 Player *p = [Player node]; 同时执行 alloc/init,所以我可以执行类似 Player *p = [[[Player alloc] init..] autorelease]; 的操作。实例方法和类方法应该不是问题。类方法是便利方法。谢谢,感谢您的帮助。
    【解决方案2】:

    我想多了,搞糊涂了。 Cocos2D 有一个类方法,例如:[CCNode node] 方法。

    我可以有尽可能多的实例和类方法来创建我的自定义类的实例。它们只是方便的方法。

    而不是使用默认的继承方法:
    Player *player = [Player node]; => 基本上是做alloc/init

    我可以使用我的自定义初始化方法之一:
    Player *player = [[[Player alloc] initWithSpriteBatchNode: spriteBatch] autorelease];
    [spriteBatch addChild: playerSprite];
    或其他......

    【讨论】:

      猜你喜欢
      • 2011-07-07
      • 1970-01-01
      • 1970-01-01
      • 2011-10-28
      • 2016-08-15
      • 2010-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多