2013-03-14 66 views
0

我有一個關於在繼承自CCNode的Player類中創建自定義init方法的問題。不知道如果我需要,而不是採取不同的路線,並創建類的方法來代替:從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方法

當我在我的水平類實例化這個類,我不能夠直接調用我的任何自定義的初始化方法。我要做的是:

Player *player = [Player node];
[player initWithSprite: sprite andSpriteBatchNode: spriteBatch;]; //不知道這是正確的,甚至還是會出現內存泄漏

我認爲,無論是應工作,因爲它們是在實例級別只是在做同樣的事情,其他方法的名稱。

請指教。

回答

0

這裏的問題是,您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; 
} 
+0

展望通你的代碼清除了我的困惑,過度思考和迷惑自己。我從CCNode繼承了幾個不同的原因。 1)我只想繼承我所需要的東西(保持objs光線)和2)我將切換小精靈,所以合成是我使用CCSprite的首選方法。我想我可能早一點弄糊塗了。 'Player * p = [Player node];'同時做alloc/init,所以我可以做一些像'Player * p = [[[Player alloc] init ..] autorelease];'。實例方法和類方法不應該成爲問題。類方法是方便的方法。謝謝,感謝你的幫助。 – badboy11 2013-03-14 23:58:43

0

我一直在思考和迷惑自己。 Cocos2D有一個分類方法,例如:[CCNode node]方法。

我可以有儘可能多的實例和類方法來創建我的自定義類的實例。他們只是便利的方法。

不使用默認的繼承方法:
Player *player = [Player node]; =>基本上沒有分配/初始化

我可以用我的自定義的init方法之一:
Player *player = [[[Player alloc] initWithSpriteBatchNode: spriteBatch] autorelease];
[spriteBatch addChild: playerSprite];
什麼的....