首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS在Viewcontroller中正确结束Coco2D游戏并重新启动问题

iOS在Viewcontroller中正确结束Coco2D游戏并重新启动问题
EN

Stack Overflow用户
提问于 2012-07-28 09:37:58
回答 1查看 620关注 0票数 2

作为UIView的coco2d游戏也是从viewcontroller启动的

代码语言:javascript
复制
           coco2dgame=[[coco2d_view alloc] initWithFrame:CGRectMake(0,0,320,480)];
            [self.view addSubview:coco2dgame];

当它结束时

代码语言:javascript
复制
         [coco2dgame.director end];
         [coco2dgame removeFromSuperview];
          coco2dgame=nil;

当我想重新启动时,我会再次呼叫

代码语言:javascript
复制
           coco2dgame=[[coco2d_view alloc] initWithFrame:CGRectMake(0,0,320,480)];
            [self.view addSubview:coco2dgame];

但是我得到了一些错误

代码语言:javascript
复制
           OpenGL error 0x0502 in -[CCSprite draw] 532

            OpenGL error 0x0502 in -[CCSprite draw] 532
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-07-29 06:18:27

你的代码设置看起来有点古怪。您正在UIView上加载cocos2d,但在该视图上保留了控制器( ViewController)。在ViewController结构中启动和结束cocos2d引擎可能有点棘手,但这就是我在游戏中使用的:

步骤1:根据模板修改AppDelegate.m中的标准代码。您需要注释掉处理_director ivar的所有行,并将根视图控制器从_director更改为您的ViewController。游戏现在将在cocos2d模板代码中创建的ViewController中启动,而不是在_director中启动。

步骤2:启动cocos2d的ViewController需要有一个在-init中调用的方法来创建,这一点很重要,保留了指挥交换机用作其视图的 CCGLView,如下所示:

代码语言:javascript
复制
AppController *app = (AppController *)[[UIApplication sharedApplication] delegate];
myGLView = [[CCGLView viewWithFrame:[app.window bounds]
                        pixelFormat:kEAGLColorFormatRGB565  //kEAGLColorFormatRGBA8
                        depthFormat:0   //GL_DEPTH_COMPONENT24_OES
                 preserveBackbuffer:NO
                         sharegroup:nil
                      multiSampling:NO
                    numberOfSamples:0] retain];

保留CCGLView对于防止某些OpenGL错误很重要,因为cocos2d在销毁后重新创建它似乎有问题。就像我说过的,这个方法只被调用一次,在你启动cocos2d的ViewController的-init方法中。

步骤3:在ViewController中创建一个方法来设置指挥交换机并将其推送到导航控制器的堆栈上,如下所示:

代码语言:javascript
复制
AppController *app = (AppController *)[[UIApplication sharedApplication] delegate];

CCDirectorIOS* director = (CCDirectorIOS *) [CCDirector sharedDirector];
director.wantsFullScreenLayout = YES;
[director setView:myGLView];
// Display FSP and SPF
[director setDisplayStats:NO];

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

// for rotation and other messages
[director setDelegate:app];

// 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");

if (director.runningScene)
    [director replaceScene:[TwoPlayerBoard node]];
else
    [director pushScene:[TwoPlayerBoard node]];

[app.navController pushViewController:director animated:YES];

大部分代码实际上是从AppDelegate中注释掉的代码复制而来的,原来的director就是在这里设置的。请注意,您将控制器的视图设置为在ViewController的-init中创建和保留的CCGLView。在此方法中,您可以让新创建的导演推送您的启动场景。

步骤4:在游戏层内部,每当您想要返回游戏(cocos2d)所在的ViewController时,请实现以下代码:

代码语言:javascript
复制
AppController *app = (AppController *)[[UIApplication sharedApplication] delegate];
[app.navController popViewControllerAnimated:YES];
[[CCDirectorIOS sharedDirector] end];

这应该允许您自由地从视图控制器迁移到cocos2d中的控制器(也是UIViewController的子类),然后再返回,而不会出现任何问题。希望这为你解释了足够的细节,让我知道它是如何进行的!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11697535

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档