2016-02-18 2 views
1

Я действительно не уверен, что в этом нет, поэтому я выложу весь код внизу.Полный холст заполняется командой заполнения

Я начал пытаться создать простую анимационную программу like this, но всякий раз, когда я пытаюсь рисовать рамку, она заполняет весь холст.

Вот код

Вы, вероятно, следует очистить игровое поле перед тестированием функции тоже.

<!DOCTYPE html> 
 
<html> 
 
\t <head> 
 
\t \t <title>Drawing</title> 
 
\t </head> 
 
\t <body> 
 
\t \t <canvas id="container" width="500" height="500" style="border: 3px solid black"></canvas><br> 
 
\t \t <button onClick="colorChange()">Change the color</button> 
 
\t \t <button onClick="colorChange('erase')">Eraser</button> 
 
\t \t <button onClick="colorChange('pen')">Pen</button> 
 
\t \t <button onClick="bcClear('clear')">Clear</button> 
 
\t \t <button onClick="bcClear()">Change Background</button><br> 
 
\t \t Width: <input type="range" min="5" max="100" value="10" step="5" onChange="chWidth(this.value)"/> <!--New method -- this object --> 
 
     <button onClick="drawFrame()">Draw frame</button> 
 
\t \t <script> 
 
\t \t \t //variables for drawing 
 
\t \t \t var width = 10, color = "black", bc="white"; 
 
\t \t \t var cel = document.getElementById("container"); 
 
\t \t \t var canvas = cel.getContext("2d"); 
 
\t \t \t var clickd = false;//if clicked 
 
\t \t \t 
 
\t \t \t //variables for animating 
 
\t \t \t frame = 0; 
 
\t \t \t frames = [[]]; //frames: [ [frame1 circles, seperate by space] [frame2] ] 
 
\t \t \t 
 
\t \t \t //events 
 
\t \t \t cel.addEventListener("mousedown", function(e){clickd=true;drawSomething(e);}, false);//draw dot, make clicking true for dragging 
 
\t \t \t cel.addEventListener("mouseup", function(e){clickd=false;}, false);//stop drawing 
 
\t \t \t cel.addEventListener("mousemove", drawSomething, false);//\/ 
 
\t \t \t 
 
\t \t \t //draw 
 
\t \t \t function drawSomething(event) { 
 
\t \t \t \t if (clickd) {//if u are dragging 
 
\t \t \t \t \t canvas.beginPath(); 
 
\t \t \t \t \t var newX = event.clientX - cel.getBoundingClientRect().left; 
 
\t \t \t \t \t var newY = event.clientY - cel.getBoundingClientRect().top; 
 
\t \t \t \t \t canvas.arc(newX, newY, width, 0, 2*Math.PI); 
 
\t \t \t \t \t canvas.fill();//make circle 
 
\t \t \t \t \t frames[frame].push(newX + " " + newY); 
 
\t \t \t \t } 
 
\t \t \t } 
 
\t \t \t 
 
\t \t \t //clear, background color 
 
\t \t \t function bcClear(param) { 
 
\t \t \t \t if (confirm("This will erase everything on the board, OK?")) { 
 
\t \t \t \t \t if (!param) { 
 
\t \t \t \t \t \t bc = prompt("What do you want the background color to be?", "CSS colors only"); 
 
\t \t \t \t \t } 
 
\t \t \t \t \t canvas.fillStyle = bc; 
 
\t \t \t \t \t canvas.rect(-3, -3, cel.offsetWidth, cel.offsetHeight); 
 
\t \t \t \t \t canvas.fill(); 
 
\t \t \t \t \t canvas.fillStyle = color; 
 
\t \t \t \t } 
 
\t \t \t } 
 
\t \t \t 
 
\t \t \t //change color 
 
\t \t \t function colorChange(param) { 
 
\t \t \t \t if (param == 'erase') { 
 
\t \t \t \t \t canvas.fillStyle = bc; 
 
\t \t \t \t } else if (param == 'pen') { 
 
\t \t \t \t \t canvas.fillStyle = color; 
 
\t \t \t \t } else { 
 
\t \t \t \t \t color = prompt("What color would you like?", "CSS colors only"); 
 
\t \t \t \t \t canvas.fillStyle = color; 
 
\t \t \t \t } 
 
\t \t \t } 
 
\t \t \t 
 
\t \t \t //Change width 
 
\t \t \t function chWidth(newWidth) { 
 
\t \t \t \t width = newWidth; 
 
\t \t \t } 
 
\t \t \t 
 
\t \t \t //draw a certain frame 
 
\t \t \t function drawFrame() { 
 
\t \t \t \t for (var i = 0; i < frames[frame].length; i++) { 
 
\t \t \t \t \t var coords = frames[frame][i].split(" "); 
 
\t \t \t \t \t console.log(coords); 
 
\t \t \t \t \t canvas.arc(coords[0], coords[1], width, 0, 2*Math.PI); 
 
\t \t \t \t \t canvas.fill(); 
 
\t \t \t \t } 
 
\t \t \t } 
 
\t \t </script> 
 
\t </body> 
 
</html>

+0

Может это иметь ничего общего с тем, что вы используете 'canvas.fill'? Это звучит как команда, чтобы заполнить весь холст для меня, но я не знаком с материалами, поэтому ... –

+1

на самом деле неважно, что это был комментарий noob. –

+0

Не пробовал свой код вообще, но на первый взгляд вы забыли startPath в цикле drawFrame. Каждый fill() будет повторно использовать весь Путь, полученный из последнего вызова beginPath (включая ваш bc rect, если он был вызван ранее) – Kaiido

ответ

1

Оказывается, что я забыл добавить beginPath();, прежде чем я обратил эти круги и заливка следовала моим предыдущим путям. Новый и улучшенный код!

<!DOCTYPE html> 
 
<html> 
 
\t <head> 
 
\t \t <title>Drawing</title> 
 
\t </head> 
 
\t <body> 
 
\t \t <canvas id="container" width="500" height="500" style="border: 3px solid black"></canvas><br> 
 
\t \t <button onClick="colorChange()">Change the color</button> 
 
\t \t <button onClick="colorChange('erase')">Eraser</button> 
 
\t \t <button onClick="colorChange('pen')">Pen</button> 
 
\t \t <button onClick="bcClear('clear')">Clear</button> 
 
\t \t <button onClick="bcClear()">Change Background</button><br> 
 
\t \t Width: <input type="range" min="5" max="100" value="10" step="5" onChange="chWidth(this.value)"/> <!--New method -- this object --> 
 
     <button onClick="drawFrame()">Draw frame</button> 
 
\t \t <script> 
 
\t \t \t //variables for drawing 
 
\t \t \t var width = 10, color = "black", bc="white"; 
 
\t \t \t var cel = document.getElementById("container"); 
 
\t \t \t var canvas = cel.getContext("2d"); 
 
\t \t \t var clickd = false;//if clicked 
 
\t \t \t 
 
\t \t \t //variables for animating 
 
\t \t \t frame = 0; 
 
\t \t \t frames = [[]]; //frames: [ [frame1 circles, seperate by space] [frame2] ] 
 
\t \t \t 
 
\t \t \t //events 
 
\t \t \t cel.addEventListener("mousedown", function(e){clickd=true;drawSomething(e);}, false);//draw dot, make clicking true for dragging 
 
\t \t \t cel.addEventListener("mouseup", function(e){clickd=false;}, false);//stop drawing 
 
\t \t \t cel.addEventListener("mousemove", drawSomething, false);//\/ 
 
\t \t \t 
 
\t \t \t //draw 
 
\t \t \t function drawSomething(event) { 
 
\t \t \t \t if (clickd) {//if u are dragging 
 
\t \t \t \t \t canvas.beginPath(); 
 
\t \t \t \t \t var newX = event.clientX - cel.getBoundingClientRect().left; 
 
\t \t \t \t \t var newY = event.clientY - cel.getBoundingClientRect().top; 
 
\t \t \t \t \t canvas.arc(newX, newY, width, 0, 2*Math.PI); 
 
\t \t \t \t \t canvas.fill();//make circle 
 
\t \t \t \t \t frames[frame].push(newX + " " + newY); 
 
\t \t \t \t } 
 
\t \t \t } 
 
\t \t \t 
 
\t \t \t //clear, background color 
 
\t \t \t function bcClear(param) { 
 
\t \t \t \t if (confirm("This will erase everything on the board, OK?")) { 
 
\t \t \t \t \t if (!param) { 
 
\t \t \t \t \t \t bc = prompt("What do you want the background color to be?", "CSS colors only"); 
 
\t \t \t \t \t } 
 
\t \t \t \t \t canvas.fillStyle = bc; 
 
\t \t \t \t \t canvas.rect(-3, -3, cel.offsetWidth, cel.offsetHeight); 
 
\t \t \t \t \t canvas.fill(); 
 
\t \t \t \t \t canvas.fillStyle = color; 
 
\t \t \t \t } 
 
\t \t \t } 
 
\t \t \t 
 
\t \t \t //change color 
 
\t \t \t function colorChange(param) { 
 
\t \t \t \t if (param == 'erase') { 
 
\t \t \t \t \t canvas.fillStyle = bc; 
 
\t \t \t \t } else if (param == 'pen') { 
 
\t \t \t \t \t canvas.fillStyle = color; 
 
\t \t \t \t } else { 
 
\t \t \t \t \t color = prompt("What color would you like?", "CSS colors only"); 
 
\t \t \t \t \t canvas.fillStyle = color; 
 
\t \t \t \t } 
 
\t \t \t } 
 
\t \t \t 
 
\t \t \t //Change width 
 
\t \t \t function chWidth(newWidth) { 
 
\t \t \t \t width = newWidth; 
 
\t \t \t } 
 
\t \t \t 
 
\t \t \t //draw a certain frame 
 
\t \t \t function drawFrame() { 
 
\t \t \t \t for (var i = 0; i < frames[frame].length; i++) { 
 
\t \t \t \t \t var coords = frames[frame][i].split(" "); 
 
\t \t \t \t \t console.log(coords); 
 
        canvas.beginPath(); 
 
\t \t \t \t \t canvas.arc(coords[0], coords[1], width, 0, 2*Math.PI); 
 
\t \t \t \t \t canvas.fill(); 
 
\t \t \t \t } 
 
\t \t \t } 
 
\t \t </script> 
 
\t </body> 
 
</html>

Смежные вопросы