在开始之前,我为您在本文中可能看到的丰富代码道歉。这是我曾试图解决的最烦人的错误。我已经工作了几个小时,但我还没有找到任何东西。
我有两个JavaScript变量,一个名为addfood
,另一个名为clicks
。
下面的第一个函数(addBPS
)获取变量addfood
和clicks
中的数字,并再次将该总和重新分配给变量clicks
。
该函数的下一个块只运行一个div中计数的动画。它读取div中的数字,并将其“动画”为变量clicks
中的新数字。
当变量if
大于零时,函数运行函数后的addfood
语句。它还每秒运行函数addBPS
。最后,if
语句定义了一个名为first
的变量,并将其设置为true。
下一个函数(在单击按钮时执行),重新分配变量addfood
并添加add
所具有的数字(函数中的变量)。
下一行做类似的事情,只需重新分配变量clicks
并减去cost
所有的数字(函数中的变量)。
我认为,最后一个if语句是非常自我解释的。它只是在变量addBPS
大于零时运行函数addfood
。只有当变量setInterval
不等于true时,它才会为函数addBPS
运行first
。 (也可以看到变量first
在第19行使用。)
var addfood = 5;
var clicks = 123;
function addBPS() {
clicks = Number(clicks) + Number(addfood);
// Countup animation
$({countNum: $('#current').text()}).animate({countNum: Number(clicks)}, {
duration: 1000,
easing:'linear',
step: function() {
$('#current').text((Math.floor(this.countNum)));
},
});
}
if(Number(addfood) > 0) {
addBPS();
setInterval(addBPS, 1000);
var first = true;
}
function upgradeGame(id, level, cost, add, user) {
addfood = Number(addfood) + Number(add);
clicks = Number(clicks) - cost;
if(Number(addfood) > 0) {
addBPS();
if(first != true) {
setInterval(addBPS, 1000);
}
}
}
所以现在这里出现了问题......
无论如何,函数addBPS
每秒运行一次。它应该每秒不断地将addfood
的值添加到clicks
。
如果addfood
的值至少为1,则代码完美无缺。但是,当addfood
的值为零时,如果我更改变量并使其成为一个(通过使用按钮),那么代替将addfood
的值连续添加到{{1它添加了它,并且每次SQUARES都是clicks
的值。
示例:
默认值:
addfood = 0;
var clicks = 0;
将一个添加到addfood
:
addfood = 1;
var clicks(1秒后)= 1;
将两个添加到addfood
:
addfood = 2;
var clicks(1秒后)= 4;
将三个添加到addfood
:
addfood = 3;
var clicks(1秒后)= 9;
我的期望:
默认值:
addfood = 0;
var clicks = 0;
将一个添加到addfood
:
addfood = 1;
var clicks(1秒后)= 1;
将两个添加到addfood
:
addfood = 2;
var clicks(1秒后)= 2;
将三个添加到addfood
:
addfood = 3;
var clicks(1秒后)= 3;
然而,就像我说的,如果addfood
的初始值是1,那么代码工作正常。当它为零,然后我使用按钮更改addfood
的值时,预期值为平方。为什么会这样?
答案 0 :(得分:0)
每次调用upgradeGame()时,都会创建一个新的Interval。所以在第一次点击后,它只会被调用一次。在第二次点击后,它将被调用两次,等等。要解决此问题,您需要包括
first=true;
所以:
function upgradeGame(id, level, cost, add, user) {
addfood = Number(addfood) + Number(add);
clicks = Number(clicks) - cost;
if(Number(addfood) > 0) {
addBPS();
if(first != true) {
setInterval(addBPS, 1000);
first=true;
}
}
}