Javascript setInterval:多个间隔

Javascript setInterval:多个间隔,javascript,canvas,setinterval,clearinterval,Javascript,Canvas,Setinterval,Clearinterval,我在玩动画。我试着让两个圆移动指定的距离,然后停下来。我遇到的问题是多次间隔。我将每个间隔分配给一个唯一的变量,并清除该变量,但第一个间隔将继续 代码如下: function moveRight(player){ if(player==1){ currentLoc = p1Loc[0]; //global var with player's current location intervalR1 = setInterval(function(){

我在玩动画。我试着让两个圆移动指定的距离,然后停下来。我遇到的问题是多次间隔。我将每个间隔分配给一个唯一的变量,并清除该变量,但第一个间隔将继续

代码如下:

function moveRight(player){

if(player==1){
    currentLoc = p1Loc[0];            //global var with player's current location
    intervalR1 = setInterval(function(){
        p1Loc[0]+=1;
        draw();                      //function that redraws the canvas
        if(p1Loc[0]>currentLoc+wu){  //wu is a single "width-unit"
            clearInterval(intervalR1);
        }
    },5)
}
else{
    currentLoc = p2Loc[0];
    intervalR2 = setInterval(function(){
        p2Loc[0]+=1;
        draw();
        if(p2Loc[0]>currentLoc+wu){
            clearInterval(intervalR2);
        }
    },5)
}

}
然后,假设我在while循环中给出以下说明:

instructions = ["moveRight(1)", "moveRight(2)"];
for(instruction in instructions){
    eval(instructions[instruction]); //I know, eval(), ugh. Is just temporary
}
最终的结果是,两个玩家开始向右移动,但玩家2在一个wu或宽度单位后停止,而玩家1继续移动。如果我将指令更改为仅“moveRight(1);”,则玩家1移动一个wu并停止


这里发生了什么?

这只是一个猜测,因为仅部分代码有点难以判断发生了什么,但可能是您分配了两次
currnetLoc
,因此第一个玩家的位置将始终与
p2Loc[0]
进行比较

因此,当您调用
moveRight(1)
时,它会将
currentLoc
设置为
p1Loc[0]
,然后继续。然后在您调用
moveRight(2)
后立即将
currentLoc
设置为
p2Loc[0]
。因此,现在玩家1的间隔比较不再是
p1Loc[0]>currentLoc+wu
,而是
p2Loc[0]>currentLoc+wu
。根据
p2Loc
的值,这可能总是
false

这一行:

currentLoc = p1Loc[0];            //global var with player's current location
这有点吓人。不要为此使用全局变量,尤其是当您在函数的第二个条目上重新指定其值时:

currentLoc = p2Loc[0];
这可能是你的问题

如果需要跟踪单个玩家的位置,请创建一个玩家对象并在其中跟踪它,例如:

function Player(number) {
    this.number = number
    this.position = 0 //some default initial position
}

< P>并将其传递到MOVELY()/

FIY,考虑使用,而不是使用区间进行播放。可能是InValr?直到setInterval完成后才设置。通过在clearInterval调用之前放置一个警报,这将非常容易进行测试。是的!抢手货将在6分钟内标记为正确(根据SO规则),您还发现了问题。isomarcte是第一个,但你对全球VAR的看法绝对正确。我现在绝对是把好的代码原则抛到了风口浪尖上,因为我只是在拼凑一些东西来学习画布动画。我想这就是当你这么做的时候。。。谢谢