3

現在、iOS 用の Cocos2d ゲームをプログラミングしています。

このゲームでは、ゲームのステータス (アイテムの詳細と位置、期間、スコアなど) を保存するために、GameState シングルトンを作成しました。

メインの CCScene には-(void) saveData:、実行中のゲーム内から呼び出されると (プレイヤーが backToMenu ボタンを押す -> -(void) backToMenu:)、それに応じて実行するメソッドが含まれています。

メニューに戻ります。なぜならGameState.sharedState -> PLAYING = true、[再開] ボタンが表示され、現在のゲームを再開できるからです。

ここまでは、期待どおりに動作します。

では、のメソッド-(void) backToMenu:からメソッドを呼び出すにはどうすればよいでしょうか。appControllerapplicationWillEnterBackground

を呼び出してみました[[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 に答える