2012-10-01 62 views
0

我不知道如何解決這個問題: 當我把左+空間一起按下,動畫作品,但是當我把離開壓(不離開它),然後我按空間(一次,保持按左),動畫跳轉,但它不會離開...即使我按其他鍵(重置它,我必須離開所有)動畫停止。有人能解釋我爲什麼這樣,並給我一些實際的解決方案?非常感謝你!這是代碼:的JavaScript的KeyDown衝突

<style> 
#map{ 
    position:relative; 
    height:220px; 
    width:800px; 
} 
#character{ 
    height:100px; 
    width:100px; 
    position:absolute; 
    bottom: 10px; 
    left: 0px; 
    z-index:1; 
} 
</style> 
<div id="map"><div id="character"><img src="images/bart.gif"></div></div> 
<script> 
enableJump = true; 
jump = function(){ 
    if(enableJump){ enableJump = false; 
     salta = function(){ 
      if(flagY){ 
       posY++; 
       if(posY >= 90) flagY = false; 
       jj = document.getElementById('character').style.bottom=posY; 
      } 
      else{ 
       posY--; 
       jj = document.getElementById('character').style.bottom=posY; 
       if(posY < 10){ 
        flagY = true; 
        clearInterval(j); 
        enableJump = true; 
        up = false; 
       } 
      } 
     } 
     j = setInterval(salta,8); 
    } 
} 
up = false; dx = false; 
document.onkeydown = function(evt){ 
    code = evt.keyCode; 
    if(code == 32) up=true; 
    if(code == 39) dx=true; 
    moveCharacter(); 
} 
document.onkeyup = function(evt){ 
    code = evt.keyCode; 
    if(code == 32) up=false; 
    if(code == 39) dx=false; 
} 
posX = 10; posY = 10; flagY = true; var j; 
moveCharacter = function(){ 
    if(dx == true && up == true){ 
     jump(); 
     posX+=10; 
     x1 = document.getElementById('character').style.backgroundImage='url(images/character_left.gif)'; 
     temp = document.getElementById('character').style.left=posX; 
    } 
    else if(dx){ 
     posX+=10; 
     x1 = document.getElementById('character').style.backgroundImage='url(images/character_left.gif)'; 
     temp = document.getElementById('character').style.left=posX; 
    } 
    else if(up){ jump(); } 
} 
</script> 

代碼清潔(不跳,但同樣的問題,一直按住左,按另一個鍵停止,我必須讓它復位)僅

<script> 
var dx = false; 
var posX = 10; 
var posY = 10; 
document.onkeydown = function(evt){ 
    if(evt.keyCode == 39) dx=true; 
    moveCharacter(); 
} 
document.onkeyup = function(evt){ 
    if(evt.keyCode == 39) dx=false; 
} 
moveCharacter = function(){ 
    if(dx){ 
     posX+=10; 
     document.getElementById('character').style.left=posX; 
    } 
} 
</script> 
+0

你有很多隱式全局變量(實際上,我沒有看到一個'var'關鍵字)可能導致衝突,我建議你清理代碼,看看是否有幫助。 – jbabey

+0

代碼清理,同樣的問題(保持左按下,並按下另一個鍵,劇本停止動畫,並走左我必須離開左鍵,再按一次),在這裏代碼: '' –

回答

0

最後我解決了這個問題: 功能的keydown,KEYUP,movecharacter被刪除。 我說:

var keysDown = {}; 
try { 
    if (window.addEventListener) { 
     window.addEventListener("keydown", function (v) {keysDown[v.keyCode] = true;}, false); 
     window.addEventListener("keyup", function (v) {delete keysDown[v.keyCode];}, false); 
    } else if (document.attachEvent) { 
     document.attachEvent("onkeydown", function (v) {keysDown[v.keyCode] = true;}); 
     document.attachEvent("onkeyup", function (v) {delete keysDown[v.keyCode];}); 
    } else if (window.attachEvent) { 
     window.attachEvent("onkeydown", function (v) {keysDown[v.keyCode] = true;}); 
     window.attachEvent("onkeyup", function (v) {delete keysDown[v.keyCode];}); 
    } else { 
     document.addEventListener("keydown", function (v) {keysDown[v.keyCode] = true;}, false); 
     document.addEventListener("keyup", function (v) {delete keysDown[v.keyCode];}, false); 
    } 
} catch (e) { 
    alert("Keys don't work!\nError: "+e); 
} 
... 
var update = function() { 
    if (38 in keysDown) { // Player holding up 
     .. 
    } 
    if (40 in keysDown) { // Player holding down 
     .. 
    } 
    if (37 in keysDown) { // Player holding left 
     .. 
    } 
    if (39 in keysDown) { // Player holding right 
     .. 
    } 
}; 
setInterval(update,10); 

參考:http://www.lostdecadegames.com/how-to-make-a-simple-html5-canvas-game/ http://stackoverflow.com/questions/9507200/why-keydown-listener-doesnt-work-in-ie

它與Chrome瀏覽器,火狐,IE7/8 /怪癖模式(不以文檔模式IE9標準) 感謝您的關注!

0

的JavaScript在最後一個按鍵上重複​​事件。您需要存儲按下的鍵的狀態,同時聽取​​和keyup事件。

+0

這可能是這樣,但我如何存儲這兩個事件?我只是不知道該怎麼做! –

+0

前段時間,我在代碼筆中寫了一個[存儲關鍵狀態的簡短示例](http://codepen.io/zzzzBov/full/mugKt),儘管它有一些跨瀏覽器的問題(在Firefox中正常工作,使用過在Chrome中正常工作)。 [您可以查看源代碼以獲得它的工作原理的一般概念](http://codepen.io/zzzzBov/pen/mugKt)。 – zzzzBov

+0

非常感謝,我會研究你的代碼,希望我能解決我的問題! –