我有一个关于在我的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;];
//不确定这是否正确或是否会泄漏内存
我认为要么应该工作,因为他们只是在实例级别做同样的事情,其他方法在名称。
请告知。
答案 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];