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();
}
これと実際のバージョンの唯一の違いは、startAnimating
andstopAnimating
メソッドが呼び出されstart
、stop
メソッドがコメント アウトされていることです。