0

CCNode から継承する Player クラスでのカスタム 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;];//これが正しいかどうか、またはメモリリークするかどうかはわかりません

インスタンスレベルで同じことをしているので、名前の他のメソッドはどちらでも機能するはずです。

お知らせ下さい。

4

2 に答える 2

0

ここでの問題は、 aが単なる論理ノードであるため、Player継承CCNode元がスプライトまたはバッチ ノードの機能を提供しないことです。CCNode

代わりに 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 に答える
0

私は考えすぎて、自分自身を混乱させていました。Cocos2D にはクラス メソッドがあり[CCNode node]ます。

カスタム クラスのインスタンスを作成するために、インスタンス メソッドとクラス メソッドをいくつでも持つことができます。それらは単なる便利なメソッドです。

デフォルトの継承メソッドを使用する代わりに:
Player *player = [Player node];=> 基本的に alloc/initを実行します

カスタムのinitメソッドの1つを使用できます:または何か....
Player *player = [[[Player alloc] initWithSpriteBatchNode: spriteBatch] autorelease];
[spriteBatch addChild: playerSprite];

于 2013-03-15T00:10:05.883 に答える