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

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

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

这个是方法一

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

 

  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.     } 

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

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

 

热门文章推荐

请稍候...

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

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