He pasado varios días buscando información relacionada con esto, y compartiré con ustedes mi propia experiencia. También estoy intentando crear un juego que se cargue en un UITableViewController, desde el cual se carga el CCDirector cuando se toca una celda. Este es un juego basado en turnos de Game Center, de ahí el diseño (piense en Words With Friends). El mejor enfoque que he encontrado hasta ahora para esto es el siguiente (nota que estoy trabajando en 2.0 - donde CCDirector es una subclase UIViewController):
En AppDelegate.h, crea un nuevo ivar para contener el CCGLView que se crea del código de la plantilla. Luego asigne el CCGLView creado en didFinishLaunching a su nuevo ivar. Esto le permite al director reutilizar la vista creada originalmente en lugar de tratar de volver a crearla cada vez que recarga el CCDirector, lo que parece causar todo tipo de problemas extraños en mi experiencia.
También desea crear un nuevo método en AppDelegate llamado -setupDirector o algo por el estilo donde, bueno, configure el director. Debe invocarse cada vez que esté recreando el CCDirector. He publicado mi versión a continuación. Tenga en cuenta que mi ivar para el CCGLView se llama "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];
}
Además, querrá hacer un par de cambios en la forma en que la plantilla carga los controladores de visualización. Normalmente, cocos2D configura el controlador de navegación con director_ como controlador de vista raíz. A continuación, desea alloc e init su controlador de vista del menú y añadir que en lugar de director_:
// Create a Navigation Controller with the Director
gamesTVC_ = [[GamesTableViewController alloc] initWithStyle:UITableViewStyleGrouped];
navController_ = [[UINavigationController alloc] initWithRootViewController:gamesTVC_];
navController_.navigationBarHidden = NO;
Todo lo demás en didFinishLaunching puede seguir siendo el mismo. Ahora, en su menuViewController en su método startGameButtonPressed, se llama al método setupDirector recién creado en la instancia de aplicación, que se cita llamando al:
AppController *app = (AppController *)[[UIApplication sharedApplication] delegate];
if ([CCDirector sharedDirector].runningScene) {
[[CCDirectorIOS sharedDirector] end];
}
[app setupDirector];
[app.navController pushViewController:app.director animated:YES];
que incluyen una comprobación para asegurarse de que el CCDirector no sigue funcionando , y si lo es, finalícelo. En su capa de juego, cuando llegue el momento que desea pop el controlador de vista, simplemente llamarlo así:
AppController *app = (AppController *)[[UIApplication sharedApplication] delegate];
[app.navController popViewControllerAnimated:YES];
[[CCDirector sharedDirector] end];
Este flujo debe permitirle utilizar libremente un controlador de navegación para empujar a su escena del juego con CCDirector, y abre ese controlador de vista cuando quieras volver al menú principal basado en UIKit. Espero que esto ayude, ya que he pasado mucho tiempo frustrante tratando de hacer esto bien para mi propio juego.
Realmente podría usar una respuesta a esta pregunta. Es el quid de mi aplicación en este momento. – Echilon