2012-09-06 41 views
5

Vì vậy, tôi đang viết một trò chơi và tôi có một mô-đun trả về các khóa hiện đang được nhấn qua jQuery. Không có vấn đề ở đó. Sự cố xảy ra khi tôi cố gắng truy cập các phím được nhấn:Đối tượng hiển thị các thuộc tính nhưng truy cập chúng trả về không xác định

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

Và bảng điều khiển cho biết phím nào được nhấn nhưng cố gắng truy cập vào một phím cho tôi không xác định thay vì đúng.

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

Có ai có bất kỳ suy nghĩ nào không?

Cập nhật: mô-đun chính

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; 

/* ** * ** * ** * ** * * CẬP NHẬT * ** * ** * ** * ** * */

Đây là sửa chữa cuối cùng:

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

Chức năng 'Keys' được xác định như thế nào? – zerkms

+1

Bạn sẽ tìm thấy nhiều vấn đề liên quan ở đây trên SO. Tôi luôn luôn [đã viết một lời giải thích ngắn về vấn đề này] (http://felix-kling.de/blog/2011/08/18/inspecting-variables-in-javascript-consoles/) một thời gian trước đây. –

+0

@Felix Kling: bây giờ tôi biết nơi để chỉ mọi người - bởi vì tôi đã trả lời những câu hỏi như vậy ở đây có lẽ ít nhất 5 lần. – zerkms

Trả lời

4

Điều đó xảy ra vì Keys có các quá trình không đồng bộ trong đó.

Nó chỉ là một vấn đề chrome đã biết, hiển thị giá trị đối tượng theo tham chiếu. Vì vậy, bạn nhìn thấy giá trị đối tượng một khoảnh khắc sau bạn gọi console.log

Để nhìn thấy nó rõ ràng hơn các công cụ mở chrome webdev và đưa debugger; thay vì console.log và xem những gì thực sự trong keydown đối tượng. Và tôi đặt cược nó sẽ chỉ là một vật thể trống.

Và tôi sẽ để nguyên ở đây: http://felix-kling.de/blog/2011/08/18/inspecting-variables-in-javascript-consoles/

+0

Chắc chắn, đó là một vật thể trống. Con trỏ tuyệt vời; freaking Chrome. – sent1nel

+0

Như một giải pháp có thể cho vấn đề, tôi sẽ tạo đối tượng Key của mình là EventEmitter, nếu tôi có thể thực hiện điều đó (tôi nghĩ browserify sẽ cho phép tôi yêu cầu ('sự kiện') ..) và đơn giản là tự. phát ra ('nhấn phím', khóa); hay gì đó. – sent1nel

3

Điều đó sẽ dạy tôi quét mã quá nhanh. Nhận xét là đúng và mã này không trỏ đến vấn đề hiện tại.

Biến this được đặt lại mỗi lần bạn nhập hàm mới.

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

Nó không phải về 'này'. Hãy nhìn vào 'console.log' một chút chú ý hơn. Không phải là câu trả lời – zerkms

+0

@zerkms - vì tôi không phải là người dùng jQuery, bạn có thể bỏ một gợi ý không? –

+0

nó không phải về jquery, nhìn vào 'console.log (keydown, keydown ['w']);' --- không có 'this' trong dòng này – zerkms

0

Tôi không thấy bất kỳ jQuery nào tại đây. Bạn cần cung cấp thêm mã, chẳng hạn như mã nguồn Keys. Nhưng tôi đoán rằng bạn cần phải sử dụng http://api.jquery.com/event.which/, ví dụ: keydown.which === 'w'

Các vấn đề liên quan