3

我目前正在为 iOS 编写一个 Cocos2d 游戏。

在这个游戏中,我创建了一个 GameState 单例来保存我的游戏状态(项目详细信息和位置、持续时间、分数等)。

我的主 CCScene 包含一个-(void) saveData:方法,当从正在运行的游戏(玩家点击 backToMenu 按钮 -> -(void) backToMenu:)中调用该方法时,会相应地执行:

我们被送回菜单,因为GameState.sharedState -> PLAYING = true出现了 Resume 按钮并允许我们恢复当前游戏。

直到这里,它按预期工作。

现在,我如何-(void) backToMenu:appController's 方法调用该方法applicationWillEnterBackground

我尝试调用,[[CCDirector sharedDirector] runningScene]但它以某种方式崩溃,也在恢复时,这意味着我什至不确定我是否保存了正确的内容。

在此先感谢您的帮助。

4

2 回答 2

1

在 AppDelegate.h 中添加:

@class CCLayer;

@interface AppController : NSObject <UIApplicationDelegate, CCDirectorDelegate,UIGestureRecognizerDelegate>
{
    CCLayer             *mCurrentLayer;

}

@property (nonatomic, retain) CCLayer *currentLayer;

在 AppDelegate.mm 中添加:

@implementation AppController
@synthesize currentLayer = mCurrentLayer;

在您的 Layer init 类中使用它。在所有场景方法中。

@implementation MyMainMenu

+(CCScene *) scene
{
    // 'scene' is an autorelease object.
    CCScene *scene = [CCScene node];

    // 'layer' is an autorelease object.
    MyMainMenu *layer = [MyMainMenu node];

    AppController *app = (AppController*) [[UIApplication sharedApplication] delegate];
    app.currentLayer = layer;

    // add layer as a child to scene
    [scene addChild: layer];

    // return the scene
    return scene;
}

您可以检查项目中的任何位置..

在 appDelegate

-(void) applicationDidEnterBackground:(UIApplication*)application 
{
   if([self.currentLayer  isKindOfClass:[MyMainMenu class]])
   MyMainMenu *mm = (MyMainMenu*) self.currentLayer;
   [mm calFunction]; 
}

在其他班级:

-(void)callUpdateButtonsInLayer
{    
     AppController *app = (AppController*) [[UIApplication sharedApplication] delegate];
     if([app.currentLayer  isKindOfClass:[MyMainMenu class]])
     {
         MyMainMenu *mm = (MyMainMenu*) app.currentLayer;
         [mm calFunction]; 
     }
}
于 2012-10-01T08:52:13.260 回答
0

更新:刚刚发现这个。例如,我是否可以NSNotification在 appController 的applicationWillEnterBackground方法中创建一个,然后在我的 CCLayer 对象中处理它,在该对象中我会在其init方法中添加一个 NSObserver 来接收此类通知?

于 2013-07-24T19:43:34.117 回答