使用UIKit实现Cocos2D(IB)

时间:2013-03-29 23:32:17

标签: ios cocos2d-iphone

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

Cocos2d模板项目附带一个AppDelegate类,花费一些时间设置EAGLView,构建CCDirector并连接两者。例如,考虑在AppDelegate中实现的applicationWillFinishLaunching方法(下面)。我的问题是这个 - 如果我不想立即开始使用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有点不清楚。

2 个答案:

答案 0 :(得分:0)

这是可能的,我在遵循本教程here

之前已经完成了

该教程有点过时的旧版cocos2d,并没有使用故事板,但你应该能够从中获得基本的想法。

答案 1 :(得分:0)

我在一个应用程序中完成了这个。我做的是创建一个名为CocosViewController的.xib,每当用户启动一本故事书时就会出现(故事书在cocos2d中显示,而应用程序的其余部分是UIKit)。这个视图没什么特别,只是一个平面视图控制器,里面有一个视图。我只是将cocos director添加到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 app委托中。完成视图卸载后,不要忘记结束导演[CCDirector sharedDirector] end。

如果您还有其他问题,请与我们联系。希望这有帮助。