0

私が 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。どうすればこれを機能させることができますか?

4

1 に答える 1

2

カスタム クラス MyBaseCCLayer がonEnterメソッドをオーバーライドしていますが、への呼び出しを省略しました[super onEnter]。忘れがちなこともありますが、呼び出し[super onEnter]はカスタム クラスにとって重要です。Cocos2D ドキュメントのメソッドの説明は次のとおりです。

CCNode が「ステージ」に入るたびに呼び出されるイベント。CCNode が遷移で「ステージ」に入ると、遷移の開始時にこのイベントが呼び出されます。onEnter の間は、兄弟ノードにアクセスできません。onEnter をオーバーライドする場合は、[super onEnter] を呼び出す必要があります。

CCNode.m の内部を見ると、内部で何が起こっているかがわかりますonEnter

-(void) onEnter
{
    [children_ makeObjectsPerformSelector:@selector(onEnter)];
    [self resumeSchedulerAndActions];

    isRunning_ = YES;
}

したがってonEnter、カスタム クラスでメソッドをオーバーライドし、[super onEnter]を呼び出さない場合、この機能を利用できないことがわかります。基本的に、カスタム ノードは「一時停止」状態のままになります。

于 2013-01-24T19:57:26.447 に答える