init方法继承自CCNode

时间:2013-03-14 22:03:37

标签: objective-c cocos2d-iphone ccnode

我有一个关于在我的Player类中创建继承自CCNode的自定义init方法的问题。不确定我是否需要采用不同的路径并改为创建类方法:

+ (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;]; //不确定这是否正确或是否会泄漏内存

我认为要么应该工作,因为他们只是在实例级别做同样的事情,其他方法在名称。

请告知。

2 个答案:

答案 0 :(得分:0)

这里的问题是你Player继承自CCNode,它不提供sprite或批处理节点的功能,因为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;
}

答案 1 :(得分:0)

我过度思考并迷惑自己。 Cocos2D有一种类方法,例如:[CCNode node]方法。

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

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

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