2014-12-04 49 views
2

使用Cocos2d-html5,有什麼方法可以「退出」引擎並重新初始化其狀態,以便以後可以重新啓動引擎。我們在單個頁面的Web應用中使用Cocos2d遊戲。如果用戶導航到另一個頁面,我們希望以編程方式刪除canvas div並嘗試退出Cocos2d引擎。不幸的是,似乎沒有好辦法做到這一點,並試圖加載一個新遊戲導致錯誤。Cocos2d-html5 - 重新啓動/退出引擎可能嗎?

如何清理卸載場景並退出引擎?

我們正在使用V3.1並嘗試了幾種方法,它們都不起作用。例如:

  1. 嘗試重置保存在cc對象中的許多變量(詳細內容如下)。這種方法迫使你重置在_開始時看起來是私有的變量,這些變量不在文檔中。
  2. 挑選,選擇和重寫一些CCBoot.js,但這看起來很複雜,並且不能持續引擎更新,因爲它的大部分依賴於整個庫。

其他方法我想到了,但聽起來就像一個黑客:
3.空整個CC對象不知何故再次運行該腳本,但可能意味着剝離出一個腳本標記或模塊添加和重新運行。
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 

回答

0

我設法得到它停止/現在用於特定用途的情況下恢復足夠了,這裏是一個演示: http://plnkr.co/edit/BQmmHi?p=preview

現在有一個公開的方式暫停在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元素和暫停/恢復。

相關問題