2012-09-06 11 views
5

Quindi sto scrivendo un gioco e ho un modulo che restituisce i tasti attualmente premuti tramite jQuery. Nessun problema lì. Il problema nasce quando tento di accedere ai tasti premuti:L'oggetto mostra le proprietà, ma accedendo a esse restituisce un valore non definito

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

e la console mostra che ciò che si premono i tasti, ma il tentativo di accedere a uno mi dà un non definito, invece di vero.

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

Qualcuno ha qualche idea?

Aggiornamento: modulo chiave

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 * ** * *** *** *** */

Questa è la correzione finale:

./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 = Tasti richiedono ('./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

Come 'viene definita la funzione Keys'? – zerkms

+1

Qui troverai molti problemi correlati su SO. Ho sempre [scritto una breve spiegazione di questo problema] (http://felix-kling.de/blog/2011/08/18/inspecting-variables-in-javascript-consoles/) qualche tempo fa. –

+0

@Felix Kling: ora so dove indirizzare le persone - perché ho risposto a queste domande qui probabilmente almeno 5 volte. – zerkms

risposta

4

Ciò accade a causa di Keys ha processi asincroni in esso.

È solo un problema noto di chrome che mostra il valore dell'oggetto per riferimento. Così si vede il valore oggetto un momento dopo si chiama console.log

Per vedere più chiaro strumenti open cromo Webdev e mettere debugger; invece di console.log e vedere che cosa è in realtà keydown oggetto. E scommetto che sarà solo un oggetto vuoto.

E mi limiterò a lasciare qui: http://felix-kling.de/blog/2011/08/18/inspecting-variables-in-javascript-consoles/

+0

Abbastanza sicuro, è un oggetto vuoto. Grande puntatore; dannatamente cromato. – sent1nel

+0

Come possibile soluzione del problema, ho intenzione di rendere il mio oggetto Key un EventEmitter, se posso fare quello lato client (penso che browserify mi consentirà di richiedere ('eventi') ..) e semplicemente auto. emettere ('keypress', chiave); o qualcosa. – sent1nel

3

Questo mi insegnerà a scansionare il codice troppo velocemente. I commenti sono giusti e questo codice non punta al problema attuale.

La variabile this viene reimpostata ogni volta che si immette una nuova funzione.

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

Non si tratta di "questo". Per favore guarda 'console.log' un po 'più attento. Non una risposta – zerkms

+0

@zerkms - dato che non sono un utente jQuery, puoi lasciare un suggerimento? –

+0

non si tratta di jquery, guarda 'console.log (keydown, keydown ['w']);' --- non c'è 'this' in questa riga – zerkms

0

non vedo alcun jQuery qui. È necessario fornire più codice, come il codice sorgente di Keys. Ma suppongo che sia necessario utilizzare http://api.jquery.com/event.which/, ad esempio, keydown.which === 'w'

Problemi correlati