gpt4 book ai didi

javascript - 更好的写作方式(javascript)

转载 作者:行者123 更新时间:2023-11-29 15:03:48 25 4
gpt4 key购买 nike

可能是对这里的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 未定义。

也许有更好的方法来定义所有这些?我正在开发一款非常基本的游戏,但只是尝试使用不同的方式将其全部拆分。所以目前,我有 engineengine.keyboardengine.cameraengine.map 这些都是做自己的小位。我在每一个的开头都使用了相同的 engine.EXAMPLE = {}。也许这是低效的?

干杯。

最佳答案

问题是您只将函数作为事件处理程序传递。通过这样做,它不再与 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 现在是函数定义范围内的一个变量,因此它们可以访问它。

这只是为了展示可以做什么。

关于javascript - 更好的写作方式(javascript),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5873735/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com