2012-02-25 116 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