0

我有一个 CCLayer 类是我创建的基类的子类,它本身就是 CCLayer.

创建这种类型的类层次结构后,我无法让 onEnter 我的子类的方法成功调度方法调用。我怎样才能解决这个问题?


我正在尝试开始一个游戏项目,但我遇到了一些障碍。这似乎是一个常见问题,但是,我找不到与我类似的场景,因此无法得出解决方案。

我创建了一个子 CCLayer 类,它与 Cocos2D 入门 iPhone 模板中的 IntroLayer 基本相同。事实上,我的类与一个主要例外完全相同——我创建了一个从 CCLayer 派生的基类,并用作我的 IntroLayer 的父类。

我的问题是在我的子层的 onEnter 方法中,我看到我的转换方法正在我的scheduleOnce作业中设置。但是,问题是我的转换方法从未被调用过?

我不确定我做错了什么。下面发布的代码是我的 IntroLayer 的 .m 文件。

介绍层.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];
}

如您所见,这里没有任何突破性的进展。我创建了这个基类,因为我想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 回答