0

我有一个关于在继承自 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; //指定初始化方法

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

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

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

请指教。

4

2 回答 2

0

我想多了,自己也糊涂了。Cocos2D 有一个类方法 eg:[CCNode node]method。

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

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

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

于 2013-03-15T00:10:05.883 回答
0

这里的问题是,您Player继承的CCNode不是精灵或批处理节点的功能,因为 aCCNode只是一个逻辑节点。

相反,如果您从 a 继承,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;
}
于 2013-03-14T22:13:22.110 回答