如何解决这个setInterval问题?

时间:2011-10-26 10:26:23

标签: javascript geometry

我遇到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));
}

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

1 个答案:

答案 0 :(得分:4)

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

ar = this;

var ar = this;

您的a循环计数器也一样。

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

这通常会导致各种混淆,但更具体地说,如果你发射多个箭头,每个箭头都将启动它自己的setInterval但是在间隔中引用ar函数将全部引用相同的全局变量,因此将移动最近激活的箭头,从而使其加速。

使用ar声明var,它变为Arrow函数的本地(但是仍然可以访问嵌套在该函数中的函数,就像您为setInterval创建的函数一样)。闭包的魔力意味着您的每个时间间隔仅指向周围范围内的当前ar,并且每个箭头将完全独立。

你唯一一次使用变量而不用var声明它是你特意希望从函数中创建全局的时候。即便如此,你应该问问自己这是否是最佳方式。