2

Cocos2d-html5 を使用して、後でエンジンを再起動できるように、エンジンを「終了」してその状態を再初期化する方法はありますか? 単一ページの Web アプリで Cocos2d ゲームを使用しています。ユーザーが別のページに移動した場合、プログラムでキャンバス div を削除し、Cocos2d エンジンを終了しようとします。残念ながら、これを行う良い方法はないようで、新しいゲームをロードしようとするとエラーが発生します。

シーンをきれいにアンロードしてエンジンを終了するにはどうすればよいですか?

私たちは V3.1 を使用しており、いくつかのアプローチを試しましたが、どれもうまくいかないようです。例えば:

  1. cc オブジェクトに保持されている多くの変数をリセットしようとしています (詳細は後述)。このアプローチでは、_ で始まり、ドキュメントに記載されていないため、プライベートに見える変数をリセットする必要があります。
  2. CCBoot.js の一部を選択、選択、および書き換えましたが、これは複雑であり、ライブラリ全体に依存しているため、エンジンの更新に耐えられないように見えました。

私が考えた他のアプローチですが、すべてハックのように聞こえます:
3. cc オブジェクト全体を null にして、何らかの方法でスクリプトを再度実行します。
4. cc オブジェクトを別のオブジェクトでラップして、リセットしやすくします。CCBoot.js は、window オブジェクトに何かをアタッチするようです。

私は最初のアプローチから遠く離れていますが、コンテキストの問題で立ち往生しています。キャンバスを離れるとき、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;

その後、2回目以降の呼び出しで再起動すると

// 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
4

1 に答える 1