7

私は UIKit メニューを使用する cocos2d を利用したゲームを持っているので、ゲーム自体である 1 つのビュー コントローラー用のフレームワークのみを使用します。また、シーンは1つだけです。cocos2d 2.0 以降では、director 自体がサブクラスになっているため、ユーザーが開始ボタンをタップしたときにUIViewControllerそれを my にプッシュするだけです。MenuViewController

-(void)startGameButtonPressed {

    CCDirectorIOS* director = (CCDirectorIOS *) [CCDirector sharedDirector];


    // Create an CCGLView with a RGB565 color buffer, and a depth buffer of 0-bits
    self.glView = [CCGLView viewWithFrame:CGRectMake(0, 0, 480, 320)
                              pixelFormat:kEAGLColorFormatRGB565    //kEAGLColorFormatRGBA8
                              depthFormat:0 //GL_DEPTH_COMPONENT24_OES
                       preserveBackbuffer:NO
                               sharegroup:nil
                            multiSampling:NO
                          numberOfSamples:0];

    // attach the openglView to the director
    [director setView:glView];
    [director runWithScene:[GameLayer scene]];
    [director setDelegate:(id <CCDirectorDelegate>) [[UIApplication sharedApplication] delegate]];
    [self.navigationController pushViewController:director animated:YES];
}

これは、ユーザーが最初のゲームを開始したときに、メソッドが初めて呼び出されたときに正常に機能します。ゲームが終わったら、私は を呼び出します[[CCDirector sharedDirector] end]

director のセットアップのほとんどは、appDelegate で行います (デフォルトの Cocos2d テンプレートから変更されていません)。CCGLViewを保持プロパティとしてのみ に入れます。そうしないと、 が呼び出されMenuViewControllerたときにアプリがクラッシュし、が保持されないためです。それはcocos2dのバグかもしれないと思います。フレームワークではを呼び出しますが、後で (おそらく別のスレッドで) ビューにアクセスしようとします。[[CCDirector sharedDirector] end]CCGLView[[CCDirector sharedDirector] end][self setView:nil]

ここでの問題は、上記のメソッドの 2 回目の呼び出し (ユーザーがメニューから別のゲームを開始したい場合) でstartGameButtonPressed、ディレクターがプッシュされても画面が黒いままになることです。ゲームは実行され、応答していますが、何も表示されません。誰かが私を助けてくれますか?

4

4 に答える 4

8

OK、同じ問題があり、「修正」できました。

CCGLView と [director setView:] を設定すると、コントローラーをポップしてもシーンが存在します。起こる唯一のことは、シーンが停止することです。

したがって、「再起動」を機能させるには、すでに実行中のシーンがあるかどうかを確認する必要があります (シーンが停止していても、代わりrunWithScene:replaceScene:.

あなたが見ることができるように、ここに私のコードがあります:

- (void)setupCocos2D {
    CCGLView *glView = [CCGLView viewWithFrame:CGRectMake(0, 0, 320, 480)
                               pixelFormat:kEAGLColorFormatRGB565   //kEAGLColorFormatRGBA8
                               depthFormat:0    //GL_DEPTH_COMPONENT24_OES
                        preserveBackbuffer:NO
                                sharegroup:nil
                             multiSampling:NO
                           numberOfSamples:0];

// HERE YOU CHECK TO SEE IF THERE IS A SCENE RUNNING IN THE DIRECTOR ALREADY    
if(![director_ runningScene]){
    [director_ setView:glView]; // SET THE DIRECTOR VIEW
    if( ! [director_ enableRetinaDisplay:YES] ) // ENABLE RETINA
        CCLOG(@"Retina Display Not supported");

    [director_ runWithScene:[HelloWorldLayer scene]]; // RUN THE SCENE

} else {
    // THERE IS A SCENE, START SINCE IT WAS STOPPED AND REPLACE TO RESTART
    [director_ startAnimation];
    [director_ replaceScene:[HelloWorldLayer scene]];
}      


[director_ setDelegate:(id <CCDirectorDelegate>) [[UIApplication sharedApplication] delegate]];

// I DO NOT PUSH BECAUSE I ALREADY PUSHED TO THIS CONTROLLER, SO I ADD THE COCOS2D VIEW AS A SUBVIEW
[self.view addSubview:[director_ view]];

}

私はこれを理解するのに丸一日を費やしたので、このコードがお役に立てば幸いです。それは正しい方法ではないかもしれませんし、最もきれいな方法でさえないかもしれませんが、うまくいきます:)

編集: また、COCOS2D シーンを POP する[[CCDirector sharedDirector] end]場合、ビューの割り当て解除/削除時にアニメーションが停止するため、その必要はありません。

于 2012-06-18T05:00:16.507 に答える
5

私はこれに関連する情報を探すのに数日を費やしました。私自身の経験をあなたと共有します. また、セルがタッチされたときに CCDirector が読み込まれる UITableViewController に読み込まれるゲームを作成しようとしています。これは Game Center のターン制ゲームであるため、その設計 (Words With Friends を考えてみてください) です。これについて私がこれまでに見つけた最良のアプローチは次のとおりです (私は 2.0 で作業していることに注意してください - CCDirector は UIViewController サブクラスです):

AppDelegate.h で、テンプレート コードから作成された CCGLView を保持する新しい ivar を作成します。次に、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_ をルート ビュー コントローラーとしてナビゲーション コントローラーをセットアップします。ここでは、メニュー ビュー コントローラーを割り当てて初期化し、director_ の代わりに THAT を追加します。

// 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 ベースのメイン メニューに戻りたいときにそのビュー コントローラーをポップすることができます。自分のゲームでこれを正しく行うために多くのイライラする時間を費やしてきたので、これがお役に立てば幸いです.

于 2012-07-18T22:56:03.710 に答える
2

うまく機能するのは、director で startAnimation と stopAnimation を呼び出すだけで、cocos2d ビューを維持して再利用することです。

cocos2d とその OpenGL ビューをシャットダウンして後で再初期化しようとすると、十分にテストされていないため、多かれ少なかれ問題が発生します。それを除けば、cocos2d は UIKit で問題なく動作しますが、UIKit ビューと混合するときに他の OpenGL ES アプリと同じ問題が発生します。

于 2012-06-14T22:56:20.807 に答える
0

私の経験では、Cocosは終了と再開を実際にはサポートしていません。それは完了したように動作し、ほとんどシャットダウンします。

あなたが試すことができる2つのことがあります、最初の1つ(そしてそれはちょうど私の頭に浮かんだ)はCC_DIRECTOR_INIT、ディレクターが終わった後、そしてあなたがそれを再開したい前に(正確な名前ではないかもしれません)電話することです。

2つ目は、directorのソースコードを編集し、endメソッドを変更してcocosを使用可能な状態のままにすることです(ビューの解放やキャッシュのパージなどを停止します)。これの代わりに、start開始する前にCocosが使用可能な状態にあることを確認するようにメソッドを変更できます。

残念ながら、CocosではUIKit + Cocosを簡単に使用することはできませんが、運が良ければ可能です。

于 2012-06-14T16:21:43.290 に答える