Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何重置three.js时钟?_Javascript_Three.js - Fatal编程技术网

Javascript 如何重置three.js时钟?

Javascript 如何重置three.js时钟?,javascript,three.js,Javascript,Three.js,我想重置时钟,以便clock.getElapsedTime()在我重置时钟时为我提供一个新时间(例如,在第二次重新启动游戏级别/场景时非常有用) 我正在启动clock=new-THREE.clock()在init()和我的游戏循环update()中,我使用这个时钟。但当游戏结束时,我想重置时钟(我不会再次启动关卡,只是将玩家放回起点,所以我不会启动新的时钟) 我怎样才能做到这一点 坏消息:自2015年10月发布以来,不可能将3.时钟重置为零时间。解释如下,唯一可能的解决办法是在这个答案的末尾 深

我想重置时钟,以便
clock.getElapsedTime()
在我重置时钟时为我提供一个新时间(例如,在第二次重新启动游戏级别/场景时非常有用)

我正在启动
clock=new-THREE.clock()
init()
和我的游戏循环
update()
中,我使用这个时钟。但当游戏结束时,我想重置时钟(我不会再次启动关卡,只是将玩家放回起点,所以我不会启动新的时钟)


我怎样才能做到这一点

坏消息:自2015年10月发布以来,不可能将
3.时钟
重置为零时间。解释如下,唯一可能的解决办法是在这个答案的末尾

深入研究了三点钟设计中存在的问题 时钟的设计是危险的

--杜布先生

要了解
THREE.Clock
中的缺陷,我们必须检查它的工作原理。我们可以看到,在中,有几个变量被实例化,首先glace看起来我们可以覆盖
时钟
实例以重置为零:

this.startTime = 0;
this.oldTime = 0;
this.elapsedTime = 0;
然而,再深入一点,我们需要弄清楚什么时候调用。在引擎盖下,它调用,这会变异
this.elapsedTime
,这意味着,但我们仍然需要仔细查看
getDelta

var newTime = self.performance.now();

diff = 0.001 * ( newTime - this.oldTime );
this.oldTime = newTime;
this.elapsedTime += diff;
此函数引用一些未知的隐式全局变量,
self
,并调用一些奇数函数,
self.performance.now()。红旗!但是让我们继续挖掘

事实证明,三个变量定义了一个全局变量,
self
,其属性是
performance
,方法是
now()

回到
this.elapsedTime
一会儿,看看它是如何计算这个.elapsedTime的。它基于
self.performance.now()
返回的值。表面上看,这似乎很天真,但真正的问题却出现在这里。我们可以在闭包中看到
self.performance.now()
,这意味着外部世界的任何人都无法看到/访问它:

( function () {
    var start = Date.now();
    self.performance.now = function () {
        return Date.now() - start;
    }
} )();
start
变量是应用程序的启动时间,以毫秒为单位从返回

这意味着
Three.js
库加载时,
start
将设置为
Date.now()
为了澄清,简单地包含
Three.js
脚本对计时器有全局的、不可逆的副作用。
回顾时钟,我们可以看到,
self.performance.now()
的返回值用于计算
时钟的当前运行时间。因为这是基于
Three.js
的私有的、不可访问的“开始时间”,所以它总是相对于包含
Three.js
脚本的时间

解决办法#1 在游戏/关卡开始时存储
startTime=clock.getElapsedTime()
,并进行与之相关的所有计算。类似于
var currentTime=clock.getElapsedTime()-startTime
的内容,这是从场景加载/启动获取真实绝对时间的唯一方法

解决办法#2
Three.Clock
引擎盖下的时钟实际上只是一个薄薄的包装,这是一个IE9+可用的方法。您最好围绕这一点创建自己的小抽象,以便使用易于实现的
reset()
方法获得一个合理的时钟。如果我发现一个具有此功能的
npm
软件包,或者我自己制作,我将更新此答案

解决办法#3
等待Three.js
Three.Clock
源代码更新,可能是我更新的。由于它有一个打开的票证,可能会接受修复它的拉取请求。

在游戏开始时保存时间:
var gameStartTime=clock.performance.now()
,然后通过从
clock.performance.now()中减去
gameStartTime
来计算此后的运行时间
在比赛期间的任何其他时间点,包括比赛结束时。例如:
gameStartTime-gameStartTime
将等于零,
clock.performance.now()-gameStartTime
将给出游戏开始后的秒数或分钟数


下面是对JavaScript中计时器函数的引用

安迪,这似乎还是不管用。我已经创建了一个jsbin[here]()。请看一看。时钟应该在5秒后重置,但是console.log输出显示时钟没有重置。这正是我在这里发布之前遇到的问题。在resetClock()中,我甚至在该变量上启动了一个新的时钟,认为无论效率有多低,它都可能实现这一点。时钟=新的三个时钟();哦,我在看更多的源代码,这三个代码设计得很糟糕,让我看看是否能找到解决办法…@krikey我更新了答案,可能比necessary@F需要进行更多的调查,以确保它在整个图书馆没有任何副作用,例如,依赖计时功能的动画查看“.getDelta()”方法是否适合您的需要?