我使用 Three. js 和 WebGL 渲染器来制作一个当点击 play
链接时全屏的游戏。对于动画,我使用 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
。我的解释可能很烂,所以我把代码上传到了我的网站,你可以在这里看到: http://banehq.com/Placeholdername/main.html。
下面的版本中,我没有尝试调用动画方法,而是使用了全屏输入和输出: 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
和 stopAnimating
方法 电话在 start
和 stop
方法中被注释掉了。