刚开始学习JavaScript,发现JavaScript的组合键中只能用到shift、alt和ctrl来组合其他按键
然而我在写个小游戏中需要同时使用“↑→↓←”中的两个,不知道有什么好办法?
我自己的设想是用一个标志flag来记录当前按下的状态,通过组合onkeydown和onkeyup两个事件来确定flag的值
通过flag的值来确定实际的操作
(flag的值:无=0 ↑=37 →=38 ↓=39 ←=40 ↑→=1 →↓=2 ↓←=3 ←↑=4)不知道高手们有什么更加好的办法实现组合键?
然而我在写个小游戏中需要同时使用“↑→↓←”中的两个,不知道有什么好办法?
我自己的设想是用一个标志flag来记录当前按下的状态,通过组合onkeydown和onkeyup两个事件来确定flag的值
通过flag的值来确定实际的操作
(flag的值:无=0 ↑=37 →=38 ↓=39 ←=40 ↑→=1 →↓=2 ↓←=3 ←↑=4)不知道高手们有什么更加好的办法实现组合键?
比如:
var leftHasDown = false;当按下左键时:leftHasDown = true;
当释放左键时:leftHasDown = false;要想判断4的话,当上键按下时,判断leftHasDown是否为true,如果为true,说明左、上键同时按下
哪个键先按下,从概率上来讲各50%,用onkeydown,onkeyup的话,很难去确定flag的值吧,除非先按下一个键,然后再按另一个键,这样才比较好确定flag的值
设想flag为一个4位的二进制,每一位代表了一个方向,这样就能比较清晰地判断了
看代码~~(由于不知道怎么用JS表示二进制,所以这里都换成了十进制计算)<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>无标题文档</title>
</head><body>
<div id="plane" style="position:absolute;width:40px;height:40px;font-size:20px">ABCD</div>
<script language="javascript">
var Spd=10; //速度
var X=400,Y=300;//坐标
var flag=0;
function move(){
switch(flag){
case 1:X-=Spd;break;
case 2:Y-=Spd;break;
case 4:X+=Spd;break;
case 8:Y+=Spd;break;
case 3:X-=Spd*1.414;Y-=Spd*1.414;break;
case 6:X+=Spd*1.414;Y-=Spd*1.414;;break;
case 9:X-=Spd*1.414;Y+=Spd*1.414;break;
case 12:X+=Spd*1.414;Y+=Spd*1.414;break;
default:break;
}
plane.style.top=Y;
plane.style.left=X;
}
/*
0001上 1
0010右 2
0100下 4
1000左 80011上右 3
1001上左 9
1100下左 12
0110下右 6
*/
function onKeyDown(){
switch(window.event.keyCode){
case 37: //按下“↑”,同时把相反的按键↓变为0
flag=flag|1; //XXXX|0001
flag=flag&11; //XXXX&1011
break;
case 38: //→
flag=flag|2; //XXXX|0010
flag=flag&7; //XXXX&0111
break;
case 39: //↓
flag=flag|4; //XXXX|0100
flag=flag&14; //XXXX&1110
break;
case 40: //←
flag=flag|8; //XXXX|1000
flag=flag&13; //XXXX&1101
break;
default:break;
}
move();
}function onKeyUp(){
switch(window.event.keyCode){
case 37:
flag=flag&14; //XXXX&1110
break;
case 38:
flag=flag&13; //XXXX&1101
break;
case 39:
flag=flag&11; //XXXX&1011
break;
case 40:
flag=flag&7; //XXXX&0111
break;
default:break;
}
}
document.onkeydown=onKeyDown;
document.onkeyup=onKeyUp;
</script>
</body>
</html>