2012-09-06 13 views
5

Así que estoy escribiendo un juego, y tengo un módulo que devuelve las claves que se están presionando actualmente a través de jQuery. No hay problemas allí. El problema viene cuando intento acceder a las teclas pulsadas:El objeto muestra propiedades pero acceder a ellas devuelve indefinido

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

y la consola muestra que lo que se pulsan las teclas, pero el intento de acceder a uno me da un indefinido en lugar de la verdadera.

Object undefined 
s: true 
w: true 
x: true 
__proto__: Object 

¿Alguien tiene alguna idea?

Actualización: módulo de teclas

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; 

/* ** * ** * ** * ** * * ACTUALIZACIÓN * ** * ** * ** * ** * */

Ésta es la solución definitiva:

./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 Keys var = requieren ('./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

¿Cómo se define la función 'Keys'? – zerkms

+1

Encontrará muchos problemas relacionados aquí en SO. Siempre [escribí una breve explicación de este problema] (http://felix-kling.de/blog/2011/08/18/inspecting-variables-in-javascript-consoles/) hace algún tiempo. –

+0

@Felix Kling: ahora sé dónde señalar a las personas, porque he respondido estas preguntas aquí probablemente al menos 5 veces. – zerkms

Respuesta

4

Eso ocurre porque Keys tiene procesos asíncronos.

Es solo un problema conocido de Chrome que muestra el valor del objeto por referencia. Así se ve el valor del objeto después de un momento se llama console.log

Para verlo más claro herramientas de cromo abierta WebDev y pone debugger; en lugar de console.log y ver lo que en realidad está en keydown objeto. Y apuesto a que será solo un objeto vacío.

Y sólo voy a dejarlo aquí: http://felix-kling.de/blog/2011/08/18/inspecting-variables-in-javascript-consoles/

+0

Efectivamente, es un objeto vacío. Gran puntero; volviendo loco a Chrome. – sent1nel

+0

Como una posible solución al problema, voy a hacer que mi objeto clave sea un EventEmitter, si puedo hacerlo desde el lado del cliente (creo que browserify me permitirá requerir ('events') ...) y simplemente self. emitir (tecla 'presionar', tecla); o algo. – sent1nel

3

Eso me enseñará a escanear el código demasiado rápido. Los comentarios son correctos y este código no apunta al problema actual.

La variable this se restablece cada vez que ingresa una nueva función.

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

No se trata de 'esto'. Por favor, mira 'console.log' un poco más atento. No es una respuesta – zerkms

+0

@zerkms - dado que no soy un usuario de jQuery, ¿puedes dejar caer una pista? –

+0

no se trata de jquery, mira 'console.log (keydown, keydown ['w']);' --- no hay 'this' en esta línea – zerkms

0

No veo ningún jQuery aquí. Debe proporcionar más código, como el código fuente de Keys. Pero supongo que necesita usar http://api.jquery.com/event.which/, por ejemplo, keydown.which === 'w'

Cuestiones relacionadas