2016-12-05 43 views
0

我有一個側面滾動太空船遊戲,我一直在試圖找到一種方法來有效地處理玩家移動。這一直是我的代碼,到目前爲止,我已經從源複製:如何在帆布遊戲中更好地處理玩家動作?

window.addEventListener("keydown", keyDown); 
window.addEventListener("keyup", keyUp); 

setInterval(move, 33.3); 

keys = {}; 

function keyDown(event){ 
    keys[event.keyCode] = true; 
} 

function keyUp(event){ 
    delete keys[event.keyCode]; 
} 

function move(){ 
    if (65 in keys && player.x > 0) 
     player.x -=5; 
    if (68 in keys && player.x < 576) 
     player.x +=5; 
    if (87 in keys && player.y > 0) 
     player.y -= 5; 
    if (83 in keys && player.y < 576) 
     player.y += 5; 

} 

問題

  1. 爲什麼我需要設置keys[event.keyCode]真正?這種說法有什麼作用?
  2. 是否delete keys[event.keyCode]只是刪除鍵對象中包含該keyCode的任何屬性?
  3. 什麼是更好的方式來實現球員運動?

回答

2

爲什麼我需要設置keys[event.keyCode]爲真?這種說法有什麼作用?

從技術上說,你不知道。您只需添加的某個值即可,其中keys[event.keyCode]。這是做什麼是添加一個密鑰到您的keys對象匹配的關鍵代碼。這允許您稍後檢查並查看播放器是否按下了該按鈕。您也可以將該值添加到數組或類似的東西。這只是提供了一個簡單的方法來查找給定的鍵是否被按下。

請問delete keys[event.keyCode]是否只刪除包含該keyCode的任何屬性?

它從keys對象中刪除event.keyCode屬性。例如,假設玩家以前按下了「A」或鍵碼65. delete keys[event.keyCode]相當於delete keys[65]。現在keys對象不再具有65屬性,並且在move中檢查它時不會返回true

什麼是執行球員運動更好的辦法?

你所做的是完全合理的,並在很多遊戲中使用。事實上,它是我用的時候我wrote a game engine.

+0

所以只是要確定的技術,按鍵對象永遠只有一個一個屬性與(比如說65)鍵碼吧? – PixelProgrammer

+0

@PixelProgrammer不一定。如果用戶同時按下兩個鍵,那麼'keys'將具有兩個屬性;每個鍵一個。這是爲什麼這是一個好的解決方案的另一個原因。它允許您一次輕鬆處理多個按鈕。 –

+0

當然,但它只有一個keyCode屬性。所以,一個屬性與65,一個與68.我問的原因是因爲如果我要使用數組,這將意味着該數組可能會保存多個keyCodes,我想確保與情況不是對象。 – PixelProgrammer