JavaScript объекты, слушающие изменения в массиве - PullRequest
0 голосов
/ 24 марта 2011

Я хотел бы иметь массив, динамически генерируемый нажатием клавиши, а затем иметь разные объекты JavaScript, слушающие изменения в этом массиве.Например, в играх нажатие клавиш LEFT / RIGHT / UP / DOWN сохранит эти 4 значения в массиве, которые могут выполняться различными объектами, прослушивающими этот массив.

Это хороший подход?И если да, то как настроить слушателей для этого массива?

Ответы [ 4 ]

1 голос
/ 24 марта 2011

Возможно, вы не рассматриваете возможность использования простого массива, но ваша пользовательская реализация, которая применяет шаблон Observer . Другой (плохой) альтернативой было бы опросить изменения в массиве с помощью таймера, но это не представляется возможным для игры.

На самом деле, поскольку вы пишете игру, я предполагаю, что у вас будет игровой цикл, который работает по таймеру. Каждый заинтересованный объект может просто читать из массива в каждом цикле обновления. Вероятно, нет необходимости отправлять изменения в реальном времени на эти объекты. Если, конечно, вы не можете позволить себе потерять какие-либо нажатия клавиш - в этом случае вы можете буферизовать ключи в более сложной структуре, чем простой массив.

0 голосов
/ 03 октября 2011

Ознакомьтесь с замечаниями JavaScriptMVC:

https://github.com/jupiterjs/jquerymx/blob/master/lang/observe/observe.js

Он делает то, что вы ищете:

o = new Observe.List([])
o.bind('change', function(ev, attr, how , newValue, oldValue ){

})

o.push('hello')
0 голосов
/ 24 марта 2011

Я бы порекомендовал модель очереди сообщений.Имейте центральный MessageQueue, который принимает события и уведомляет слушателей.Объекты, которые хотят что-то сделать при определенных нажатиях клавиш, могут зарегистрироваться в качестве слушателей в очереди и будут уведомлены, когда произойдет то, о чем они заботятся.

Допустим, у вас есть предопределенный набор событий «UP»,События «ВНИЗ», «ВЛЕВО» и «ВПРАВО».

var MESSAGE_QUEUE = function() {

    var eventListeners = {
        UP: [],
        DOWN: [],
        LEFT: [],
        RIGHT: []
    };

    return {

        register: function(event, obj) {
            var listeners = eventListeners[event];
            if (listeners) {
                listeners.push(obj);
            }
        },

        fire: function(event) {
            var listeners = eventListeners[event] || [];
            for (var i=0; i<listeners.length; i++) {
                listeners[i].onEvent(event);
            }
        }
    };
}();

Тогда объект, который хочет получить уведомление о ВНИЗ, говорит:

MESSAGE_QUEUE.register("DOWN", this);

thisопределить onEvent функцию.Тогда все, что запускает ключевые события:

element.onKeyPress = function(event) {
    // ... figure out if down was presses
    MESSAGE_QUEUE.fire("DOWN");
}

Нечто подобное будет чистым решением.Очевидно, что это можно изменить в соответствии с вашими потребностями, такими как переменное число событий или более понятные имена функций, такие как onDown, onUp и т. Д., Определенные для каждого слушателя.

0 голосов
/ 24 марта 2011

Как насчет настройки функций регистра для каждого нажатия клавиши?

var keyArray = [];
function addkey(key) {
    arr.push(key);
    dispatch();
}
$(document).keydown(function(e){
    addkey(e.which);
})
function dispatch() {
    /* CODE */
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...