我正在使用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
答案 0 :(得分:1)
你需要+ pauseGame这样:
+(void)pauseGame {
CCDirector *sharedDirector = [CCDirector sharedDirector];
sharedDirector.paused = NO;
sharedDirector.pauseMenu.visible = NO;
sharedDirector.pauseLayer.visible = NO;
[sharedDirector resume];
}
此外,您可能需要@synthesize或为这些属性编写setter方法。