【问题标题】:Can't make square on canvas move, and now the square won't draw either无法在画布上移动正方形,现在正方形也不会绘制
【发布时间】:2015-03-27 16:30:15
【问题描述】:

我正在尝试使用 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 键控制它。

【问题讨论】:

  • 谁投了反对票,为什么?
  • 他们可能投了反对票,因为你没有把你的代码放在这里看..这个网站不会弄乱你的代码,其他人都在管理
  • 也许它被否决了,因为你不是很清楚 - “我正在尝试让某些东西移动”什么东西? “画我的正方形” - 所以你想画一个正方形?老实说,它可能会更清楚一点。不过,我认为不值得反对,反对者应该发表评论并提出改进建议。
  • 当我在此处输入我的代码时,它并没有像应有的那样显示在一个框中。相反,它只是将其组合成 6-8 行。我最终弄乱了它的工作原理,只得到了一半的工作,而另一半根本不会出现。
  • 感谢您的建议。我对其进行了修改,并采纳了一些提交到问题中的建议。

标签: javascript html animation canvas


【解决方案1】:

监听文档上的键盘事件,而不是上下文。

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>

【讨论】:

  • 当我移除焦点的东西时它可以工作。我还必须更改键码,因为您制作它们的方式正确等等,但这根本不是问题。非常感谢所有的帮助!
【解决方案2】:

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

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

让 ctx 语句保持原样,画布将再次绘制。除非你真的需要画布,否则最好使用 svg img。

【讨论】:

  • CTX 就是我为我的 var canvas 命名的东西。我尝试将这些线条更改为 Canvas,但没有运气。我回去把所有东西都改成了画布,但还是没有运气。最后我把它改回了 CTX。不知道我做错了什么,但它与事件侦听器有关,因为没有它就可以工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-23
  • 1970-01-01
  • 1970-01-01
  • 2011-10-09
相关资源
最近更新 更多