如何从appdelegate.mm调用helloworldlayer.mm中的方法

时间:2012-02-01 04:00:05

标签: objective-c ios xcode cocos2d-iphone

我正在使用cocos2d和box2d制作我的第一款iphone游戏。我刚刚实现了一个暂停按钮。它会在游戏顶部显示暂停菜单并暂停CCDirector。只要你留在应用程序中,暂停和取消暂停就会很好,但是有一个错误。如果您在应用暂停时将其最小化并返回该应用,则游戏将再次取消暂停,但暂停菜单仍在其前面。原因似乎是AppDelegate.mm中的applicationDidBecomeActive方法如下所示:

- (void)applicationDidBecomeActive:(UIApplication *)application {
    [[CCDirector sharedDirector] resume];
}

我尝试将“简历”更改为“暂停”,但随后游戏在每个实例中都会暂停。

因此,我假设解决方案是在此方法中添加代码,以删除暂停层或(更好)暂停导演并确保暂停层已到位,因此游戏自动暂停,无论如何球员离开后回来。麻烦的是,我对objective-c很新,并且无法弄清楚如何在helloworldlayer中创建一个公共方法并从AppDelegate调用它。任何人都可以快速解释一下如何做到这一点?我尝试了以下方法:

- (void)applicationDidBecomeActive:(UIApplication *)application {
    [[CCDirector sharedDirector] pause];
        [HelloWorldLayer pause];

}

然后将以下代码添加到我的HelloWorldLayer.mm:

+(void)pauseGame {
    _paused = YES;
    _pauseMenu.visible = YES;
    _pauseLayer.visible = YES;
    [[CCDirector sharedDirector] pause];    
}

但是它给了我错误 - 它说“在类方法中访问了实例变量_paused”,并且对于其他两行代码也出现了类似的错误。

我该如何解决这个问题?我试着制作三个变量属性并合成它们,但这没有帮助。红色感叹号被黄色三角形替换(具有相同的警告)。但是程序中的程序仍然会崩溃。

感谢您的帮助!

-James

编辑:哇!我想通了!

我的问题是没有意识到+方法适用于类,而不是实例,因此无法访问特定实例的变量。由于这是我需要做的,我寻找了一种在appDelegate和特定Cocos2D层之间进行通信的方法。本教程证明非常有用:

http://www.cocos2d-iphone.org/forum/topic/9354

这是我最终使用的代码:在appDelegate.mm中,我用以下行替换了applicationDidFinishLaunching方法的结尾:

// Run the intro Scene
CCLayer *layer = [HelloWorldLayer node]; //create and init layer
CCScene *scene = [CCScene node]; //create and init parent and empty scene
[scene addChild:layer z:0 tag:100]; //TAG EACH LAYER WITH A UNIQUE NUMBER!!!
[[CCDirector sharedDirector] runWithScene: scene];

然后我将以下内容添加到applicationDidResignActive:

- (void)applicationWillResignActive:(UIApplication *)application {
    [[CCDirector sharedDirector] pause];
    CCScene * scene = [[CCDirector sharedDirector] runningScene];
    id layer = [scene getChildByTag:100];
    [layer pauseGame];
}

我从applicationDidBecomeActive中删除了默认的取消暂停功能,因为我希望它保持暂停并加载暂停屏幕。

最后,在HelloWorldLayer.mm中,我将函数恢复到原来的状态:

-(void)pauseGame {
    _paused = YES;
    _pauseMenu.visible = YES;
    _pauseLayer.visible = YES;
    [[CCDirector sharedDirector] pause];
}

请注意,我将其更改回实例方法,所有变量都是实例变量。

感谢您的回复,ZhangChin,它让我开始着手解决这个问题。希望这有助于未来的某些人:-) -James

1 个答案:

答案 0 :(得分:1)

你需要+ pauseGame这样:

+(void)pauseGame {
    CCDirector *sharedDirector = [CCDirector sharedDirector];

    sharedDirector.paused = NO;
    sharedDirector.pauseMenu.visible = NO;
    sharedDirector.pauseLayer.visible = NO;
    [sharedDirector resume];    
}

此外,您可能需要@synthesize或为这些属性编写setter方法。