私が CCLayer
作成した基本クラスの子であるクラスがあり、それ自体が の子です CCLayer
。
このタイプのクラス階層を作成した後 onEnter
、子クラスのメソッドを取得してメソッド呼び出しを正常にスケジュールできません。どうすればこれを修正できますか?
ゲームのプロジェクトを始めようとしていますが、ちょっとした壁にぶち当たりました。これはよくある問題のようですが、私のようなシナリオが見つからないため、解決策を導き出すことができません。
私は作成した子 CCLayer クラスを持っています。これは基本的に Cocos2D のスターター iPhone テンプレートの IntroLayer とまったく同じものです。実際、私のクラスはまったく同じクラスですが、大きな例外が 1 つあります。CCLayer から派生した基本クラスを作成し、それを IntroLayer の親として使用しています。
私の問題は、子レイヤーの onEnter メソッドで、トランジション メソッドがscheduleOnce
割り当てに設定されていることがわかります。しかし、問題は、私の遷移メソッドが呼び出されないことですか?
何が間違っているのかわかりません。以下に投稿されたコードは、私の IntroLayer の .m ファイルです。
IntroLayer.m
@implementation IntroLayer //Child of "MyBaseCCLayer"
+(CCScene *) scene
{
CCScene *scene = [CCScene node];
IntroLayer *layer = [IntroLayer node];
[scene addChild: layer];
return scene;
}
-(void) onEnter
{
//This is calling an overridden onEnter of my base CCLayer.
// See snippet below.
[super onEnter];
CGSize size = [[CCDirector sharedDirector] winSize];
CCSprite *background;
background = [CCSprite spriteWithFile:@"Default.png"];
[background setPosition:ccp(size.width/2, size.height/2)];
[background setZOrder: Z_BACKGROUND];
[self addChild: background];
//In one second transition to the new scene
// I can put a break point here, and this being set.
// It never gets called, though.
[self scheduleOnce:@selector(makeTransition:) delay:1.0];
}
-(void) makeTransition:(ccTime)delay
{
//Here is where I would transition to my menu.
// This is a fresh project, so it's going to a test screen.
// The problem is this method never fires.
[[CCDirector sharedDirector]
replaceScene:[CCTransitionFade
transitionWithDuration:0.5
scene:[TestLayer scene]
withColor:ccBLACK]];
}
-(void) dealloc
{
[super dealloc];
}
@end
MyBaseCCLayer.m
//^boilerplate snip^
-(void) onEnter
{
//Setup overlay
CGSize size = [[CCDirector sharedDirector] winSize];
ccTexParams tp = {GL_LINEAR, GL_LINEAR, GL_REPEAT, GL_REPEAT};
//overlay is a class variable, CCSprite object.
overlay = [CCSprite spriteWithFile:@"tile_overlay.png" rect:CGRectMake(0, 0, size.width, size.height)];
[overlay retain];
[overlay setPosition: ccp(size.width/2, size.height/2)];
[overlay.texture setTexParameters:&tp];
//Always on top!
[overlay setZOrder:Z_OVERLAY];
}
-(void) dealloc
{
[overlay release];
[super dealloc];
}
ご覧のとおり、ここでは画期的なことは何も行われていません。アプリケーションでオーバーレイ スプライトを ever に適用したいので、この基本クラスを作成しましたCCLayer
。これが、私自身の基地を作成することが理にかなっている理由CCLayer
です。ただし、独自の基本クラスを作成したので、 でIntroLayer
設定しているスケジュールされたメソッドを呼び出すことはありませんonEnter
。どうすればこれを機能させることができますか?