2012-09-06 10 views
5

私はゲームを作成していますが、現在jQueryで押されているキーを返すモジュールがあります。そこに問題はありません。オブジェクトはプロパティを表示しますが、それらにアクセスするとundefinedが返されます

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

を、コンソールは、キーが押されているか、が、1つにアクセスしようとしていることを示してくれ未定義の代わりに、真を与える:私は押されたキーにアクセスしようとすると問題が来ます。

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; 

/* ** ** * ** ** * * UPDATE * ** * ** * ** * ** * */

これは、最終的な修正です:

./lib/keys.js のvar $ VARキーの=は必要=( './ 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 ( './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

をKeys'機能が定義されているどのように '? – zerkms

+1

あなたはここで多くの関連する問題を見つけるでしょう。私はいつも[この問題の短い説明を書きました](http://felix-kling.de/blog/2011/08/18/inspecting-variables-in-javascript-consoles/)ある時前。 –

+0

@Felix Kling:今私は人を指す場所を知っています - 私はおそらく少なくとも5回このような質問に答えました。 – zerkms

答えて

4

これは、Keysに非同期プロセスがあるために起こります。

これは、参照によってオブジェクトの値を示すクロームの問題です。だから、あなたがより明確にオープンクロムwebdevツールを、それを見て、代わりにconsole.logdebugger;を入れて、​​対象に、実際に何があるかを確認するにはconsole.log

を呼び出した瞬間後のオブジェクトの値を参照してください。そして、私はそれがちょうど空のオブジェクトになると確信しています。

そして私はちょうどそれをここに残しておきます:http://felix-kling.de/blog/2011/08/18/inspecting-variables-in-javascript-consoles/

+0

もちろん、それは空のオブジェクトです。素晴らしいポインタ。フリーキッククロム。 – sent1nel

+0

この問題の可能な解決策として、私はクライアント側(私はbrowserifyが私に(イベント))を要求することができると思う)と単に自己を行うことができれば、私のKeyオブジェクトをEventEmitterにするつもりです。 emit( 'keypress'、key);か何か。 – sent1nel

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

これは 'これ'についてではありません。もう少し注意深い 'console.log'を見てください。答えはありません – zerkms

+0

@zerkms - jQueryユーザーではないので、ヒントを削除できますか? –

+0

jqueryについてではなく、 'console.log(keydown、keydown ['w']);'を見てください---この行に 'this'はありません – zerkms

0

ここではjQueryは表示されません。キーソースコードなど、より多くのコードを提供する必要があります。しかし、私はを使用する必要があると思います。たとえば、keydown.which === 'w'

関連する問題