Javascript 如何解决此设置间隔问题?

Javascript 如何解决此设置间隔问题?,javascript,geometry,Javascript,Geometry,我在设置间隔时遇到问题。在我的游戏中,我希望玩家能够射箭,但每次射箭都会更快! 这是箭头构造函数: 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 = foll

我在设置间隔时遇到问题。在我的游戏中,我希望玩家能够射箭,但每次射箭都会更快! 这是箭头构造函数:

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);
}

在那之后,我只是在屏幕上画箭头,我也总是从同一个点朝同一个方向发射。

不确定这是否是唯一的问题,但您应该更改这一行:

ar = this;

您的
循环计数器也是如此

目前,您没有在任何地方使用
var
,这意味着您的所有变量都是全局变量

这通常会导致各种混乱,但更具体地说,如果你发射多支箭,每个变量都将启动自己的
setInterval
,但interval函数中对
ar
的引用都将引用相同的全局变量,因此都将移动最近触发的箭头,从而使其加速

使用
var
声明
ar
,它将成为
箭头
函数的本地函数(但该函数中嵌套的函数仍然可以访问,就像您为
设置间隔
创建的函数一样)。闭包的魔力意味着你的每一个间隔将只引用周围范围中现在的局部
ar
,并且每个箭头将变得适当独立


只有当您特别希望从函数中创建全局变量时,才应该使用变量而不使用
var
声明它。即使这样,你也应该问问自己这是不是最好的办法。

不确定这是否是唯一的问题,但你应该改变这一行:

ar = this;

您的
循环计数器也是如此

目前,您没有在任何地方使用
var
,这意味着您的所有变量都是全局变量

这通常会导致各种混乱,但更具体地说,如果你发射多支箭,每个变量都将启动自己的
setInterval
,但interval函数中对
ar
的引用都将引用相同的全局变量,因此都将移动最近触发的箭头,从而使其加速

使用
var
声明
ar
,它将成为
箭头
函数的本地函数(但该函数中嵌套的函数仍然可以访问,就像您为
设置间隔
创建的函数一样)。闭包的魔力意味着你的每一个间隔将只引用周围范围中现在的局部
ar
,并且每个箭头将变得适当独立


只有当您特别希望从函数中创建全局变量时,才应该使用变量而不使用
var
声明它。即使这样,你也应该问问自己,这是否是最好的方法。

你真的想要设置间隔为1毫秒吗?@erturne-这是一个很好的观点。我忘了在回答中提到这一点,但是是的,即使浏览器不忙于做其他事情,它也不会给你1ms的时间间隔。我知道,但这是使用Node;)你真的想要设置间隔为1毫秒吗?@erturne-很好。我忘了在回答中提到这一点,但是是的,即使浏览器不忙于做其他事情,它也不会给你1ms的时间间隔。我知道,但这是使用Node;)+1避免使用globals。它们也有一个性能惩罚,因为必须遍历范围链才能解决它们。+1用于避免使用全局变量。它们也有性能损失,因为必须遍历范围链才能解决这些问题。
var ar = this;