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

また、コンソールにはどのキーが押されたかが表示されますが、キーにアクセスしようとすると、trueではなくundefinedが表示されます。

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非同期プロセスが含まれているために発生します。

これは、参照によってオブジェクトの値を示す既知のクロムの問題です。したがって、呼び出した直後にオブジェクトの値が表示されます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 に答える