Javascript - 如何平滑船舶运动

时间:2014-03-03 22:29:49

标签: javascript html5 canvas

我正在制作基本游戏 http://www.jasonhuman.co.za/lazerlazer

我们的想法是了解有关javascript和画布的更多信息

我遇到的问题是我在body元素上绑定了onkeypress 它只允许一次拾取一个按键 并不是那么顺利 - 船在开始运动之前会滞后一秒

我怎样才能使船立即开始向正确的方向移动 一旦按键发生了吗?

这是我控制按键事件的代码:

  function keyPress(e){
    //w=119, s = 115, a = 97, d = 100
    if(e.charCode==119){
      player[0].ypos -=15;
      playerImg.src = 'images/playerUp.png';
      engines.play();
    }
    if(e.charCode==115){
      player[0].ypos +=15;
      playerImg.src = 'images/playerDown.png';
      engines.play();
    }
    if(e.charCode==97){
      player[0].xpos-=15;
      playerImg.src = 'images/playerFW.png';
      engines.play();
    }
    if(e.charCode==100){
      player[0].xpos+=15;
      playerImg.src = 'images/playerFW.png';
      engines.play();
    }
    //fire a bullet
    if(e.charCode==32)
    {
      //fire a bullet
      bullets.push(new init(player[0].xpos+88,player[0].ypos+25));
      //gunshots
      var gunshot = new Audio('lazer.mp3');
      gunshot.play();
    }
  }

2 个答案:

答案 0 :(得分:1)

正如@Rob Baille所说,听听keydown而不是按键事件。

您的延迟是因为您在每次按键时重新加载图像。

而是仅预加载所有图像一次。

然后根据需要在密钥处理程序中将playerImg设置为适当的图像。

另外,你重复了images / playerFW.png ......那是故意的吗?

以下是使用图片预加载器重构代码的示例:

// image loader

var imageURLs=[];  // put the paths to your images here
var imagesOK=0;
var imgs=[];
imageURLs.push("images/playerUp.png");
imageURLs.push("images/playerDown.png");
imageURLs.push("images/playerFW.png");
imageURLs.push("images/playerFW.png");
loadAllImages(start);

function loadAllImages(callback){
    for (var i=0; i<imageURLs.length; i++) {
        var img = new Image();
        imgs.push(img);
        img.onload = function(){ 
            imagesOK++; 
            if (imagesOK>=imageURLs.length ) {
                callback();
            }
        };
        img.onerror=function(){alert("image load failed");} 
        img.crossOrigin="anonymous";
        img.src = imageURLs[i];
    }      
}

function start(){

    // All images have been fully pre-loaded
    // Allow the game to begin

    // Maybe hide the "Play" button until this function is triggered

}


function keyPress(e){
  //w=119, s = 115, a = 97, d = 100
  if(e.charCode==119){
    player[0].ypos -=15;
    playerImg = imgs[0];
    engines.play();
  }
  if(e.charCode==115){
    player[0].ypos +=15;
    playerImg = imgs[1];
    engines.play();
  }
  if(e.charCode==97){
    player[0].xpos-=15;
    playerImg = imgs[2];
    engines.play();
  }
  if(e.charCode==100){
    player[0].xpos+=15;
    playerImg = imgs[3];
    engines.play();
  }
  //fire a bullet
  if(e.charCode==32)
  {
    //fire a bullet
    bullets.push(new init(player[0].xpos+88,player[0].ypos+25));
    //gunshots
    var gunshot = new Audio('lazer.mp3');
    gunshot.play();
  }
}

答案 1 :(得分:0)

我知道如何处理这两种方式。您可以更频繁地更新帧,也可以使用不同的按键方法。更快地更新您的框架

var sim_interval = 1 / 40; // number of times per second that we step the animation.

如上所述,这会将我们步进动画的每秒次数声明为变量。下一段代码是如何重新编写初始状态。

render(); // render the initial state.

  interval_callback_id = window.setInterval(step, sim_interval); // set the callback and save the identifier.

 }

每个reder代码都会有点不同你的函数render(){可能会有所不同,它是如何升级系统的。可以在How to use spacebar and if statements in JS?

找到执行按键方法的另一种方法