gpt4 book ai didi

ios - cocos2d 2.0-rc2 : end the director and restart

转载 作者:可可西里 更新时间:2023-11-01 03:27:28 25 4
gpt4 key购买 nike

我有一个使用 UIKit 菜单的 cocos2d 驱动的游戏,所以我只使用一个 viewcontroller 的框架,也就是游戏本身。而且,它只有一个场景。由于 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],但它稍后仍会尝试访问 View (可能在另一个线程上)。

现在的问题是,在第二次调用我的上述方法时(当用户想要从菜单开始另一个游戏时)startGameButtonPressed, Controller 被按下但屏幕仍然是黑色的。游戏正在运行并有响应,但我什么也没看到。有人可以帮我解决这个问题吗?

最佳答案

好的,我遇到了同样的问题,我能够“修复它”。

当您设置 CCGLView 和 [director setView:] 时,即使弹出 Controller ,场景仍然存在。唯一发生的事情是场景停止。

所以为了让“重启”工作,你必须检查是否已经有一个正在运行的场景(即使它已经停止,而不是 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]];

}

希望这段代码能帮到你,因为我花了一整天的时间试图弄明白这个问题。这可能不是正确的方式,甚至不是最漂亮的方式,但它确实有效:)

编辑:另外,请注意,如果您 POP COCOS2D 场景,则不必 [[CCDirector sharedDirector] end],因为当 View 被释放/删除时动画将停止。

关于ios - cocos2d 2.0-rc2 : end the director and restart,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11037134/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com