2012-09-06 40 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'