Несколько слушателей событий на холсте HTML5 - PullRequest
1 голос
/ 03 марта 2011

Я пытался создать игру исключительно на HTML5 и JavaScript, и столкнулся с проблемой, которую, похоже, не могу решить. Чтобы попытаться избежать использования сторонних классов / библиотек, я создаю свой собственный класс для обработки пользовательских кнопок в элементе HTML5 canvas. Я почти заставил их работать, а затем мне пришлось переписывать большую часть сценария, осознав, что мои слушатели событий добавляли друг на друга каждый раз, когда перерисовывался холст (раньше я использовал анонимную функцию в слушателе событий mouseDown, но с тех пор перешел на другой метод).

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

Итак, если вы все еще продолжаете (я знаю, это немного сбивает с толку, не видя полного сценария), проблема в том, что, поскольку мои прослушиватели событий используют ту же функцию, они перезаписывают предыдущий прослушиватель событий, так что только кнопка last добавила функции правильно. Подводя итог, как я могу добавить несколько слушателей событий к элементу canvas, которые все используют одну и ту же функцию, не стирая предыдущих слушателей событий. Обратите внимание, что я пытаюсь сделать это без использования jQuery или других сторонних расширений.

Если для моего кода требуется дополнительная информация, чтобы его было легче понять, дайте мне знать. Заранее благодарим за любые отзывы.


Редактировать: Возможно, это могло бы помочь. Обратите внимание, что это не полный код, но содержит основные пункты:

Добавление кнопки:

this.test_button = new CreateButton(this, 'test_button');
this.test_button.onPress = function() {
    alert('Blue button works!');
};
this.test_button.create(200, 50, 30, 200, 'text');

При использовании create() на кнопке проверяются и сохраняются переменные, а также массив, содержащий все текущие кнопки (поэтому на них можно ссылаться в любой точке). Затем запустите: this.that.custom_canvas.addEventListener('mousedown', this.create.prototype.mouseDownFunc, false);

Когда вызывается mouseDownFunc, это происходит:

CreateButton.prototype.create.prototype.mouseDownFunc = function(e) {
    var mouse_x = e.clientX-this.offsetLeft;
    var mouse_y = e.clientY-this.offsetTop;

    // Check if the mini-button button was actually clicked
    if(mouse_x >= test2.x && mouse_y >= test2.y && mouse_x <= (test2.x + test2.width) && mouse_y <= (test2.y + test2.height)){
        alert('clicked and working!');
        test2.onPress(); // A reference to the saved function
    }
};

В настоящее время мой test2 является ссылкой на любой данный объект - это глобальная переменная, но после того, как я исправлю эти другие проблемы, я буду иметь дело с избавлением от глобальной переменной (я знаю, я знаю - это было просто временное быстрое исправление).

Ответы [ 2 ]

2 голосов
/ 03 марта 2011

Может быть, вместо прослушивателя событий для каждой возможной кнопки и проверки размера окна в функции, вы можете создать отдельное событие, которое вызывает функцию маршрутизации, чтобы проверить, где на элементе произошло событие, а затем делегировать другомуфункция

0 голосов
/ 13 ноября 2015

Вам нужно спроектировать что-то для обработки событий в вашей программе.У вас, кажется, есть компоненты, у которых слушатели неорганизованы.Вы можете построить древовидную структуру данных (https://en.wikipedia.org/wiki/Tree_%28data_structure%29), которая является иерархией для отправки событий в ваших компонентах (таких как кнопки, текстовые области и т. Д.). Идея состоит в том, что при обходе дерева события будут обрабатыватьсяупорядоченным образом. Дерево будет реорганизовано на основе того, как пользователь взаимодействует с вашей программой. Для простого примера, чтобы запустить это дерево, возможно, можно было бы расставить приоритеты для самого последнего нарисованного компонента (из некоторой структуры, которая содержит список всего, что должно бытьв качестве прослушивателя событий, чтобы сначала получить обработку событий. Затем, если компонент заблокирован другим компонентом - заблокированным компонентом (например, кнопкой, закрывающей кнопку), его обработка событий может быть либо отключена, либо запланирована на более позднее время, в зависимости от вашей реализации.Конечно, ваша реализация может быть более сложной, но вам нужно следить за обработкой событий.Ява использует иерархическую структуру данных компонента для обработки широкого спектра событий GUI, о которых вы можете узнать больше здесь http://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...