我有一个带有cocos场景的viewController,我在我的导航控制器中推送。在这个视图控制器中,我有这样的方法:
-(void) viewDidLoad
{
[super viewDidLoad];
[_cc3FrameView addSubview: [self createGLView]];
CC3Backgrounder.sharedBackgrounder.shouldRunTasksOnRequestingThread = YES;
}
- (void) viewWillAppear:(BOOL)animated
{
if (!sceneInitialized) {
sceneInitialized = YES;
[CCDirector.sharedDirector runWithScene: [[self makePanoramaScene] asCCScene]];
} else {
[CCDirector.sharedDirector resume];
}
[CCDirector.sharedDirector startAnimation];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[[self runningPanoramaScene] sceneWillShow];
});
}
-(AxPanoramaScene *)runningPanoramaScene
{
CCScene *scene = [CCDirector.sharedDirector runningScene];
AxPanoramaLayer *panoramaLayer = [scene.children lastObject];
AxPanoramaScene *panoramaScene = (AxPanoramaScene *)panoramaLayer.cc3Scene;
return panoramaScene;
}
-(void)viewWillDisappear:(BOOL)animated
{
[CCDirector.sharedDirector pause];
}
当我按下这个控制器时 - 一切正常,但是当我弹出这个控制器并再次推动它时 - 我在日志中得到了明亮的粉红色屏幕和连续消息:
2014-12-12 19:30:06.447 UniversalMapExample[2262:258353] cocos2d: animation started with frame interval: 60.00
2014-12-12 19:30:06.452 UniversalMapExample[2262:258353] cocos2d: surface size: 768x973
OpenGL error GL_INVALID_OPERATION detected at -[CCES2Renderer resizeFromLayer:] 161
2014-12-12 19:30:06.452 UniversalMapExample[2262:258353] Failed to make complete framebuffer object 0x8219
2014-12-12 19:30:06.453 UniversalMapExample[2262:258353] cocos2d: surface size: 768x973
OpenGL error GL_INVALID_OPERATION detected at -[CCES2Renderer resizeFromLayer:] 161
2014-12-12 19:30:06.453 UniversalMapExample[2262:258353] Failed to make complete framebuffer object 0x8219
OpenGL error GL_INVALID_OPERATION detected at -[CCRenderer(NoARCPrivate) setRenderState:] 232
OpenGL error GL_INVALID_OPERATION detected at -[CCRenderer(NoARCPrivate) setRenderState:] 232
OpenGL error GL_INVALID_OPERATION detected at -[CCRenderer(NoARCPrivate) setRenderState:] 232
OpenGL error GL_INVALID_OPERATION detected at -[CCRenderer(NoARCPrivate) setRenderState:] 232
[***GL ERROR***] GL_INVALID_VALUE: Numeric argument is out of range from glUseProgram(15).
[***GL ERROR***] GL_INVALID_OPERATION: Operation not allowed in current state from glUniform3fv(7, 4, (0.329, 0.944, 0.000)) setting u_cc3LightSpotDirectionModel.
[***GL ERROR***] GL_INVALID_OPERATION: Operation not allowed in current state from glUniformMatrix4fv(12, 1, GL_FALSE,
[0.021050, -0.007339, -0.000000, 0.210503
0.000000, -0.000000, 0.017596, -0.977556
0.005937, 0.017031, 0.000000, -0.660065
0.005926, 0.016997, 0.000000, 1.339256]) setting u_cc3MatrixModelViewProj.
如何使用cocos场景多次正确推送控制器?我将示例从cocos源更改为此代码。我在这做错了什么?请注意 - 我的控制器不是CCDirector
- 它只包含一个带有Cocos场景的视图 - 实现就像CC3DemoMultiScene
。谢谢!
答案 0 :(得分:1)
这是我博客的复制/粘贴,其中我介绍了类似的问题。唯一的区别是我想要完整的UIKit集成。第二次我确实遇到了问题。也许它会对你有所帮助。
http://www.notthepainter.com/full-cocos2d-uikit-integration/
我正在开发基于cocos2d的点击游戏,但我无法两次运行游戏。很明显,我没有正确关闭第一场比赛或正确建立第二场比赛,或两者都没有!
网上有很多教程教你如何在你的Cocos2D应用程序中添加UIKit按钮,或者如何从基于UIKit的应用程序启动Cocos2D。但我需要做到这两点。我希望在我的游戏下使用UIViewController,在游戏中使用UIKit小部件。我花了很多时间阅读,这就是我想出来的。
首先,构建Xcode项目是一场噩梦。我最终使用了cocos2d / box2d模板,然后删除了我不需要的文件,并将所有原始文件添加回来.AppDelegate.m文件看起来就像非cocos2d应用程序应该看起来。这与许多建议您在AppDelegate中构建cocos2d环境的教程不同。我挣扎着,在星期五的大部分时间没有运气,然后在周一我放入了Cocos2DSingleton,它几乎是第一次运行。
这是我的GameViewController的viewDidLoad方法:
- (void)viewDidLoad
{
[super viewDidLoad];
[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:NO];
TTCocos2DSingleton *shared = [TTCocos2DSingleton sharedCocos2D];
CCGLView *glView = [shared currentGLView];
[self.view insertSubview:glView atIndex:1];
}
有一些观点需要注意。 GameViewController有游戏UIButtons,得分UILabels和其他游戏类型的UI小部件。这让我可以在Interface Builder中进行很多游戏控制,而不是手工制作。注意我隐藏了状态栏,因为游戏是全屏的。
我通过单例获取我的cocos2d实例,获取它的glView并将其插入到GameViewController的索引1的视图中。这将它置于所有游戏控件之下。稍后我将向您展示sharedCocos2D方法,让我们看一下viewWillAppear。
- (void) viewWillAppear:(BOOL)animated
{
if(![[CCDirector sharedDirector] runningScene]){
CCScene *scene = [MyGameLayer scene];
myGame = [MyGameLayer node];
myGame.delegate = self;
[scene addChild: myGame];
[[CCDirector sharedDirector] runWithScene:scene];
} else {
// we have a scene already, replace the original to get a new game
[[CCDirector sharedDirector] startAnimation];
CCScene *scene = [MyGameLayer scene];
myGame = [MyGameLayer node];
myGame.delegate = self;
[scene addChild: myGame];
[[CCDirector sharedDirector] replaceScene:scene];
}
}
请注意我们如何处理第一次运行与第二次运行不同。对于第二次和后续运行,我们用新的场景替换场景。这避免了所有“重启”问题。还要注意我设置了一个委托。我使用委托协议在我的游戏层和我的UIViewController之间进行通信。
我的单身模式来自Duck Rowing博客,我必须承认这是一个非常棒的博客名称。我不会在这里显示所有的单例代码,这篇博客是关于cocos2d的,但这里是我如何构建我的cocos2d环境。
+ (TTCocos2DSingleton *) sharedCocos2D;
{
static dispatch_once_t onceQueue;
dispatch_once(&onceQueue, ^{
if (sharedInstance) {
return;
}
sharedInstance = [[TTCocos2DSingleton alloc]init];
// Create an CCGLView with a RGB565 color buffer, and a depth buffer of 0-bits
sharedInstance->glView = [CCGLView viewWithFrame:[[UIScreen mainScreen] bounds]
pixelFormat:kEAGLColorFormatRGB565 //kEAGLColorFormatRGBA8
depthFormat:0 //GL_DEPTH_COMPONENT24_OES
preserveBackbuffer:NO
sharegroup:nil
multiSampling:NO
numberOfSamples:0];
[sharedInstance->glView setMultipleTouchEnabled:YES];
[sharedInstance setupDirector];
});
return sharedInstance;
}
单身人士设置CCGLView,启用多点触控,然后设置导演。 (我把它放在另一种方法中,因为我错误地认为,我需要在其他地方调用它。结果我不需要。)
- (void)setupDirector
{
CCDirectorIOS *director = (CCDirectorIOS*) [CCDirector sharedDirector];
[director setView:glView];
[director enableRetinaDisplay:YES];
director.wantsFullScreenLayout = YES;
[director setDisplayStats:NO];
[director setAnimationInterval:1.0/60];
}
在setupDirector中,我们设置了cocos2d应用程序所需的常见嫌疑人。现在游戏可以多次播放,我下面有一个完整的UIViewController / UINavController,我的游戏上有UIKit小部件。涅。
答案 1 :(得分:1)
请记住,CCDirector
是UIViewController
,但它也是一个单身人士,这会给它带来一些独特的细微差别。
例如,每次要更换控制器时,您似乎都在调用createGLView
方法。如果它遵循CC3DemoMultiScene
设计,则会尝试在旧CCGLView
单例释放之前重新创建另一个CCDirector
。
通常最好将您为其创建的CCDirector
和CCGLView
视为独立的可重复使用单元。弹出包含控制器时,保持原样,只需每次从视图层次结构中添加和删除CCGLView
。
...比尔