Как исправить рисунок этого круга на холсте, используя коды клавиш и clearRect () - PullRequest
0 голосов
/ 30 марта 2019

Я пытаюсь анимировать круг на холсте, используя клавиши курсора клавиатуры.Проблема в том, что функция clearRect () не используется должным образом, и есть эта странная линия, которая рисуется с кружком при использовании клавиш курсора.

Я попытался изменить порядок кода, включая функцию cleaRect (), ноэто не помогает

  <!DOCTYPE html>
      <html lang="en">
      <head>
         <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <script src="keycode.js" defer></script>
         <title>Example Javascript</title>
     </head>
     <body onload="setup()">
        <canvas width="1000" height="1000" style="border: 1px solid black">
          Your browser does not support canvas.
         </canvas><br>
        <input type="button" value="Move">
     </body>
    </html>

Вот код JavaScript

console.log("Script is connected");

let canvas = window.document.querySelector("Canvas");
let ctx = canvas.getContext("2d");
let increment = 0;

function setup() {
    ctx.arc(canvas.width / 2, canvas.height / 2, 100, 0, 2 * Math.PI);
    ctx.fillStyle = "lightblue";
    ctx.fill();
    ctx.stroke();
    window.addEventListener("keydown", function (event) {

    if (event.keyCode === 37) {
        ctx.clearRect(0, 0, 1000, 1000); 
        increment += 200;
        ctx.arc(canvas.width / 2 - increment, canvas.height / 2, 100, 0, 2 * Math.PI);
        ctx.fillStyle = "lightblue";
        ctx.fill();
        ctx.stroke();
        console.log(increment);
    }

    if (event.keyCode === 38) {
        ctx.clearRect(0, 0, 10000, 1000); 
        increment += 200;
        ctx.arc(canvas.width / 2, canvas.height / 2 - increment, 100, 0, 2 * Math.PI);
        ctx.fillStyle = "lightblue";
        ctx.fill();
        ctx.stroke();
        console.log(increment);
    }

    if (event.keyCode === 39) {
        ctx.clearRect(0, 0, 10000, 1000); 
        increment += 200;
        ctx.arc(canvas.width / 2 + increment, canvas.height / 2, 100, 0, 2 * Math.PI);
        ctx.fillStyle = "lightblue";
        ctx.fill();
        ctx.stroke();
        console.log(increment);
    }


     if (event.keyCode === 40) {
        ctx.clearRect(0, 0, 1000, 1000); 
        increment += 200;
        ctx.arc(canvas.width / 2, canvas.height / 2 + increment, 100,             0, 2 * Math.PI);
        ctx.fillStyle = "lightblue";
        ctx.fill();
        ctx.stroke();
        console.log(increment);
    }
    }, true);
}

1 Ответ

0 голосов
/ 30 марта 2019

Вы используете clearRect () в порядке. Проблема в том, что у вашего кода есть только один открытый путь, который расширяется при каждом нажатии клавиши, поэтому, когда вы вызываете ctx.fill () и ctx.stroke (), он следует по этому более длинному и длинному пути.

Добавьте beginPath () и closePath () к каждому вашему делу, и вы больше не получите посторонние линии и прочее.

Как это:

ctx.beginPath();
ctx.arc(canvas.width / 2 - increment, canvas.height / 2, 100, 0, 2 * Math.PI);
ctx.closePath();

ctx.fillStyle = "lightblue";
ctx.fill();
ctx.stroke();
...