HTML/Javascript升序数
我正在尝试制作一个简单的javascript游戏。基本上,你可以以每秒一定的速度得到煎饼。在代码中,我将这个值(您得到煎饼的速率)称为pps。我想这样做,当显示煎饼总量的HTML span标记得到更多煎饼时(以pps的速度),它会上升,所以看起来更好 例如,如果我在HTML/Javascript升序数,javascript,setinterval,Javascript,Setinterval,我正在尝试制作一个简单的javascript游戏。基本上,你可以以每秒一定的速度得到煎饼。在代码中,我将这个值(您得到煎饼的速率)称为pps。我想这样做,当显示煎饼总量的HTML span标记得到更多煎饼时(以pps的速度),它会上升,所以看起来更好 例如,如果我在5pps吃煎饼,现在它只会变成0、5、10、等等。。。每一秒。我想让它运行0,1,2,3,4,5(1秒),下一秒6,7,8,9,10,等等 这是我到目前为止为煎饼柜台准备的代码: pps = 100; tp = 0; window.
5
pps吃煎饼,现在它只会变成0、5、10、
等等。。。每一秒。我想让它运行0,1,2,3,4,5(1秒)
,下一秒6,7,8,9,10,
等等
这是我到目前为止为煎饼柜台准备的代码:
pps = 100;
tp = 0;
window.setInterval(function(){
tp += parseInt(pps);
document.getElementById("test").innerHTML = tp;
}, 1000);
有人知道怎么做吗?一个简单的间隔计时器就可以了。大概是这样的:
function incrementToNumber(tag, currentNumber, targetNumber) {
var numTicks = targetNumber - currentNumber;
var interval = setInterval(function() {
currentNumber++;
tag.innerText = currentNumber;
if(currentNumber == targetNumber) {
clearInterval(interval);
}
}, 1000 / numTicks);
}
该特定函数在一秒钟内递增。要更改增量所需的时间,请将1000
换成您希望的毫秒数
对于一个永远增长的版本:
function inrementForever(tag, currentPancakes, pancakesPerSecond) {
setInterval(function() {
currentPancakes++;
tag.innerText = currentPancakes;
}, 1000 / pancakesPerSecond);
}
这是所有游戏都会遇到的问题,您需要正确解决这个问题,才能让游戏在自己的计算机之外正常运行 正确的解决方案是,您需要测量游戏循环的每次迭代之间或每次帧渲染之间的弹性时间。实际上,这将是一个非常小的数字;你可以把这个数字看作是一个“比例因子” 如果您的游戏是关于移动太空船的,并且您希望它每秒移动5个屏幕单位,那么您的游戏循环将:
- 查找自上次间隔以来经过的时间(以秒为单位)。在游戏速率限制为每秒60帧的情况下,这大约是每秒的1/60
- 将船速(每秒5个单位)乘以1/60;船会移动0.8333。。。单位这个刻度
- 把船移那么远
setInterval
对这一点尤其不利,根本不适合作为游戏中的时间来源
JavaScript中的实现很简单:每个游戏循环都记录当前时间,无论时间来源如何;在本例中,您可以使用get Date().getTime()
,它返回自事件发生以来的时间(以毫秒为单位)。记录此值
在随后的重画中,您将再次调用get Date().getTime()
,然后将前面的值减去经过的时间。这是您的比例因子,以毫秒为单位。您可以将pps
乘以该值来确定要添加多少煎饼
即使您使用的是setInterval
,仍然要遵循这种方法,这一点很重要。您可能认为您可以简单地setInterval(…,1000/60)
每秒调用回调60次,但是setInterval
(和setTimeout
)并不准确-它们调用回调的至少在未来很长一段时间内,但可能要远得多。您仍然需要根据上次重画后经过的时间来缩放pps
下面是一个简单的实现:
var-PPS=5;
var lastTime=new Date().getTime();
var=0;
setInterval(函数(){
var currentTime=new Date().getTime()
var elapsedTime=当前时间-上次时间;
lastTime=当前时间;
cakes+=(PPS*(elapsedTime/1000))//elapsedTime以毫秒为单位,除以1000得到分数秒
document.getElementById('pps')。innerText=cakes;
}, 10);代码>
请显示相关代码。但是如果我被迫猜测,我会说您正在做类似于setTimeout(function(){pancakes+=pps;},1000)
?执行setTimeout(function(){pancakes++;},1000/pps)
。是的,通过编写一些代码…;-)好的,我不确定我是否完全理解这一点,对不起,我对这一点比较陌生。如果我有这样的东西:pps=100;tp=0;setInterval(function(){tp+=parseInt(pps);document.getElementById(“test”).innerHTML=tp;},1000)代码>其中tp是总煎饼数,pps是每秒煎饼数,我如何更改此代码以使其与您刚刚发布的代码相同?好的,关于我的版本,需要注意的一点是,一旦达到顶部,它将停止增加。我将用一个永远递增的版本编辑答案。您肯定不想在循环/计时器中调用document.getElementById
。调用它一次,将元素存储在某个位置,以后再引用。@user3385777请不要使用此方法,您不能依靠setInterval
定期调用它的回调。如果您的浏览器因任何原因暂停,计算将被抛出,并且无法恢复。这是一个巨大的问题,很多事情都会导致setInterval
以比实际请求慢得多的速度调用其回调。我的方法不受此问题的影响,是业界公认的解决此问题的方法。@meagar关于setInterval
调用计时的不可靠性是正确的。它不会在指定的时间立即开火。相反,如果您有任何长时间运行的函数,它会对可能长时间不会触发的事件进行排队。我仍然建议预加载span元素,而不是每次在循环中抓住它,但总体上他的解决方案更安全。除非显示中的分数值是可接受的,否则innerText应该设置为Math.floor(cakes)
。