2012-09-06 9 views
5

Also schreibe ich ein Spiel, und ich habe ein Modul, das die Tasten zurückgibt, die gerade über jQuery gedrückt werden. Keine Probleme dort. Das Problem kommt, wenn ich die Tasten gedrückt zuzugreifen versuchen:Objekt zeigt Eigenschaften, aber Zugriff auf sie gibt undefined zurück

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

Und die Konsole zeigt, dass, welche Tasten gedrückt werden, sondern versuchen, ein für den Zugriff gibt mir eine undefinierte statt wahr.

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

Wer hat irgendwelche Gedanken?

Update: Keymodul

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

Dies ist die letzte fix:

./lib/keys.js var $ = erfordern ('./ 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 Keys = erfordern ('./Tasten')

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

Wie 'Keys' Funktion definiert ist? – zerkms

+1

Sie finden viele verwandte Themen hier auf SO. Ich habe [vor einiger Zeit immer eine kurze Erklärung zu diesem Problem geschrieben] (http://felix-kling.de/blog/2011/08/18/inspecting-variables-in-javascript-consoles/). –

+0

@Felix Kling: jetzt weiß ich wo man Leute hinweist - weil ich solche Fragen hier mindestens 5 mal beantwortet habe. – zerkms

Antwort

4

Das passiert, weil Keys asynchrone Prozesse darin hat.

Es ist nur ein bekanntes Chrom-Problem, das den Objektwert als Referenz zeigt. So sehen Sie den Objektwert einen Moment nach Sie rufen console.log

es zu sehen, mehr klar offenen Chrom webdev Werkzeuge und setzen debugger; statt console.log und sehen, was in keydown Objekt tatsächlich ist. Und ich wette, es wird nur ein leeres Objekt sein.

Und ich werde es gerade hier lassen: http://felix-kling.de/blog/2011/08/18/inspecting-variables-in-javascript-consoles/

+0

Sicher genug, es ist ein leeres Objekt. Großer Zeiger; verdammter Chrome. – sent1nel

+0

Als eine mögliche Lösung für das Problem, werde ich mein Key-Objekt zu einem EventEmitter machen, wenn ich diese Client-Seite tun kann (ich denke, dass browserify mir erlaubt, ('events') zu verlangen ..) und einfach selbst. emittieren ('Tastendruck', Taste); oder so. – sent1nel

3

Das bringt mir bei, Code zu schnell zu scannen. Die Kommentare sind richtig und dieser Code zeigt nicht auf das aktuelle Problem.

Die Variable this wird jedes Mal zurückgesetzt, wenn Sie eine neue Funktion eingeben.

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

Es geht nicht um 'das'. Bitte schauen Sie sich "console.log" etwas aufmerksamer an. Keine Antwort – zerkms

+0

@zerkms - Da ich kein jQuery-Benutzer bin, können Sie einen Hinweis fallen lassen? –

+0

es geht nicht um jquery, schauen Sie sich 'console.log (keydown, keydown [' w ']); '--- Es gibt kein' this 'in dieser Zeile – zerkms

0

Ich sehe keine jQuery hier. Sie müssen mehr Code bereitstellen, z. B. Schlüssel-Quellcode. Aber ich denke, dass Sie http://api.jquery.com/event.which/ verwenden müssen, zum Beispiel keydown.which === 'w'

Verwandte Themen