可能在这里缺乏对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 = {}
。也许这效率很低?
干杯。
答案 0 :(得分:3)
问题是您只是将函数作为事件处理程序传递。通过这样做,它与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
。
我建议您阅读excellent articles about event handling on 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
现在是函数定义范围内的变量,因此它们可以访问它。
这只是为了表明可以做些什么。
答案 1 :(得分:-1)
这是一个标准的键处理程序。我不相信有更好的方法可以做。