0

我正在尝试为一个相当广泛的 iOS 应用程序构建一个框架,它将 UIKit(以及 Interface Builder 的所有便利)与 Cocos2D(一个强大的游戏引擎)结合起来。我的目标是使用 IB 设计应用程序的所有 GUI,并在必要时初始化一个封装 Cocos2D 的视图。通过这种设计,我希望将这两个框架彼此分开。

Cocos2d 模板项目附带一个 AppDelegate 类,该类花费一些时间设置 EAGLView、构建 CCDirector 并将两者连接起来。例如,考虑applicationWillFinishLaunching在 AppDelegate 中实现的方法(如下)。我的问题是——如果我不想立即从 Cocos2D 视图开始,而是我创建的 MainMenuViewController,我应该在这个函数中注释什么?

CCGLView *glView = [CCGLView viewWithFrame:[window_ bounds]
                               pixelFormat:kEAGLColorFormatRGB565
                               depthFormat:0
                        preserveBackbuffer:NO
                                sharegroup:nil
                             multiSampling:NO
                           numberOfSamples:0];

director_ = (CCDirectorIOS*) [CCDirector sharedDirector];
director_.wantsFullScreenLayout = YES;

// Display FSP and SPF
[director_ setDisplayStats:YES];

// set FPS at 60
[director_ setAnimationInterval:1.0/60];

// attach the openglView to the director
[director_ setView:glView];

// 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 this setting at any time.
[CCTexture2D setDefaultAlphaPixelFormat:kCCTexture2DPixelFormat_RGBA8888];

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];

// Create a Navigation Controller with the Director
navController_ = [[MyNavigationController alloc] initWithRootViewController:director_];
navController_.navigationBarHidden = YES;

// for rotation and other messages
[director_ setDelegate:navController_];

// set the Navigation Controller as the root view controller
[window_ setRootViewController:navController_];

// make main window visible
[window_ makeKeyAndVisible];

我的直接想法是废弃 glView 以及与之相关的所有内容。但是,我对设置 MyNavController、设置主管的委托和 rootViewController 的工作方式有点不清楚。

4

2 回答 2

0

这是可能的,我在学习本教程之前已经完成

该教程使用旧版本的 cocos2d 有点过时,并且不使用故事板,但是您应该能够从中获得基本思想。

于 2013-03-30T05:42:54.087 回答
0

我已经在一个应用程序中做到了这一点。我所做的是创建一个名为 CocosViewController 的 .xib,每当用户启动故事书时都会显示它(故事书显示在 cocos2d 中,而应用程序的其余部分是 UIKit)。这个视图没什么特别的,只是一个平面视图控制器,里面有一个视图。我只是将 cocos 导向器添加到 UINavigationController,并呈现该控制器。在设置 GL 视图时,我将框架与视图控制器的大小相匹配。

这是可用于设置 cocos2d 的代码示例。如果场景已经在运行,我会结束它,否则如果场景已经在运行,你会得到一个讨厌的 opengl 错误。尽管在卸载视图时结束导演不应该发生这种情况。



    @interface CocosViewController ()
    {
        UINavigationController* navController_;
        CCDirectorIOS* director_;
    }

    @end


    @implementation CocosViewController

    -( void ) setupCocos2d
    {
        director_ = ( CCDirectorIOS* )[CCDirector sharedDirector];

        if( [director_ runningScene] != nil )
            [[CCDirector sharedDirector] end];

        CCGLView *glView = [CCGLView viewWithFrame:[self.view bounds]
                                       pixelFormat:kEAGLColorFormatRGB565
                                       depthFormat:0
                                preserveBackbuffer:NO
                                        sharegroup:nil
                                     multiSampling:NO
                                   numberOfSamples:0];

        director_.wantsFullScreenLayout = YES;
        [director_ setDisplayStats:YES];
        [director_ setAnimationInterval:1.0/60];
        [director_ setView:glView];

        [director_ setProjection:kCCDirectorProjection2D];

        if( ![director_ enableRetinaDisplay:YES] )
            CCLOG(@"Retina Display Not supported");

        [CCTexture2D setDefaultAlphaPixelFormat:kCCTexture2DPixelFormat_RGBA8888];

        CCFileUtils *sharedFileUtils = [CCFileUtils sharedFileUtils];
        [sharedFileUtils setEnableFallbackSuffixes:NO];
        [sharedFileUtils setiPadSuffix:@"-ipad"];
        [sharedFileUtils setiPhoneRetinaDisplaySuffix:@"-hd"];
        [sharedFileUtils setiPadRetinaDisplaySuffix:@"-ipadhd"];

        [CCTexture2D PVRImagesHavePremultipliedAlpha:NO];

        navController_ = [[UINavigationController alloc] initWithRootViewController:director_];
        navController_.navigationBarHidden = YES;

        [director_ setDelegate:navController_];
        [self presentViewController:navController_ animated:NO completion:nil];
    }

我在 viewDidLoad 中调用它。它主要发生在模板项目中的 cocos2d 应用程序委托中。完成后,当视图卸载时,不要忘记结束导演 [CCDirector sharedDirector] end]。

如果您还有其他问题,请告诉我。希望这有帮助。

于 2013-06-20T01:08:40.330 回答