Лучший способ написания (JavaScript) - PullRequest
3 голосов
/ 03 мая 2011

Вероятно, недостаток понимания javascript здесь:

engine.keyboard = {};   // keyboard object

engine.keyboard.key = {
_pressed: {},

UP: 38,
DOWN: 40,
LEFT: 37,
RIGHT: 39,

isDown: function(keyCode)
{
    return this._pressed[keyCode];
},

onKeyDown: function(event)
{
    this._pressed[event.keyCode] = true;
},

onKeyUp: function(event)
{
    delete this._pressed[event.keyCode];
}

}

engine.keyboard.addListeners = function()
{
window.addEventListener('keydown', engine.keyboard.key.onKeyDown, false);
window.addEventListener('keyup', engine.keyboard.key.onKeyUp, false);
}

Когда я звоню, engine.keyboard.key.isDown(38), я получаю сообщение об ошибке, что this._pressed не определено.

Возможно, есть лучший способ определить все это? Я работаю над очень простой игрой, но просто экспериментирую с разными способами ее разделения. Так что на данный момент у меня есть engine, engine.keyboard, engine.camera и engine.map, которые все имеют свои крошечные биты. Я использовал один и тот же engine.EXAMPLE = {} в начале каждого. Возможно, это неэффективно?

Приветствие.

Ответы [ 2 ]

3 голосов
/ 03 мая 2011

Проблема в том, что вы передаете функцию только как обработчик события.При этом он больше не имеет отношения к объекту engine.keyboard.key.

То, на что ссылается this внутри функции, зависит от того, как она вызывается.Чтобы this ссылался на engine.keyboard.key, функция должна быть вызвана как

engine.keyboard.key.onKeyDown()

Так что вам нужно:

window.addEventListener('keydown', function(event) {
    engine.keyboard.key.onKeyDown(event);
}, false);

window.addEventListener('keyup', function(event) {
    engine.keyboard.key.onKeyUp(event);
}, false);

Также обратите внимание, что addEventListenerнедоступно в до IE8.Там вы должны использовать attachEvent.

Я предлагаю прочитать отличные статьи об обработке событий на qurirksmode.org .


Дальнейшее предложение:

Чтобы отделить функцию от объекта, вы можете создать замыкание:

engine.keyboard = {};  
engine.keyboard.key = (function() {
    var _pressed = {};

    var key = {
        UP: 38,
        DOWN: 40,
        LEFT: 37,
        RIGHT: 39,

        isDown: function(keyCode)  {
            return _pressed[keyCode];
        },

        onKeyDown: function(event) {
            _pressed[event.keyCode] = true;
        },

        onKeyUp: function(event) {
            delete _pressed[event.keyCode];
        }
    }
    return key;
}());

Здесь нет проблем с передачей engine.keyboard.key.onKeyDown, так как функциибольше не полагайтесь на this_pressed теперь является переменной в области видимости, в которой определены функции, поэтому они имеют к ней доступ.

Это просто для того, чтобы показать, что можно сделать.

0 голосов
/ 03 мая 2011

Это стандартный обработчик ключей. Я не верю, что есть лучший способ сделать что-либо.

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