2012-02-25 55 views
1

讓我解釋一下我的情況......我正在製作2D平臺遊戲,在那裏你可以四處走動並拍攝東西。轉身使用W,A & D鍵,並用鼠標完成拍攝。當我單獨完成所有的操作時,一切正常,但是當我單擊鼠標按鈕並在同一時間按下某個鍵時,我的代碼開始行動,就好像鍵仍然被按下一樣。這種情況有時只會發生鼠標點擊有時會導致鍵盤輸入,怎麼樣?

我註冊所有的鍵盤事件是這樣的:

<body onload="init()" onkeydown="press(event);" onkeyup="release(event);"> 

下面是處理腳本:

var KEY = {W: 87, A: 65, S:83, D: 68, E: 69}; 

var input = { 
    right: false, 
    up: false, 
    left: false, 
    down: false, 
    e: false 
}; 

function press(evt) { 
    var code = evt.keyCode; 

    switch(code) 
    { 
     case KEY.W: input.up = true; break; 
     case KEY.A: input.left = true; break; 
     case KEY.S: input.down = true; break; 
     case KEY.D: input.right = true; break; 
     case KEY.E: input.e = true; break; 
    } 
} 

function release(evt) 
{ 
    var code = evt.keyCode; 
    input.code = code; 

    switch(code) 
    { 
     case KEY.W: input.up = false; break; 
     case KEY.A: input.left = false; break; 
     case KEY.S: input.down = false; break; 
     case KEY.D: input.right = false; break;   
     case KEY.E: input.e = false; break; 
    } 
} 

即使我不註冊鼠標事件,發生這種情況。有人能解釋爲什麼嗎?我該如何解決這個問題?

+4

你的鼠標太硬了。 – Steve 2012-02-25 23:29:39

+0

您是否在多個瀏覽器中測試了這個功能?聽起來像一個錯誤。 – Jivings 2012-02-26 00:17:06

+0

鼠標事件的事件處理代碼在哪裏? – 2012-02-26 07:20:12

回答

1

EDITED

看來,那生澀的行爲不是偶然。如果按下並保持left,然後按up和版本left,則移動繼續。但是,如果稍後釋放up,則移動將停止。 IE瀏覽器。你可以連續循環移動,但是你不能回到原來的方向。這可能會引起事件處理過程,對事件調用及其返回點使用堆棧類型保存。

下面是一個示例代碼,它的竅門。它使用箭頭鍵移動光點。該代碼爲了清晰起見在全球空間中進行,並且僅針對IE進行了編輯,但是您只需編輯它即可。

<html> 
<head> 
<script> 
function move(elem){ 
    if(i[37])elem.style.left=elem.style.pixelLeft-2; 
    if(i[38])elem.style.top=elem.style.pixelTop-2; 
    if(i[39])elem.style.left=elem.style.pixelLeft+2; 
    if(i[40])elem.style.top=elem.style.pixelTop+2; 
    return; 
} 

function keyDn(){ 
    var key=window.event.keyCode; 
    if(i[key]!==undefined) i[key]=true; 
    return; 
} 

function keyUp(){ 
    var key=window.event.keyCode; 
    if(i[key]!==undefined) i[key]=false; 
    return; 
} 

window.onload=function(){ 
    spot=document.getElementById('movablespot'); 
    i={'37':false,'38':false,'39':false,'40':false}; 
    document.body.onkeydown=keyDn; 
    document.body.onkeyup=keyUp;  
    a=setInterval(function(){move(spot);return;},5); 
}  
</script> 
</head> 
<body> 
<span id="movablespot" style="position:absolute;top:100px;left:100px;">O</span> 
</body> 
</html> 
+0

很酷,現在似乎不會發生。我通過'addEventListener'添加了監聽器。 – corazza 2012-02-27 08:33:36

+0

嗯,它似乎仍在發生!我會檢查,也許這只是一個本地問題。如果是這樣,我會再次接受你的答案。 – corazza 2012-03-15 08:39:02

相關問題