作为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
答案 0 :(得分:2)
您的代码设置似乎有点令人讨厌。您正在UIView上加载cocos2d,但在该视图上保留了director(一个ViewController)。在ViewController结构中启动和结束cocos2d引擎可能有点棘手,但这是我在游戏中使用的:
步骤1:从模板修改AppDelegate.m中的标准代码。您需要注释掉处理_director ivar的所有行,并将根视图控制器从_director更改为ViewController。游戏现在将启动到在cocos2d模板代码而不是_director中创建的navController中的ViewController。
第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在销毁之后似乎有一个问题需要重新创建。就像我说的那样,这个方法只调用一次,在ViewController的-init方法中,你从中启动cocos2d。
步骤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中已注释掉的代码中复制出来的,原来的导演已经设置好了。请注意,您将导演的视图设置为您在ViewController的-init中创建和保留的CCGLView。在这种方法中,你有新创建的导演推动你的启动场景。
步骤4:在游戏层内,每当您想要返回启动游戏(cocos2d)的ViewController时,请执行以下代码:
AppController *app = (AppController *)[[UIApplication sharedApplication] delegate];
[app.navController popViewControllerAnimated:YES];
[[CCDirectorIOS sharedDirector] end];
这应该允许您从视图控制器自由移动到cocos2d中的控制器(也是UIViewController的子类),并且没有任何问题。希望能够为您详细解释它,让我知道它是怎么回事!