作为UIView的coco2d游戏也是从viewcontroller启动的
coco2dgame=[[coco2d_view alloc] initWithFrame:CGRectMake(0,0,320,480)];
[self.view addSubview:coco2dgame];当它结束时
[coco2dgame.director end];
[coco2dgame removeFromSuperview];
coco2dgame=nil;当我想重新启动时,我会再次呼叫
coco2dgame=[[coco2d_view alloc] initWithFrame:CGRectMake(0,0,320,480)];
[self.view addSubview:coco2dgame];但是我得到了一些错误
OpenGL error 0x0502 in -[CCSprite draw] 532
OpenGL error 0x0502 in -[CCSprite draw] 532发布于 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,如下所示:
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中创建一个方法来设置指挥交换机并将其推送到导航控制器的堆栈上,如下所示:
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时,请实现以下代码:
AppController *app = (AppController *)[[UIApplication sharedApplication] delegate];
[app.navController popViewControllerAnimated:YES];
[[CCDirectorIOS sharedDirector] end];这应该允许您自由地从视图控制器迁移到cocos2d中的控制器(也是UIViewController的子类),然后再返回,而不会出现任何问题。希望这为你解释了足够的细节,让我知道它是如何进行的!
https://stackoverflow.com/questions/11697535
复制相似问题