Ich habe mehrere Tage damit verbracht, nach Informationen zu suchen, und werde Ihnen meine eigenen Erfahrungen mitteilen. Ich versuche auch, ein Spiel zu erstellen, das in einen UITableViewController geladen wird, von dem der CCDirector geladen wird, wenn eine Zelle berührt wird. Dies ist ein Game Center rundenbasiertes Spiel, daher das Design (think Words With Friends). Der beste Ansatz, den ich bisher gefunden habe, ist wie folgt (Hinweis: Ich arbeite in 2.0 - wo CCDirector eine UIViewController-Unterklasse ist):
Erstellen Sie in AppDelegate.h ein neues ivar, um die CCGLView zu halten, die erstellt wird aus dem Vorlagencode. Ordnen Sie dann die in didFinishLaunch erstellte CCGLView Ihrem neuen ivar zu. Dadurch kann der Director die ursprünglich erstellte Ansicht wiederverwenden, anstatt sie jedes Mal neu zu erstellen, wenn Sie den CCDirector neu laden, was nach meiner Erfahrung allerlei seltsame Probleme verursacht.
Sie möchten auch eine neue Methode in AppDelegate namens -setupDirector oder etwas ähnliches, wo Sie, nun, richten Sie den Direktor. Dies sollte jedes Mal aufgerufen werden, wenn Sie den CCDirector neu erstellen. Ich habe meine Version unten gepostet. Beachten Sie, dass mein ivar für die CCGLView "GLView" heißt.
- (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];
}
Darüber hinaus werden Sie einige Änderungen an der Art vornehmen müssen, wie die Vorlage die View-Controller lädt. Normalerweise richtet cocos2D den Navigationscontroller mit director_ als Root-View-Controller ein. Hier möchten Sie Alloc und init Ihr Menü View-Controller und fügen hinzu, dass statt director_:
// Create a Navigation Controller with the Director
gamesTVC_ = [[GamesTableViewController alloc] initWithStyle:UITableViewStyleGrouped];
navController_ = [[UINavigationController alloc] initWithRootViewController:gamesTVC_];
navController_.navigationBarHidden = NO;
Alles andere in didFinishLaunching kann die gleiche bleiben. Nun, in Ihrem menuViewController in Ihrem startGameButtonPressed Methode, rufen Sie das neu erstellte setupDirector Methode auf Ihrer App-Instanz, die durch den Aufruf verwiesen wird:
AppController *app = (AppController *)[[UIApplication sharedApplication] delegate];
if ([CCDirector sharedDirector].runningScene) {
[[CCDirectorIOS sharedDirector] end];
}
[app setupDirector];
[app.navController pushViewController:app.director animated:YES];
Ich schließe einen Scheck, um sicherzustellen, das CCDirector nicht noch läuft und wenn es ist, beende es. In Spiel Schicht, wenn die Zeit kommt, dass Sie die View-Controller-Pop wollen, müssen Sie einfach nennen es etwa so:
AppController *app = (AppController *)[[UIApplication sharedApplication] delegate];
[app.navController popViewControllerAnimated:YES];
[[CCDirector sharedDirector] end];
Diese Strömung erlauben sollten Sie frei einen Navigation-Controller verwenden, um Ihre Spielszene schieben mit CCDirector, und blenden Sie diesen View-Controller ein, wenn Sie zu Ihrem UIKit-basierten Hauptmenü zurückkehren möchten. Ich hoffe, das hilft, da ich viel frustrierende Zeit damit verbracht habe, das für mein eigenes Spiel richtig zu machen.
Ich könnte wirklich eine Antwort auf diese Frage auch verwenden. Es ist der Kern meiner Anwendung gerade jetzt. – Echilon