【问题标题】:How to disable setInterval function and start it again如何禁用 setInterval 功能并重新启动
【发布时间】:2018-07-27 12:04:02
【问题描述】:

setInterval "MoveToPlayer" 应该在满足 "checkPosition" 方法的第一个条件后开始,并且它应该运行(这个工作)。再次满足相同条件后,应停止并以不同的参数重新启动。我通过简单的放置 clearInterval(MoveToPlayer) 将完成这项工作,但它不起作用。 第二个问题是如何从“checkPosition”方法中停止这个间隔?

  class player {
    constructor(name, PosY) {
      this.name = name;
      this.PosX = 5;
      this.PosY = PosY;
      this.object = $('.' + name);
      this.speed = 0;
      this.direction = "";
      this.lifes = 3;
    }

playerMove(thisRaft) {
  var MoveToPlayer = setInterval(() => {
    clearInterval(MoveToPlayer)
    $('.player1').css('left', thisRaft.PosX * 50);
    $('.player1').css('bottom', thisRaft.PosY * 50);
  }, 1);
}

checkPosition(x, y) {
  for (var i = 0; i < raftsTab.length; i++) {
    if (x == raftsTab[i].PosX && y == raftsTab[i].PosY) {
      let thisRaft = raftsTab[i];
      this.playerMove(thisRaft);
      return;
    }
  }
  for (var i = 0; i < raftsTab.length; i++) {
    if (x !== raftsTab[i].PosX && y !== raftsTab[i].PosY && y !== 0 && y !== 5 && y !== 10) {
      console.log("Dead");
      player1.PosX = 5;
      player1.PosY = 0;
      changePosition();
      return;
    }
  }
}

}

【问题讨论】:

  • 将变量声明移出函数。
  • 你真的需要1 ms的间隔吗?
  • @barbsan 这是一个游戏,我需要确保小间隔不是问题。当我解决我的游戏的一般问题时,我会尝试使用 biggre 值。
  • 您不认为 setTimeout 比 setInterval 更适合您的用例吗?
  • Protoxy 不,因为它是像老青蛙一样的游戏。玩家必须跳到木筏上并在上面流动,直到下一步行动。

标签: javascript setinterval


【解决方案1】:
  1. 关于您的第一个问题,您将在它开始后立即清除间隔,因此它不会继续。

  2. 为了使区间更加动态,您应该有一个函数返回checkPosition 内的区间。 无法理解您的游戏应该如何实际运行,但我正在对您的脚本进行更改,其中我修改了 PlayerMove 和 checkPosition,以便您更好地控制相关间隔。

    李>

希望对你有帮助

  class player {
    constructor(name, PosY) {
      this.name = name;
      this.PosX = 5;
      this.PosY = PosY;
      this.object = $('.' + name);
      this.speed = 0;
      this.direction = "";
      this.lifes = 3;
    }

playerMove(thisRaft) {
  return setInterval(() => {
    $('.player1').css('left', thisRaft.PosX * 50);
    $('.player1').css('bottom', thisRaft.PosY * 50);
  }, 1);
}

checkPosition(x, y) {
  if (someCondition && this.currentPlayerMove) {
    clearInterval(this.currentPlayerMove)
  }
  for (var i = 0; i < raftsTab.length; i++) {
    if (x == raftsTab[i].PosX && y == raftsTab[i].PosY) {
      let thisRaft = raftsTab[i];
      this.currentPlayerMove = this.playerMove(thisRaft);
      return;
    }
  }
  for (var i = 0; i < raftsTab.length; i++) {
    if (x !== raftsTab[i].PosX && y !== raftsTab[i].PosY && y !== 0 && y !== 5 && y !== 10) {
      console.log("Dead");
      player1.PosX = 5;
      player1.PosY = 0;
      changePosition();
      return;
    }
  }
}

【讨论】:

  • 感谢 DSCH。我终于使用了下面评论中的解决方案,但无论如何感谢您的帮助
【解决方案2】:

只需在这样的范围内分配您的处理程序,这将使所有可以清除它的函数都可以访问它。

var handler;

function movePlayer(text){
  clearInterval(handler); // stop execution before assigning new handler
  handler = setInterval(()=>{
    /* do your stuff */
    console.log(text);
  }, 100)
}

movePlayer("I'm moving")

setTimeout(()=>{
  clearInterval(handler)
}, 500)

setTimeout(()=>{
  movePlayer("I'm moving again")
}, 1500)

setTimeout(()=>{
  clearInterval(handler)
}, 2000)

【讨论】:

  • 谢谢巴布桑。有用。诚然,我遇到了新问题,但清除间隔终于起作用了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-16
相关资源
最近更新 更多