0

UIKit (および Interface Builder のすべての便利さ) と Cocos2D (強力なゲーム エンジン) を組み合わせた、かなり大規模な iOS アプリケーションのフレームワークを構築しようとしています。私の目標は、アプリのすべての GUI を IB で設計し、必要に応じて Cocos2D をカプセル化するビューを初期化することです。この設計により、2 つのフレームワークを互いに分離したままにしておきたいと考えています。

Cocos2d テンプレート プロジェクトには AppDelegate クラスが付属しており、EAGLView のセットアップ、CCDirector の構築、および 2 つの接続に時間を費やします。たとえば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

This is possible, and I have done it before following this tutorial here

The tutorial is a bit outdated with an older version of cocos2d, and does not use storyboards, but you should be-able to get the basic idea from this.

于 2013-03-30T05:42:54.087 に答える
0

私はアプリでこれを行いました。私がしたことは、ユーザーがストーリー ブックを起動するたびに表示される CocosViewController という .xib を作成することでした (ストーリー ブックは cocos2d で表示され、アプリの残りの部分は UIKit です)。このビューは特別なものではなく、内部に 1 つのビューを持つ平面ビュー コントローラーです。cocos ディレクターを UINavigationController に追加し、そのコントローラーを提示するだけです。GLビューを設定するときは、フレームをView Controllerのサイズに合わせます。

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 に答える