playリンクがクリックされたときにフルスクリーンになるゲームを作成するために、WebGL レンダラーで Three.js を使用しています。アニメーションには、 を使用しますrequestAnimationFrame。
私はこのようにそれを開始します:
self.animate = function()
{
self.camera.lookAt(self.scene.position);
self.renderer.render(self.scene, self.camera);
if (self.willAnimate)
window.requestAnimationFrame(self.animate, self.renderer.domElement);
}
self.startAnimating = function()
{
self.willAnimate = true;
self.animate();
}
self.stopAnimating = function()
{
self.willAnimate = false;
}
必要に応じてメソッドを呼び出すと、startAnimating意図したとおりに機能します。しかし、stopAnimating関数を呼び出すと、問題が発生します。報告されたエラーはありませんが...
セットアップは基本的に次のようになります。
playページにリンクがあります- ユーザーがリンクをクリックすると、レンダラー
domElementはフルスクリーンにする必要があります。 - メソッドが呼び出され、
startAnimatingレンダラーがレンダリングを開始します - エスケープがクリックされたら、
fullscreenchangeイベントを登録してstopAnimatingメソッドを実行します - ページはフルスクリーンを終了しようとしますが、ドキュメント全体が完全に空白です
私の他のコードは問題ないと確信しており、どういうわけかrequestAnimationFrame間違った方法で停止しています。私の説明はおそらくひどいものだったので、コードを私の Web サイトにアップロードしました。
これは、アニメーション メソッドを呼び出そうとしないバージョンで、フルスクリーンのインとアウトが機能します: http://banehq.com/Correct/Placeholdername/main.html。
play初めてクリックすると、ゲームが初期化され、そのstartメソッドが実行されます。フルスクリーンが終了すると、ゲームのstopメソッドが実行されます。クリックされるたびplayに、ゲームはそのstartメソッドのみを実行します。これは、再度初期化する必要がないためです。
外観は次のとおりです。
var playLinkHasBeenClicked = function()
{
if (!started)
{
started = true;
game = new Game(container); //"container" is an empty div
}
game.start();
}
startメソッドとstopメソッドは次のようになります。
self.start = function()
{
self.container.appendChild(game.renderer.domElement); //Add the renderer's domElement to an empty div
THREEx.FullScreen.request(self.container); //Request fullscreen on the div
self.renderer.setSize(screen.width, screen.height); //Adjust screensize
self.startAnimating();
}
self.stop = function()
{
self.container.removeChild(game.renderer.domElement); //Remove the renderer from the div
self.renderer.setSize(0, 0); //I guess this isn't needed, but welp
self.stopAnimating();
}
これと実際のバージョンの唯一の違いは、startAnimatingandstopAnimatingメソッドが呼び出されstart、stopメソッドがコメント アウトされていることです。