所以我正在编写一个游戏,我有一个模块可以返回当前通过jQuery按下的键。没有问题。当我尝试访问按下的键时出现问题:
var Keys = require('./lib/keys')
Player.prototype.update = function () {
Keys(function (err, keydown) {
console.log(keydown, keydown['w']);
/* // To move a player up, for example:
if (keydown['w']) {
this.y += this.speed;
}
*/
});
};
并且控制台显示按下了哪些键,但尝试访问一个键会给我一个未定义而不是真。
Object undefined
s: true
w: true
x: true
__proto__: Object
有人有任何想法吗?
更新:关键模块
var $ = require('./jquery')
var Keys = function (callback) {
var keydown = {};
function keyName(event) {
return String.fromCharCode(event.which).toLowerCase();
}
$(document).bind('keydown', function (event) {
keydown[keyName(event)] = true;
return false;
});
$(document).bind('keyup', function (event) {
return false;
});
callback(null, keydown);
}
module.exports = Keys;
/ * ** * ** * ** * ** * *更新 * 的 的 ** * ** * ** * ** < EM> * * /
这是最后的修复:
./ LIB / keys.js var $ = require('./ jquery')
var Keys = function () {
this.keydown = {};
var keyName = function (event) {
return String.fromCharCode(event.which).toLowerCase();
}
var self = this;
$(document).bind('keydown', function (event) {
self.keydown[keyName(event)] = true;
return false;
});
$(document).bind('keyup', function (event) {
self.keydown[keyName(event)] = false;
return false;
});
};
Keys.prototype.getKeys = function (callback) {
callback(null, this.keydown);
}
module.exports = new Keys;
./ LIB / player.js var Keys = require('./ keys')
var Player = function (game, keys) {
// stuff
}
Player.prototype.update = function() {
var self = this;
Keys.getKeys(function(err, keys) {
if (keys['w']) {
self.y -= self.speed;
}
if (keys['a']) {
self.x -= self.speed;
}
if (keys['s']) {
self.y += self.speed;
}
if (keys['d']) {
self.x += self.speed;
}
});
答案 0 :(得分:4)
这是因为Keys
中包含异步进程。
这只是一个已知的chrome问题,通过引用显示对象值。因此,在调用console.log
要查看更清晰的开放式chrome webdev工具,并将debugger;
代替console.log
,并查看keydown
对象中的实际内容。我打赌它只是一个空洞的对象。
我将把它留在这里:http://felix-kling.de/blog/2011/08/18/inspecting-variables-in-javascript-consoles/
答案 1 :(得分:3)
这将教会我快速扫描代码。评论是正确的,这段代码并没有指出当前的问题。
每次输入新函数时,变量this
都会重置。
Player.prototype.update = function () {
var self = this;
Keys(function (err, keydown) {
console.log(keydown, keydown['w']);
/* // To move a player up, for example:
if (keydown['w']) {
self.y += self.speed;
}
*/
});
};
答案 2 :(得分:0)
我在这里看不到任何jQuery。您需要提供更多代码,例如Keys源代码。但我想您需要使用http://api.jquery.com/event.which/,例如keydown.which === 'w'