setInterval有问题。在我的游戏中,我希望玩家能够射箭,但每次他射箭时,箭都飞得更快!这是箭头构造函数:
arrows = [];
Arrow = function(x, y, followX, followY) // (player.x, player.y, followX, followY)
{
ar = this;
ar.rect = [x, y, 28, 3];
ar.x = x;
ar.y = y;
ar.followX = followX;
ar.followY = followY;
if(ar.followY - ar.y < 0)
{
ar.where = [-(((ar.followX - ar.x)/200)/((ar.followY - ar.y)/200)), -1];
}
else
{
ar.where = [(((ar.followX - ar.x)/200)/((ar.followY - ar.y)/200)), 1];
}
ar.flying = setInterval(function()
{
ar.rect[0] += ar.where[0]/10;
ar.rect[1] += ar.where[1]/10;
}, 1);
ar.fall = setTimeout(function()
{
for(a = 0; a < arrows.length; a++)
if (arrows[a] == ar)
{
clearInterval(ar.flying);
arrows = sliceHere(arrows, a);
}
}, 1000);
}
所以一般的想法是,箭头飞行一秒钟,然后被删除。
箭头是这样创建的:
fireArrow = function(player)
{
arrows.push(new Arrow(player.rect[0] + player.rect[2] - 1, player.rect[1] + player.rect[3]/2 - 10, player.rect[0] + player.mouse.x - sx/2, player.rect[1] + player.mouse.y - sy/2));
}
在那之后,我只是在屏幕上画箭头,我也总是从同一个地方发射,朝着同一个方向。
不确定这是否是唯一的问题,但您应该更改这一行:
ar = this;
var ar = this;
对于您的a
循环计数器也是如此。
目前您没有在任何地方使用var
,这意味着所有变量都是全局的。
这通常会导致各种各样的混乱,但更具体地说,这意味着如果你发射多个箭头,每个将启动自己的setInterval
,但在间隔函数中对ar
的引用都将引用相同的全局变量,因此都会移动最近发射的箭头,从而使其加速。
用var
声明ar
,它成为Arrow
函数的局部(但仍然可以访问嵌套在该函数中的函数,就像您为setInterval
创建的函数一样)。闭包的魔力意味着您的每个间隔将只引用周围作用域的当前本地ar
,并且每个箭头将变得适当地独立。
var
声明的变量。即使这样,你也应该问问自己,这是否是最好的方法。