2012-09-06 38 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; 
      }    
     */ 
    }); 
}; 

和控制檯顯示什麼鍵被按下,但試圖訪問一個給了我一個不確定的,而不是真正的。

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 變量$ =要求( './的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中有異步進程。

這只是一個已知的鉻問題,通過引用顯示對象的值。所以你看對象值片刻後打電話console.log

爲了更清晰看到它打開Chrome Webdev的工具,並把debugger;代替console.log,看看在​​對象實際上是。我敢打賭這只是一個空洞的對象。

我就離開這裏:http://felix-kling.de/blog/2011/08/18/inspecting-variables-in-javascript-consoles/

+0

果然,這是一個空的物體。偉大的指針;奇怪的鉻。 – sent1nel

+0

作爲解決這個問題的一個可能的解決方案,我要讓我的Key對象成爲一個EventEmitter,如果我能做到這個客戶端(我認爲browserify將允許我要求('events')..),並且只是自我。發射('按鍵',鍵);或者其他的東西。 – 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

這不是關於'this'。請仔細看看'console.log'。不是答案 – zerkms

+0

@zerkms - 因爲我不是jQuery用戶,你可以放棄提示嗎? –

+0

這不是關於jquery,請看'console.log(keydown,keydown ['w']);'---這行中沒有'this' – zerkms

0

我看不出有任何的jQuery這裏。您需要提供更多的代碼,例如Keys源代碼。但我猜你需要使用http://api.jquery.com/event.which/,例如,keydown.which === 'w'