Проблема в том, что вы передаете функцию только как обработчик события.При этом он больше не имеет отношения к объекту 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
теперь является переменной в области видимости, в которой определены функции, поэтому они имеют к ней доступ.
Это просто для того, чтобы показать, что можно сделать.