在固定时间后停止等待输入

时间:2014-04-09 03:41:19

标签: javascript jquery

我是网络编程的新手,我偶然发现了一个我无法解决的问题,我不确定它是否可以解决。我创造了一个非常简单的游戏"使用jquery,我想让线程停止等待(keydown)输入并继续执行代码,这样我就可以执行简单的向上"跳转"或者"左跳" /"右跳"。可以吗?
以下是我迄今为止所做的代码:

http://www.codecademy.com/pt/pySlayer10761/codebits/OYQ11a/edit

2 个答案:

答案 0 :(得分:1)

你需要一个独立于你的keydown处理程序运行的游戏循环。否则,任何可能入侵keydown处理程序的动画都可能在没有输入的情况下停止。

通过查看你的代码,我可以看到你试图通过在那些keydowns上创建一个新的setTimeout()来实现它。您正在为每个触发的keydown事件创建此项。如果引擎没有意识到你一次又一次地创建了相同的超时,那很可能会在某些时候崩溃/冻结你的浏览器。

这样做:在onkeydown处理程序中,您只需将变量keydowncode设置为键码值。然后你创建一个像这样的新游戏循环

<script>
var keydownCode = 0;
var isInAnimation = false;
var animatedKeydownCode = 0;
var animationStartTime = 0;
var animationStartValue = 0;

// Lightweight keydown handler:
$(document).keydown(function(key) {
  keydownCode = parseInt(key.which,10);
}
$(document).keyup(function(key) {
  keydownCode = 0;
}

function animation() {

  // here comes your animation logic.. 
  // e.g. keep moving for 100 to 200 milliseconds after keypress

  // Milli secs difference from 
  var nowTime = Date.now();

  // Animations get prioritized: Only one animation at the same time!
  if(isInAnimation) {
    switch(animatedKeydownCode) {
      case 37:
        var delta = (nowTime-animationStartTime)/100*10;
        if(delta > 10) { delta = 10; isInAnimation = false; }; // Animation over!
        $('img').left(animationStartValue-delta);
      case 37:
        var delta = (nowTime-animationStartTime)/200*10;
        if(delta > 10) { delta = 10; isInAnimation = false; }; // Animation over!
        $('img').top(animationStartValue-delta);
      case 39:
        var delta = (nowTime-animationStartTime)/100*10;
        if(delta > 10) { delta = 10; isInAnimation = false; }; // Animation over!
        $('img').left(animationStartValue+delta);
    }


  // Ready to take new input, if its not outdated
  } else {

    // If some key is down and no animations active
    if(keydownCode > 0) {
      switch(keydownCode) {
        case 37:
          animationStartTime = nowTime;
          animatedKeydownCode = keydownCode;
          animationStartValue = $('img').left();
          isInAnimation = true;

        case 38:

          // Only start a jump if on bottom
          if($('img').css("top") == '390px') {
            animationStartTime = nowTime;
            animatedKeydownCode = keydownCode;
            animationStartValue = $('img').top();
            isInAnimation = true;
          }

        case 39:
          animationStartTime = nowTime;
          animatedKeydownCode = keydownCode;
          animationStartValue = $('img').left();
          isInAnimation = true;

      }
    }
  }
  window.requestAnimationFrame(animation);
}
window.requestAnimationFrame(animation);
</script>

这不是完整的游戏,你需要自己调整才能获得正常的游戏。例如。如果没有输入,你可能想要添加一些引力来再次降低马里奥。

答案 1 :(得分:0)

我认为您正在寻找setTimeout()

像这样:

setTimeout(function(){
   // do something here which will be executed after 5 seconds.
},5000);

你不能在javascript中停止一个线程,因为它是单线程的。