无法在 Cocos3D 中第二次显示场景



我有一个带有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.谢谢!

请记住,CCDirector是一个UIViewController,但它也是一个单例,这给了它一些独特的细微差别。

例如,您似乎每次要更换控制器时都会调用 createGLView 方法。如果它遵循CC3DemoMultiScene设计,这将尝试在旧CCGLViewCCDirector单例中释放之前重新创建另一个。

通常,最好将为其创建的CCDirectorCCGLView视为独立的可重用单元。弹出包含控制器时,请保持所有内容不变,只需每次在视图层次结构中添加和删除CCGLView即可。

。法案

这是我博客的复制/粘贴,我在其中介绍了类似的问题。唯一的区别是我想要完整的UIKit集成。我确实遇到了第二次通过的问题。也许它会帮助你。

http://www.notthepainter.com/full-cocos2d-uikit-integration/

我正在开发一个基于 cocos2d 的敲击游戏,但我无法运行我的游戏两次。很明显,我没有正确关闭第一个游戏或正确构建第二个游戏,或者两者兼而有之!

网络上有很多教程教你如何将UIKit按钮添加到Cocos2D

应用程序,或者如何从基于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、得分 UILabel 和其他游戏类型的 UI 小部件。这让我可以在界面生成器中做很多游戏控件,而不是手动布置它们。请注意,我隐藏了状态栏,因为游戏是全屏的。

我通过单例获取我的 cocos2d 实例,获取它的 glView 并将其插入索引 1 处的游戏视图控制器视图中。这使它低于所有游戏控件。稍后我将向您展示共享Cocos2D方法,让我们看看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 之间进行通信。

我的单例模式来自鸭子划船博客,我必须承认这是一个非常棒的博客名称。我不打算在这里展示所有的单例代码,这个博客是关于 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小部件。涅盘。

相关内容

  • 没有找到相关文章

最新更新