繁体   English   中英

如何解决这个setInterval问题?

[英]How to solve this setInterval issue?

我在使用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但是在interval函数中对ar的引用都将引用相同的全局变量,因此都会移动最近发射的箭头,从而使其加速。

var声明ar ,它成为Arrow函数的局部变量(但是嵌套在该函数内部的函数仍可以访问,例如为setInterval创建的函数)。 闭包的神奇之处在于,您的每个间隔都只会引用周围示波器中的当前本地ar ,并且每个箭头都将变得完全独立。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM