我花了几天时间寻找与此相关的信息,并将与您分享我自己的经验。我也在尝试创建一个加载到 UITableViewController 中的游戏,当一个单元格被触摸时,CCDirector 会从该控制器中加载。这是一个 Game Center 回合制游戏,因此设计(想想 Words With Friends)。到目前为止,我为此找到的最佳方法如下(注意我在 2.0 中工作 - 其中 CCDirector 是 UIViewController 子类):
在 AppDelegate.h 中,创建一个新的 ivar 来保存从模板代码创建的 CCGLView。然后将在 didFinishLaunching 中创建的 CCGLView 分配给您的新 ivar。这允许导演重用最初创建的视图,而不是每次重新加载 CCDirector 时都尝试重新创建它,这在我的经验中似乎会导致各种奇怪的问题。
您还想在 AppDelegate 中创建一个名为 -setupDirector 的新方法或类似的方法,您将在其中设置导演。每次重新创建 CCDirector 时都应该调用它。我已经在下面发布了我的版本。注意我的 CCGLView 的 ivar 被称为“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];
}
此外,您还需要对模板加载视图控制器的方式进行一些更改。通常 cocos2D 会设置以 director_ 作为根视图控制器的导航控制器。在这里,您要分配并初始化您的菜单视图控制器并添加 THAT 而不是 director_:
// Create a Navigation Controller with the Director
gamesTVC_ = [[GamesTableViewController alloc] initWithStyle:UITableViewStyleGrouped];
navController_ = [[UINavigationController alloc] initWithRootViewController:gamesTVC_];
navController_.navigationBarHidden = NO;
didFinishLaunching 中的其他所有内容都可以保持不变。现在,在您的 startGameButtonPressed 方法中的 menuViewController 中,您将在您的应用实例上调用新创建的 setupDirector 方法,该方法通过调用来引用:
AppController *app = (AppController *)[[UIApplication sharedApplication] delegate];
if ([CCDirector sharedDirector].runningScene) {
[[CCDirectorIOS sharedDirector] end];
}
[app setupDirector];
[app.navController pushViewController:app.director animated:YES];
我包括一个检查以确保 CCDirector 没有仍在运行,如果是,则结束它。在您的游戏层中,当您想要弹出视图控制器时,您只需像这样调用它:
AppController *app = (AppController *)[[UIApplication sharedApplication] delegate];
[app.navController popViewControllerAnimated:YES];
[[CCDirector sharedDirector] end];
这个流程应该允许您自由地使用导航控制器通过 CCDirector 推送您的游戏场景,并在您想要返回基于 UIKit 的主菜单时弹出该视图控制器。我希望这会有所帮助,因为我花了很多令人沮丧的时间来尝试为我自己的游戏做好准备。