不能在画布上移动方形,现在方形也不会画

时间:2015-01-28 16:54:43

标签: javascript html animation canvas

我正在尝试使用WASD键进行已经绘制的方形移动。

我不知道该怎么做,所以我查了一些代码,大约2个小时后我想出了自己的非工作代码。它不起作用,但至少它正在吸引我的方方......或者是。

现在它不是,我不知道为什么,这是我的JavaScript:

    function initCanvas(){
    var ctx = document.getElementById('my_canvas').getContext('2d');
    ctx.addEventListener("keydown", move, true);

    function move(event){
            //W
            if(event.keyCode == 87){
                    y = y + 20;
            }
            //A
            else if(event.keyCode == 65){
                    x = x - 20;
            }

            //S
            else if(event.keyCode == 83){
                    y = y + 20;
            }

            //D
            else if(event.keyCode == 68){
                    x = x + 20;
            }  
    }

    var x = 0;
    var y = 0;

    ctx.fillStyle = "green";
    ctx.fillRect(x + 20, y + 20, 20, 20);

    }

 window.addEventListener('load', function(event){
    initCanvas();
 });

HTML / CSS(整页):http://pastebin.com/wjXv5tdK 它可能与事件监听器有关,因为它似乎没有它。

TL; DR

所以我基本上想要在画布上绘制一个正方形,让用户使用WASD键控制它。

2 个答案:

答案 0 :(得分:0)

正方形不再绘制的原因是您正在尝试将事件侦听器附加到画布上下文,并且您只能将侦听器附加到DOM对象(画布)。因此,如果您将语句更改为(例如):

    var canvas = document.getElementById('my_canvas');
    canvas.addEventListener("keydown", move, true);

并保留ctx语句,因为画布将再次绘制。除非你真的需要画布,否则最好不要使用svg img。

答案 1 :(得分:0)

在文档上侦听键盘事件,而不是上下文。

document.addEventListener("keydown",move,false);

这里有一些带注释的代码可以让你重新开始:

// create canvas related variables
var canvas=document.getElementById("canvas");
var ctx=canvas.getContext("2d");
var cw=canvas.width;
var ch=canvas.height;

// set canvas to be a tab stop (necessary to give it focus)
canvas.setAttribute('tabindex','0');

// set focus to the canvas
canvas.focus();

// create an x & y indicating where to draw the rect
var x=150;
var y=150;

// draw the rect for the first time
draw();

// listen for keydown events on the document
// the canvas does not trigger key events
document.addEventListener("keydown",handleKeydown,false);

// handle key events
function handleKeydown(e){

  // if the canvas isn't focused,
  // let some other element handle this key event
  if(e.target.id!=='canvas'){return;}

  // change x,y based on which key was down
  switch(e.keyCode){
    case 87: x+=20; break;  // W
    case 65: x-=20; break;  // A
    case 83: y+=20; break;  // S
    case 68: y-=20; break;  // D
  } 

  // redraw the canvas
  draw();
}

// clear the canvas and redraw the rect in its new x,y position
function draw(){
  ctx.clearRect(0,0,cw,ch);
  ctx.fillRect(x,y,20,20);
}
body{ background-color: ivory; padding:10px; }
#canvas{border:1px solid red;}
<h4>Click in the canvas to have it respond to keys</h4>
<canvas id="canvas" width=300 height=300></canvas>