Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在keydown(JS,Jquery)上修改HTML5画布元素_Javascript_Html_Canvas - Fatal编程技术网

Javascript 在keydown(JS,Jquery)上修改HTML5画布元素

Javascript 在keydown(JS,Jquery)上修改HTML5画布元素,javascript,html,canvas,Javascript,Html,Canvas,按左键时,我试图移动画布上的某个对象 $(document).ready(function () { var ctx = document.getElementById('canvas').getContext('2d'); var img = new Image(); img.onload = function(){ ctx.drawImage(img,0,0); // draw the image at the right coords ctx.drawImage(img,

按左键时,我试图移动画布上的某个对象

$(document).ready(function () {

var ctx = document.getElementById('canvas').getContext('2d');
var img = new Image();
img.onload = function(){
    ctx.drawImage(img,0,0); // draw the image at the right coords
    ctx.drawImage(img,110,110); // draw the image at the right coords
    ctx.save();
};
img.src = 'tiles/processed/1_grass.png'; // Set source path

function draw() {
    ctx.translate(20,0);
};

draw();
draw();
draw();

$(document).keydown(function(e) {
    if (e.keyCode == 37) {
        draw();
    };

});

});
现在,出现了三个draw();'这是可行的,但函数中的函数不可行

我是否完全忽略了画布的概念(因为它本质上是静态的,并且必须一直完全重新绘制),还是我做错了什么

(注:我也在使用Jquery)

干杯

您从未真正重新绘制画布。您绘制一次(
img.onload
),否则仅翻译画布

draw
函数应清除画布并重新绘制图像


下面是一个基于代码的简单示例:

$(function () {
  var ctx = document.getElementById('canvas').getContext('2d');

  function draw() {
    ctx.save();
    ctx.setTransform(1, 0, 0, 1, 0, 0);
    ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);
    ctx.restore();

    ctx.fillStyle = 'black';
    ctx.fillRect(0, 0, 20, 20);
  };

  draw();
  $(document).keydown(function(evt) {
    switch(evt.keyCode) {
      case 37:
        ctx.translate(-5, 0);
        break;
      case 38:
        ctx.translate(0, -5);
        break;
      case 39:
        ctx.translate(5, 0);
        break;
      case 40:
        ctx.translate(0, 5);
        break;
    }

    draw();
  });
});​
演示:



不过,就我个人而言,我不会使用
translate
来处理这个动作。我会使用一些x/y坐标,存储在一个私有变量中。按下键后,我将操纵这些坐标并重新绘制。

罗杰。愚蠢的问题。有趣的是,你最初的回答(在编辑之前)已经让我兴奋起来,帮助我找到了解决方案。我完全理解你。也谢谢你的代码。我将写我自己的解决方案,因为我学到了最好的构建基础(相对于复制粘贴),但它帮助我确定了解决方案。非常非常感谢!