• Как вызвать функцию, при нажатии на кнопку X или C?

    Vlad_IT
    @Vlad_IT Куратор тега JavaScript
    Front-end разработчик
    Используйте keyup/keydown, в них keyCode не зависит от раскладки.

    А еще лучше, не использовать keyCode, т.к. он устаревший. Используйте code, он также не зависит от раскладки, и корректно работает даже на keypress.
    Ответ написан
    1 комментарий
  • Хочу сделать так, чтобы при нажатии на яблоко, она исчезла и прибавила score++ click array canvas onclick?

    Vlad_IT
    @Vlad_IT Куратор тега JavaScript
    Front-end разработчик
    При клике на канву, нужно делать проверку, что кликнули в область одной из яблок. Для этого нужно при каждом клике для каждого яблока делать проверку, что mouseX > apple.x и mouseX < apple.x + apple.width, и также для Y - mouseY > apple.y и mouseY < apple.y + apple.height
    UPD: смотрите. Для начала, нам нужно получить координаты мыши, но просто так извлечь координаты мыши из объекта события mousemove нельзя, нужно провести некоторые манипуляции.
    1) Назначьте событие mousemove не на window, а непосредственно на сам холст, таким образом, можно будет получить координаты мыши, относительно канвы а не окна.
    2) У вас канва расширяется на весь экран через css, а значит, и растягивается система координат, от чего кликая например на точку {10, 10} при увеличенной в два раза канве, координата получится {5, 5}. Поэтому, нужно либо менять ширину канвы через JS в атрибут width, либо использовать вот такую функцию
    function getMouesPosition(e) {
        var mouseX = e.offsetX * cvs.width / cvs.clientWidth | 0;
        var mouseY = e.offsetY * cvs.height / cvs.clientHeight | 0;
        return {x: mouseX, y: mouseY};
    }

    в нее нужно передать объект события mousemove. Она получит координаты точки, куда кликнула мышь во внутренней системе координат.

    Теперь можно переделать метод food вот таким образом
    // Этот метод удаляет нужный фрукт из списка, а также, добавляет очки. 
    function killFood(f) {
    	let pos = fruit.indexOf(f);
      if (pos === -1) {
      	// already dead
        return;
      }
      fruit.splice(pos, 1);
      score += ~~Math.floor(Math.random()+ 17)
    }
    
    function food(e){
      let mouse = getMouesPosition(e); // Получаем координаты мыши
      // Пройдемся по каждому фрукту. Использую forEach, но вы можете и обычный for, только не забывайте обновить переменную индекса
      fruit.forEach(f => {
        if (mouse.x > f.x && mouse.y > f.y && mouse.x < f.x + apple.width && mouse.y < f.y + apple.height) {
          killFood(f); // Удаляем фрукт
        }
      });
    }


    Работающий пример https://jsfiddle.net/hzbxm5nk/
    Ответ написан
    5 комментариев