Функция в canvas

412
17 октября 2017, 04:43

День добрый! Подскажите как сделать функционал в canvas,чтобы по клику мыши по квадрату, он удалялся с экрана (с массива). В данном примере у меня удаляется весь массив, направьте на путь истинный)!

function animate() { 
  var canvas = document.getElementById('canvas'); 
  var ctx = canvas.getContext('2d'); 
 
  function Square(x, y, w, h) { 
    this.x = Math.random() * 620; 
    this.y = y; 
    this.w = w; 
    this.h = h; 
    this.r = Math.round(Math.random() * 255); 
    this.g = Math.round(Math.random() * 255); 
    this.b = Math.round(Math.random() * 255); 
 
    this.rgba = "rgba(" + this.r + "," + this.g + "," + this.b + ",1)"; 
 
    this.draw = function() { 
      ctx.fillStyle = this.rgba; 
      ctx.fillRect(this.x, this.y, 20, 20); 
      this.update(); 
    } 
 
    this.update = function() { 
      this.y += Math.random() * 2; 
    } 
  } 
 
  var squares = []; 
 
  function draw() { 
    ctx.clearRect(0, 0, canvas.clientWidth, canvas.clientWidth); 
    for (i = 0; i < squares.length; i++) 
      squares[i].draw(); 
    update(); 
  } 
 
  function update() { 
    for (var i = 0; i < squares.length; i++) { 
      squares[i].update(); 
    } 
  } 
 
  setInterval(function() { 
 
    squares.push(new Square(0, 0, 20, 20)) 
  }, 1000); 
 
  setInterval(draw, 20); 
  var isCursorInSquares = function(x, y, squares) { 
    return x > squares.x && x < squares.x + squares.w && 
      y > squares.y && y < squares.y + squares.h; 
  } 
 
  canvas.onclick = function(e) { 
    var x = e.pageX; 
    y = e.pageY; 
 
    for (i in squares) 
      if (isCursorInSquares(x, y, squares[i])) 
        delete squares[i] 
  } 
} 
 
document.body.onload = animate;
<canvas id="canvas"></canvas>

Answer 1

Все кубики пропадают, потому что у вас в коде ошибка и скрипт перестаёт работать. Надо ваш кусок кода

for (i in squares)
  if (isCursorInSquares(x, y, squares[i]))
    delete squares[i]

заменить на

for(var i = squares.length - 1; i >= 0; --i)
{
    if(isCursorInSquares(x, y, squares[i])) delete squares.splice(i, 1);
}
  1. Элементы массива так не удаляют.
  2. Удалять следует с конца массива, а не сначала, что бы не выйти за пределы массива при индексации.
Answer 2

Canvas - чёрный ящик. Все что нарисовано не функционально, вы можете только перерисовать. Вместо Canvas используйте SVG. Там вы сможете сделать с графическими элементами то же, что и с DOM элементами - навешивать события, вставлять, удалять и прочее.

READ ALSO
React JS (JSX) что значит два двоеточия перед this

React JS (JSX) что значит два двоеточия перед this

Компонент содержит такую строку

232
Подключение внешнего JS

Подключение внешнего JS

JS файл не вставляется, при этом из html файла скрипт работает

239
Amp подключение js

Amp подключение js

Подскажите, как на amp страницах сохранить функционал сайта ? Можно ли подключать к этим страницам свои скрипты ?

215
Отправка формы при переходе на страницу с формой

Отправка формы при переходе на страницу с формой

Имеется связка модуля и компонента в joomlaМодуль включает в себя фильтр который позволяет пользователю выбирать соотвествующие параметры

181