刚开始学习JavaScript,发现JavaScript的组合键中只能用到shift、alt和ctrl来组合其他按键
然而我在写个小游戏中需要同时使用“↑→↓←”中的两个,不知道有什么好办法?
我自己的设想是用一个标志flag来记录当前按下的状态,通过组合onkeydown和onkeyup两个事件来确定flag的值
通过flag的值来确定实际的操作
(flag的值:无=0  ↑=37  →=38  ↓=39  ←=40  ↑→=1  →↓=2  ↓←=3  ←↑=4)不知道高手们有什么更加好的办法实现组合键?

解决方案 »

  1.   

    那就用JS变量记录起来这几个键的按键情况
    比如:
    var leftHasDown = false;当按下左键时:leftHasDown = true;
    当释放左键时:leftHasDown = false;要想判断4的话,当上键按下时,判断leftHasDown是否为true,如果为true,说明左、上键同时按下
      

  2.   

    ↑→ 同时按这两个键的时候
    哪个键先按下,从概率上来讲各50%,用onkeydown,onkeyup的话,很难去确定flag的值吧,除非先按下一个键,然后再按另一个键,这样才比较好确定flag的值
      

  3.   

    我基本上就是这个意思,只不过只用了flag一个标志。在判断两个按键同时按下时候还可以,但是如果3个或三个以上的时候就太复杂了,你这个方法应该清晰点
      

  4.   

    刚才又想了下,觉得用四个变量的话判断不是很方便,然后想到了二进制
    设想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>