あなたのコード設定は少し風変わりなようです。UIViewにcocos2dをロードしていますが、そのビューでディレクター(ViewController)を保持しています。ViewController構造内でcocos2dエンジンを起動して終了するのは少し難しいかもしれませんが、これは私のゲームで使用しているものです。
ステップ1:テンプレートからAppDelegate.mの標準コードを変更します。_director ivarを処理するすべての行をコメントアウトし、ルートViewControllerを_directorからViewControllerに変更する必要があります。ゲームは、_directorの代わりにcocos2dテンプレートコードで作成されたnavController内のそのViewControllerで起動します。
ステップ2:cocos2dを起動するViewControllerには、-initで呼び出されるメソッドが必要です。このメソッドは、次のように、ディレクターがビューとして使用するCCGLViewを作成して保持します。
AppController *app = (AppController *)[[UIApplication sharedApplication] delegate];
myGLView = [[CCGLView viewWithFrame:[app.window bounds]
pixelFormat:kEAGLColorFormatRGB565 //kEAGLColorFormatRGBA8
depthFormat:0 //GL_DEPTH_COMPONENT24_OES
preserveBackbuffer:NO
sharegroup:nil
multiSampling:NO
numberOfSamples:0] retain];
cocos2dは、CCGLViewが破棄された後に再作成する際に問題が発生する可能性があるため、CCGLViewを維持することは、一部のOpenGLエラーを防ぐために重要です。私が言ったように、このメソッドは一度だけ呼び出されます、あなたがcocos2dを起動しているViewControllerの-initメソッドで。
ステップ3:ViewControllerにメソッドを作成して、ディレクターをセットアップし、次のようにナビゲーションコントローラーのスタックにプッシュします。
AppController *app = (AppController *)[[UIApplication sharedApplication] delegate];
CCDirectorIOS* director = (CCDirectorIOS *) [CCDirector sharedDirector];
director.wantsFullScreenLayout = YES;
[director setView:myGLView];
// Display FSP and SPF
[director setDisplayStats:NO];
// set FPS at 60
[director setAnimationInterval:1.0/60];
// for rotation and other messages
[director setDelegate:app];
// 2D projection
[director setProjection:kCCDirectorProjection2D];
// [director setProjection:kCCDirectorProjection3D];
// Enables High Res mode (Retina Display) on iPhone 4 and maintains low res on all other devices
if( ! [director enableRetinaDisplay:YES] )
CCLOG(@"Retina Display Not supported");
if (director.runningScene)
[director replaceScene:[TwoPlayerBoard node]];
else
[director pushScene:[TwoPlayerBoard node]];
[app.navController pushViewController:director animated:YES];
そのコードのほとんどは、元のディレクターがセットアップされていたAppDelegateのコメントアウトされたコードから実際にコピーされます。ディレクターのビューを、ViewControllerの-initで作成および保持するCCGLViewに設定していることに注意してください。この方法では、新しく作成されたディレクターにスタートアップシーンをプッシュさせます。
ステップ4:ゲームレイヤー内で、ゲーム(cocos2d)が起動されたViewControllerに戻りたい場合は、次のコードを実装します。
AppController *app = (AppController *)[[UIApplication sharedApplication] delegate];
[app.navController popViewControllerAnimated:YES];
[[CCDirectorIOS sharedDirector] end];
これにより、View Controllerからcocos2d(UIViewControllerのサブクラス)のディレクターに自由に移動し、問題なく戻ることができます。うまくいけば、それはあなたのためにそれを十分に詳細に説明します、それがどうなるか私に知らせてください!