我有一款由 cocos2d 驱动的游戏,它使用 UIKit 菜单,所以我只使用一个视图控制器的框架,即游戏本身。而且,它只有一个场景。从cocos2d 2.0开始,director本身就是一个UIViewController
子类,所以我只是将它推入我的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
,因为否则应用程序会崩溃[[CCDirector sharedDirector] end]
被称为并且CCGLView
不保留。我认为这可能是 cocos2d 的一个错误。在[[CCDirector sharedDirector] end]
框架调用[self setView:nil]
,但它稍后仍会尝试访问该视图(可能在另一个线程上)。
现在的问题是,在第二次调用上面的方法时(当用户想从菜单开始另一个游戏时),startGameButtonPressed
,导演被推了,但屏幕仍然是黑的。游戏正在运行并响应,我只是看不到任何东西。有人可以帮我解决这个问题吗?
好的,我遇到了同样的问题,并且能够“修复它”。
当你设置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]];
}
希望这段代码会对您有所帮助,因为我花了一整天的时间试图弄清楚这一点。
这可能不是正确的方法,甚至不是最漂亮的方法,但它确实有效:)
EDIT:另外,请注意,如果您POP COCOS2D场景,则不必[[CCDirector sharedDirector] end]
因为当视图被释放/删除时动画将停止。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)