Javascript Cocos2d-html5-是否可以重新启动/退出引擎?

Javascript Cocos2d-html5-是否可以重新启动/退出引擎?,javascript,cocos2d-html5,Javascript,Cocos2d Html5,使用Cocos2d-html5,是否有任何方法可以“退出”引擎并重新初始化其状态,以便稍后重新启动引擎。我们正在单页web应用程序中使用Cocos2d游戏。如果用户导航到另一个页面,我们希望以编程方式删除canvas div并尝试退出Cocos2d引擎。不幸的是,似乎没有什么好方法可以做到这一点,尝试加载新游戏会导致错误 如何才能干净地卸载场景并退出引擎 我们正在使用V3.1并尝试了几种方法,但似乎都不起作用。例如: 尝试重置cc对象中保存的许多变量(详细信息如下)。这种方法强制您重置以u开头且

使用Cocos2d-html5,是否有任何方法可以“退出”引擎并重新初始化其状态,以便稍后重新启动引擎。我们正在单页web应用程序中使用Cocos2d游戏。如果用户导航到另一个页面,我们希望以编程方式删除canvas div并尝试退出Cocos2d引擎。不幸的是,似乎没有什么好方法可以做到这一点,尝试加载新游戏会导致错误

如何才能干净地卸载场景并退出引擎

我们正在使用V3.1并尝试了几种方法,但似乎都不起作用。例如:

  • 尝试重置cc对象中保存的许多变量(详细信息如下)。这种方法强制您重置以u开头且不在文档中的私有变量
  • 挑选、选择和重写一些CCBoot.js,但这看起来很复杂,对于引擎更新来说是不可持续的,因为它在整个库中都是依赖的
  • 我想到的其他方法听起来都像是黑客:
    3.将整个cc对象设为Null,并以某种方式再次运行脚本,但这可能意味着剥离脚本标记或模块,然后添加并再次运行它。
    4.将cc对象包装到另一个对象中,以便更容易重置。CCBoot.js看起来可能会将某些内容附加到窗口对象

    我在第一种方法上已经走得最远了,但我仍被上下文问题所困扰。离开画布时,在将其从DOM中移除之前,我将其称为:

    // Remove anything that might possibly keep a reference to the old context
    cc.textureCache.removeAllTextures();
    cc._drawingUtil = null;
    cc.stencilBits = null;
    
    // Purge the cc.director, schedules, event listeners, running scene, animations, cached data.
    cc.director.purgeDirector();
    
    // Remove references to the context
    cc._renderContext = null;
    cc.webglContext = null;
    window.gl = null;
    cc._mainRenderContextBackup = null;
    
    // Remove reference to DOM elements
    cc._canvas = null;
    cc.container = null;
    cc._gameDiv = null;
    
    // Reset CCBoot variables that might stop us from re-initialising
    cc._rendererInitialized = false;
    cc._setupCalled = false;
    cc._renderType = -1;
    
    然后当我们在第二次或后续时间调用中重新启动时

    // Reset all system and flag variables
    cc._initSys(cc.game.config, cc.game.CONFIG_KEY);
    
    cc.game.run();
    
    下面是我遇到的错误。看起来没有正确重置上下文:

    WebGL: INVALID_OPERATION: bindTexture: object not from this context
    WebGL: INVALID_OPERATION: texImage2D: no texture
    WebGL: INVALID_OPERATION: uniformMatrix4fv: location is not from current program
    WebGL: INVALID_OPERATION: vertexAttribPointer: no bound ARRAY_BUFFER
    

    我已经设法让它停止/恢复到足以满足特定用例的状态,下面是一个演示:

    在v3.13中,现在有了一种暂停游戏的公共方式,因此我可以调用:

    cc.game.pause();
    
    然后从DOM中删除cc.container:

    cc.container.parentNode.removeChild(cc.container);
    
    然后,我可以将其再次放回DOM中我想要的任何位置:

    targetContainerEl.appendChild(cc.container);
    
    然后通过调用以下命令继续游戏:

    cc.game.resume();
    
    注意:在cocos2d v3.5中的一个复杂应用程序中,在DOM中替换后需要下一行,但不确定v3.13中是否还需要下一行:

    cc.EGLView._instance._frame = cc.container.parentNode;
    
    上面链接中的演示将被删除并放置在2个不同的DOM元素中,并暂停/恢复