2011-03-24 55 views
0

我想要一個由keypress動態生成的數組,然後讓不同的JavaScript對象監聽該數組中的更改。例如,在遊戲中,按下LEFT/RIGHT/UP/DOWN會將這4個值存儲在數組中,這可以通過偵聽該數組的不同對象來執行。正在監聽數組中的更改的JavaScript對象

這是一個很好的方法嗎?如果是這樣,如何設置監聽器到該陣列?

回答

1

您可能沒有考慮使用簡單的Array,而是您的自定義實現應用Observer pattern另一個(不好)的選擇是用定時器輪詢對數組的更改,但這對於遊戲來說似乎不可行。

其實,既然你在寫遊戲,我會假設你會有一個運行在計時器上的遊戲循環。每個感興趣的對象可以在每個更新週期簡單地從數組中讀取。可能不需要對這些對象進行實時更改。當然,除非你無法承受失去任何擊鍵 - 在這種情況下,你可以將鍵緩衝在比簡單陣列更復雜的結構中。

0

如何爲每個按鍵設置註冊功能?

var keyArray = []; 
function addkey(key) { 
    arr.push(key); 
    dispatch(); 
} 
$(document).keydown(function(e){ 
    addkey(e.which); 
}) 
function dispatch() { 
    /* CODE */ 
} 
0

我會推薦一個消息隊列模型。有一箇中心MessageQueue,它接收事件並通知偵聽器。想要在某些按鍵上執行某些操作的對象可以將自己註冊爲隊列中的偵聽器,並在他們關心的事情發生時收到通知。假設您有一組預定義的事件「上」,「下」,「左」和「右」事件。

var MESSAGE_QUEUE = function() { 

    var eventListeners = { 
     UP: [], 
     DOWN: [], 
     LEFT: [], 
     RIGHT: [] 
    }; 

    return { 

     register: function(event, obj) { 
      var listeners = eventListeners[event]; 
      if (listeners) { 
       listeners.push(obj); 
      } 
     }, 

     fire: function(event) { 
      var listeners = eventListeners[event] || []; 
      for (var i=0; i<listeners.length; i++) { 
       listeners[i].onEvent(event); 
      } 
     } 
    }; 
}(); 

然後想要下到被通知對象說:

MESSAGE_QUEUE.register("DOWN", this); 

this預計將定義一個onEvent功能。然後無論火災的關鍵事件:

element.onKeyPress = function(event) { 
    // ... figure out if down was presses 
    MESSAGE_QUEUE.fire("DOWN"); 
} 

這樣的事情將是一個乾淨的解決方案。顯然這可以根據您的需要進行更改,例如可變數量的事件或更清晰的函數名稱,例如爲每個偵聽器定義的onDown,onUp等。

+0

在哪裏設置的實際DOWN事件登記對象的隊列下來以後? – bcm 2011-03-24 06:32:59

+0

你能修改我的例子:http://jsfiddle.net/brandonchen/Laem7/?根據你的註冊消防方法? – bcm 2011-03-24 12:31:50