ho trascorso diversi giorni alla ricerca di informazioni relative a questo, e condividere con voi la mia esperienza. Sto anche cercando di creare un gioco che carica in un UITableViewController, da cui il CCDirector viene caricata quando si tocca una cella. Questo è un gioco a turni Game Center, da qui il design (pensa Words With Friends). L'approccio migliore che ho trovato finora è il seguente (nota che sto lavorando in 2.0 - dove CCDirector è una sottoclasse UIViewController):
In AppDelegate.h, creare un nuovo ivar per contenere il CCGLView creato dal codice del modello. Quindi assegna il CCGLView creato in didFinishLaunching al tuo nuovo ivar. Questo permette al regista di riutilizzare la vista originariamente creato invece di cercare di ricreare ogni volta che si ricarica il CCDirector, che sembra causare tutta una serie di problemi strane nella mia esperienza.
anche voi volete creare un nuovo metodo in AppDelegate chiamato -setupDirector o qualcosa di simile, dove si vuole, bene, l'installazione il regista. Questo dovrebbe essere chiamato ogni volta che si ricrea il CCDirector. Ho pubblicato la mia versione qui sotto. Nota il mio ivar per CCGLView si chiama "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];
}
Inoltre, si desidera apportare un paio di modifiche al modo in cui il modello carica i controller di visualizzazione. Normalmente, cocos2D imposta il controller di navigazione con director_ come controller della vista radice. Qui, si vuole alloc e init il controller di visualizzazione dei menu e aggiungere che, invece di director_:
// Create a Navigation Controller with the Director
gamesTVC_ = [[GamesTableViewController alloc] initWithStyle:UITableViewStyleGrouped];
navController_ = [[UINavigationController alloc] initWithRootViewController:gamesTVC_];
navController_.navigationBarHidden = NO;
Tutto il resto nella didFinishLaunching può rimanere lo stesso. Ora, nella vostra menuViewController nel metodo startGameButtonPressed, si chiama il metodo setupDirector appena creato sull'istanza app, che fa riferimento al numero:
AppController *app = (AppController *)[[UIApplication sharedApplication] delegate];
if ([CCDirector sharedDirector].runningScene) {
[[CCDirectorIOS sharedDirector] end];
}
[app setupDirector];
[app.navController pushViewController:app.director animated:YES];
ho includono un controllo per assicurarsi che il CCDirector non è ancora in esecuzione e se lo è, terminalo. Nel vostro livello di gioco, quando arriva il momento che si desidera pop il controller della vista, vi sarà semplicemente chiamarlo in questo modo:
AppController *app = (AppController *)[[UIApplication sharedApplication] delegate];
[app.navController popViewControllerAnimated:YES];
[[CCDirector sharedDirector] end];
Questo flusso dovrebbe consentire di utilizzare liberamente un controller di navigazione per spingere la scena di gioco con CCDirector e apre il controller di visualizzazione quando vuoi tornare al menu principale basato su UIKit. Spero che questo aiuti, dato che ho trascorso un sacco di tempo frustrante cercando di farlo bene per il mio gioco.
Io ho usato realmente una risposta a questa domanda pure. È il punto cruciale della mia applicazione in questo momento. – Echilon