Причина, по которой этот щелчок запускается так много раз, заключается в том, что вы добавляете прослушиватель событий в функцию рисования, которая вызывается каждый кадр и по одному разу для каждой кнопки. Если игра работает на скорости 60 кадров в секунду и работает всего одну секунду, это 240 слушателей событий, которые делают одно и то же!
Слушатели событий не go уходят, поэтому вам нужно добавить только один , Также, просто наличие addEventListener()
добавляет прослушиватель событий к объекту документа. Это не проблема, так как ваш холст занимает весь экран, но вы можете прикрепить слушатель событий к холсту специально с помощью this.canvas.addEventListener()
(внутри класса игры). Я думаю, что это будет лучше всего работать в функции инициализации.
Теперь о регистрации в кнопках только нажатия: К сожалению, вы не можете добавлять прослушиватели событий к объектам, которые не являются HTML узлами. Единственный способ обойти это - добавить прослушиватель событий, который запускается каждый раз, когда вы нажимаете на холст, а затем l oop через все кнопки, проверяя, был ли щелчок в пределах кнопок. .
Функция в прослушивателе событий может иметь параметр
class Game {
//...
initialize() {
//...
// I put the buttons in an array so that you can loop through them.
let buttons = [this.joystickDown, this.joystickUp, this.joystickLeft, this.joystickRight];
this.canvas.addEventListener('mousedown', function(evt) {
// The X and Y coordinates of the mouse, relative to the top left corner
let x = evt.clientX;
let y = evt.clientY;
for (let button of buttons) {
// checkClick is a method you'll have to add to the joystick classes. It'll
// take in X and Y coordinates and tell if they are within the button.
if (button.checkClick(x, y)) {
// This is a method you'll have on the joystick classes to handle the click.
button.handleClick();
}
}
});
//...
}
//...
}
Надеюсь, я не допустил ошибок в этом ... Вы заметите, что я заменил событие "click" с «mousedown», потому что событие щелчка не срабатывает, пока вы не отпустите кнопку go, но mousedown срабатывает, когда вы нажимаете кнопку.