·您当前的位置:首页 > 技术教程 > AS2与AS3技术 >

[AS3]AS3键盘事件的判断实现多个键同时按下的操作源代码

时间:2016-01-07 09:07酷播
这个是方法一,有局限性。方法二是用数组把按下的键保存起来[AS3]AS3键盘事件的判断实现多个键同时按下的操作源代码

这个是方法一

  1. package  
  2. { 
  3.     import com.KeyPoll; 
  4.     import flash.display.Sprite; 
  5.     import flash.events.Event; 
  6.     import flash.ui.Keyboard; 
  7.     import flash.text.TextField; 
  8.     import flash.text.TextFormat; 
  9.  
  10.     [SWF(width = "720",height = "450",frameRate = "12",backgroundColor = "0x3366ee")] 
  11.      
  12.     /** 
  13.     *@ web: http://blog.vini123.com  
  14.     *@ explanation 文章来自网上,整理vini。 这个对于键盘控制人物角色八个方向的行走还是比较方便的。 
  15.     */ 
  16.     public class Main extends Sprite 
  17.     { 
  18.         private var key:KeyPoll; 
  19.         private var curPosition:int; 
  20.         private var txt:TextField; 
  21.  
  22.         public function Main():void 
  23.         { 
  24.             addEventListener(Event.ADDED_TO_STAGE,addtoStageHandler); 
  25.         } 
  26.         private function addtoStageHandler(e:Event) 
  27.         { 
  28.             removeEventListener(Event.ADDED_TO_STAGE,addtoStageHandler); 
  29.  
  30.             var txtFormat:TextFormat=new TextFormat(); 
  31.             txtFormat.size = 14; 
  32.             txt=new TextField(); 
  33.             txt.width=stage.stageWidth-20; 
  34.             txt.multiline=true; 
  35.             txt.setTextFormat(txtFormat); 
  36.             txt.textColor=0xff0000; 
  37.             txt.selectable = false; 
  38.             txt.mouseEnabled = false; 
  39.             txt.x = 10; 
  40.             txt.y = 20; 
  41.             addChild(txt); 
  42.             key = new KeyPoll(stage); 
  43.             addEventListener(Event.ENTER_FRAME,enterFrameHandler); 
  44.         } 
  45.         private function enterFrameHandler(e:Event) 
  46.         { 
  47.             controlKey(); 
  48.         } 
  49.  
  50.         private function controlKey():void 
  51.         { 
  52.             if (key.isDown(Keyboard.UP)) 
  53.             { 
  54.  
  55.                 if (key.isDown(Keyboard.LEFT)) 
  56.                 { 
  57.                     curPosition = 7; 
  58.                 } 
  59.                 else if (key.isDown(Keyboard.RIGHT)) 
  60.                 { 
  61.                     curPosition = 8; 
  62.                 } 
  63.                 else 
  64.                 { 
  65.                     curPosition = 3; 
  66.                 } 
  67.             } 
  68.             else if (key.isDown(Keyboard.DOWN)) 
  69.             { 
  70.                 if (key.isDown(Keyboard.LEFT)) 
  71.                 { 
  72.                     curPosition = 5; 
  73.  
  74.                 } 
  75.                 else if (key.isDown(Keyboard.RIGHT)) 
  76.                 { 
  77.                     curPosition = 6; 
  78.                 } 
  79.                 else 
  80.                 { 
  81.                     curPosition = 1; 
  82.                 } 
  83.             } 
  84.             else if (key.isDown(Keyboard.LEFT)) 
  85.             { 
  86.                 curPosition = 2; 
  87.  
  88.             } 
  89.             else if (key.isDown(Keyboard.RIGHT)) 
  90.             { 
  91.                 curPosition = 4; 
  92.             } 
  93.             txt.text = "请按小键盘的上下左右或两个同时一起按,注意看着:" + String(curPosition); 
  94.         } 
  95.     } 
  96. } 

 

  1. package com{ 
  2.     import flash.events.KeyboardEvent; 
  3.     import flash.events.Event; 
  4.     import flash.display.DisplayObject; 
  5.     import flash.utils.ByteArray; 
  6.  
  7.     public class KeyPoll { 
  8.         private var states:ByteArray; 
  9.         private var dispObj:DisplayObject; 
  10.  
  11.         public function KeyPoll( displayObj:DisplayObject ) { 
  12.             states = new ByteArray(); 
  13.             states.writeUnsignedInt( 0 ); 
  14.             states.writeUnsignedInt( 0 ); 
  15.             states.writeUnsignedInt( 0 ); 
  16.             states.writeUnsignedInt( 0 ); 
  17.             states.writeUnsignedInt( 0 ); 
  18.             states.writeUnsignedInt( 0 ); 
  19.             states.writeUnsignedInt( 0 ); 
  20.             states.writeUnsignedInt( 0 ); 
  21.             dispObj=displayObj; 
  22.             dispObj.addEventListener( KeyboardEvent.KEY_DOWN, keyDownListener, false, 0, true ); 
  23.             dispObj.addEventListener( KeyboardEvent.KEY_UP, keyUpListener, false, 0, true ); 
  24.             dispObj.addEventListener( Event.ACTIVATE, activateListener, false, 0, true ); 
  25.             dispObj.addEventListener( Event.DEACTIVATE, deactivateListener, false, 0, true ); 
  26.         } 
  27.  
  28.         private function keyDownListener( ev:KeyboardEvent ):void { 
  29.             states[ ev.keyCode >>> 3 ] |= 1 << (ev.keyCode & 7); 
  30.         } 
  31.  
  32.         private function keyUpListener( ev:KeyboardEvent ):void { 
  33.             states[ ev.keyCode >>> 3 ] &= ~(1 << (ev.keyCode & 7)); 
  34.         } 
  35.  
  36.         private function activateListener( ev:Event ):void { 
  37.             for (var i:int = 0; i < 32; ++i) { 
  38.                 states[i]=0; 
  39.             } 
  40.         } 
  41.  
  42.         private function deactivateListener( ev:Event ):void { 
  43.             for (var i:int = 0; i < 32; ++i) { 
  44.                 states[i]=0; 
  45.             } 
  46.         } 
  47.  
  48.         public function isDown( keyCode:uint ):Boolean { 
  49.             return ( states[ keyCode >>> 3 ] & (1 << (keyCode & 7)) ) != 0; 
  50.         } 
  51.          
  52.         public function isUp( keyCode:uint ):Boolean { 
  53.             return ( states[ keyCode >>> 3 ] & (1 << (keyCode & 7)) ) == 0; 
  54.         } 
  55.     } 
  56. } 

方法二是用数组把按下的键保存起来

  1. package  
  2. { 
  3.     import flash.display.Sprite; 
  4.     import flash.events.Event; 
  5.     import flash.events.MouseEvent; 
  6.     import flash.events.KeyboardEvent; 
  7.     import flash.text.TextField; 
  8.  
  9.     public class Main extends Sprite 
  10.     { 
  11.         var role:Sprite; 
  12.         var speed:int = 5; 
  13.         var keyObj:Object = {}; 
  14.         var keyArr:Array = []; 
  15.         public function Main():void 
  16.         { 
  17.             role=new Sprite(); 
  18.             role.graphics.beginFill(0xff00ff); 
  19.             role.graphics.drawRect(10,-40,20,40); 
  20.             role.graphics.endFill(); 
  21.             role.x = 150; 
  22.             role.y = 200; 
  23.             addChild(role); 
  24.             stage.focus = this; 
  25.             keyOne(); 
  26.         } 
  27.  
  28.  
  29.  
  30.         private function keyOne() 
  31.         { 
  32.             stage.addEventListener(KeyboardEvent.KEY_DOWN,KeyDownHandler); 
  33.             stage.addEventListener(KeyboardEvent.KEY_UP,KeyUpHandler); 
  34.         } 
  35.  
  36.         private function KeyDownHandler(e:KeyboardEvent) 
  37.         { 
  38.             keyObj[e.keyCode] = true; 
  39.  
  40.             if (keyObj[32]) 
  41.             { 
  42.                 trace("space"); 
  43.                 //role.y -=  3 * speed; 
  44.             } 
  45.             if (keyObj[37]) 
  46.             { 
  47.                 trace("left"); 
  48.                 role.x -=  speed; 
  49.             } 
  50.             if (keyObj[38]) 
  51.             { 
  52.                 trace("down"); 
  53.                 role.y -=  speed; 
  54.             } 
  55.             if (keyObj[39]) 
  56.             { 
  57.                 trace("right"); 
  58.                 role.x +=  speed; 
  59.             } 
  60.  
  61.             if (keyObj[40]) 
  62.             { 
  63.                 trace("up"); 
  64.                 role.y +=  speed; 
  65.             } 
  66.  
  67.             if (keyObj[13] && keyObj[17]) 
  68.             { 
  69.                 trace("八连杀,好无敌。我要发射了。"); 
  70.                 var txt:TextField=new TextField(); 
  71.                 txt.multiline = true; 
  72.                 txt.wordWrap = true; 
  73.                 txt.text = "八连杀,好强大。一句就能爆菊花!"; 
  74.                 txt.x=int(50*Math.random()); 
  75.                 txt.y=-int(200*Math.random()); 
  76.                 while(role.numChildren>0) 
  77.                 { 
  78.                     role.removeChildAt(0); 
  79.                 } 
  80.                 role.addChild(txt); 
  81.             } 
  82.         } 
  83.  
  84.         private function KeyUpHandler(e:KeyboardEvent) 
  85.         { 
  86.             keyObj[e.keyCode] = false; 
  87.         } 
  88.  
  89.         private function keyTwo() 
  90.         { 
  91.             stage.addEventListener(KeyboardEvent.KEY_DOWN,keyDownHandler); 
  92.             stage.addEventListener(KeyboardEvent.KEY_UP,keyUpHandler); 
  93.             addEventListener(Event.ENTER_FRAME,enterFrameHandler); 
  94.         } 
  95.  
  96.         private function keyDownHandler(e:KeyboardEvent) 
  97.         { 
  98.             var num = keyArr.indexOf(e.keyCode); 
  99.             if (num<0) 
  100.             { 
  101.                 keyArr.push(e.keyCode); 
  102.             } 
  103.         } 
  104.  
  105.         private function keyUpHandler(e:KeyboardEvent) 
  106.         { 
  107.             var num = keyArr.indexOf(e.keyCode); 
  108.             if (num>=0) 
  109.             { 
  110.                 keyArr.splice(num,1); 
  111.             } 
  112.  
  113.         } 
  114.  
  115.         private function enterFrameHandler(e:Event) 
  116.         { 
  117.             trace(keyArr); 
  118.         } 
  119.     } 
  120. } 

 

热门文章推荐

请稍候...

保利威视云平台-轻松实现点播直播视频应用

酷播云数据统计分析跨平台播放器