gpt4 book ai didi

javascript - 如何解决这个setInterval问题?

转载 作者:行者123 更新时间:2023-11-28 16:26:17 25 4
gpt4 key购买 nike

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

声明arvar它成为Arrow的本地函数(但仍然可以访问嵌套在该函数中的函数,例如您为 setInterval 创建的函数)。闭包的魔力意味着您的每个间隔将仅引用现在本地的 ar与周围的范围无关,每个箭头将变得完全独立。

唯一一次你应该使用变量而不用 var 声明它是当您特别想要从函数内创建全局时。即便如此,您也应该问自己这是否是最好的选择。

关于javascript - 如何解决这个setInterval问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7901414/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com