I spent several days searching for information related to this and will share my experience with you. I am also trying to create a game loaded in a UITableViewController from which a CCD file is loaded when the cell is touched. This is the game center of a turn-based game, therefore, design (think words with friends). The best approach I have found so far for this is as follows (note that I work in 2.0 - where CCDirector is a subclass of UIViewController):
In AppDelegate.h, create a new ivar to store the CCGLView that is created from the template code. Then assign the CCGLView created in the didFinishLaunching file to your new ivar. This allows the director to reuse the original created view instead of trying to recreate it every time you reboot the CCDirector, which seems to cause me all kinds of strange problems.
You also want to create a new method in AppDelegate called -setupDirector, or something like where you, well, set up the director. This must be called up every time you recreate the CCDirector. I posted my version below. Please note that my ivar for CCGLView is called "GLView".
- (void)setupDirector { if (![CCDirector sharedDirector]) { CCLOG(@"Calling setupDirector"); director_ = (CCDirectorIOS*) [CCDirector sharedDirector]; director_.wantsFullScreenLayout = YES; // Display FSP and SPF [director_ setDisplayStats:NO]; // set FPS at 60 [director_ setAnimationInterval:1.0/60]; // attach the openglView to the director [director_ setView:GLView]; // for rotation and other messages [director_ setDelegate:self]; // 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"); // Default texture format for PNG/BMP/TIFF/JPEG/GIF images // It can be RGBA8888, RGBA4444, RGB5_A1, RGB565 // You can change anytime. [CCTexture2D setDefaultAlphaPixelFormat:kCCTexture2DPixelFormat_RGBA8888]; // If the 1st suffix is not found and if fallback is enabled then fallback suffixes are going to searched. If none is found, it will try with the name without suffix. // On iPad HD : "-ipadhd", "-ipad", "-hd" // On iPad : "-ipad", "-hd" // On iPhone HD: "-hd" CCFileUtils *sharedFileUtils = [CCFileUtils sharedFileUtils]; [sharedFileUtils setEnableFallbackSuffixes:NO]; // Default: NO. No fallback suffixes are going to be used [sharedFileUtils setiPhoneRetinaDisplaySuffix:@"-hd"]; // Default on iPhone RetinaDisplay is "-hd" [sharedFileUtils setiPadSuffix:@"-ipad"]; // Default on iPad is "ipad" [sharedFileUtils setiPadRetinaDisplaySuffix:@"-ipadhd"]; // Default on iPad RetinaDisplay is "-ipadhd" // Assume that PVR images have premultiplied alpha [CCTexture2D PVRImagesHavePremultipliedAlpha:YES]; }
In addition, you will want to make a couple of changes to the way the controllers load the template. Typically, cocos2D installs a navigation controller with director_ as the root view controller. Here you want to select and initialize your menu controller and add TO instead of director _:
Everything else in didFinishLaunching can stay the same. Now, in your menuViewController in your startGameButtonPressed method, you will call the newly created setupDirector method in your application, which is invoked by the call:
AppController *app = (AppController *)[[UIApplication sharedApplication] delegate]; if ([CCDirector sharedDirector].runningScene) { [[CCDirectorIOS sharedDirector] end]; } [app setupDirector]; [app.navController pushViewController:app.director animated:YES];
I turn on verification to make sure that the CCD file is not already running, and if so, complete it. In the game layer, when the time comes when you want to set the view controller, you simply name it like this:
AppController *app = (AppController *)[[UIApplication sharedApplication] delegate]; [app.navController popViewControllerAnimated:YES]; [[CCDirector sharedDirector] end];
This stream should allow you to freely use the navigation controller to promote your game scene using CCDirector and call this view controller when you want to return to the main menu based on UIKit. Hope this helps, since I spent a lot of disappointing time trying to get this right for my own game.