在开始之前,我为您在这篇文章中可能看到的大量代码道歉。这是我尝试过修复的最烦人的错误。我已经工作了好几个小时了,但还是什么也没找到。
我有两个JavaScript变量,一个名为addfood
,一个名称为clicks
。
下面的第一个函数(addBPS
)从变量addfood
和clicks
中取数,并再次将和重新分配给变量clicks
。
函数的下一个块只运行div中向上计数的数字的动画。它读取div中的数字,并将其"动画化"为变量clicks
中的新数字。
当变量addfood
大于零时,函数后面的if
语句运行函数。它还每秒运行函数addBPS
。最后,if
语句定义了一个名为first
的变量,并将其设置为true。
下一个函数(单击按钮时执行)将重新分配变量addfood
,并添加add
的任何数字(函数中的变量)。
下一行执行类似的操作,只是重新分配变量clicks
,并减去cost
(函数中的变量)的任何数字。
我认为,最后一个if语句是不言自明的。如果变量addfood
大于零,它所做的就是运行函数addBPS
。然后,仅当变量first
不等于true时,它才为函数addBPS
运行setInterval
。(也可以看到变量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
的值连续添加到clicks
,而是将其添加,每次都将addfood
的值平方。
示例:
默认值:
addfood=0
var点击=0;
向addfood
:添加一个
addfood=1
var点击(1秒后)=1;
在addfood
中添加两个:
addfood=2
var点击(1秒后)=4;
将三个添加到addfood
:
addfood=3
var点击(1秒后)=9;
我的期望:
默认值:
addfood=0
var点击=0;
向addfood
:添加一个
addfood=1
var点击(1秒后)=1;
将两个添加到addfood
:
addfood=2
var点击(1秒后)=2;
将三个添加到addfood
:
addfood=3
var点击(1秒后)=3;
但是,正如我所说,如果addfood
的初始值为1,那么代码工作正常。当它为零时,然后我使用按钮更改addfood
的值,期望值即为平方。为什么会发生这种情况?
每次调用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;
}
}
}