5

所以我正在写一个游戏,我有一个模块可以返回当前通过 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;

/ * ** * ** * ** * ** * *更新 * ** * ** * ** * ** * * /

这是最终修复:

./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;
    }
  });
4

3 回答 3

4

发生这种情况是因为其中Keys有异步进程。

这只是一个已知的 chrome 问题,它通过引用显示对象值。因此,您在调用会立即看到对象值console.log

为了更清楚地看到它,打开 chrome webdev 工具并放置debugger;而不是console.log查看keydown对象中的实际内容。我敢打赌它只是一个空对象。

我就把它留在这里: http: //felix-kling.de/blog/2011/08/18/inspecting-variables-in-javascript-consoles/

于 2012-09-06T21:25:44.027 回答
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;
          }            
        */
    });
};
于 2012-09-06T21:17:59.800 回答
0

我在这里没有看到任何 jQuery。您需要提供更多代码,例如 Keys 源代码。但我猜你需要使用http://api.jquery.com/event.which/,例如,keydown.which === 'w'

于 2012-09-06T21:21:03.760 回答