Pages

AS3 Input - Mouse And Keyboard

Messing around with OpenTK i find using the Keyboard class very comfortable and thought i would do something similar in AS3, I've used input classes in all of my AS3 projects having to add the same event in a different class over and over to get input for different tasks is cumbersome and it's not very wise stacking events like that, So an input class is very useful.

Keyboard

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
package  
{
 import flash.display.DisplayObject;
 import flash.events.Event;
 import flash.events.KeyboardEvent;
 
 /**
  * ...
  * @author Zero
  */
 public final class Keyboard extends Array
 {
  public static var KEY_DOWN:int = 1;
  public static var KEY_UP:int = 0;
  public static var KEY_PRESSED:int = 2;
  public static var KEY_RELEASED:int = -1;
  
  private static var initialized:Boolean;
  //a reasonable 127 or 255
  private static var char_count:int;
  
  public static function Initialize(main_class:DisplayObject, character_count:int = 127):void
  {
   if (initialized)
    return;
   
   initialized = true;
   
   char_count = character_count;
   
   main_class.stage.addEventListener(KeyboardEvent.KEY_DOWN, KeyDown);
   main_class.stage.addEventListener(KeyboardEvent.KEY_UP, KeyUp);
  }
  
  private static function KeyDown(e:KeyboardEvent):void
  {
   Keyboard[e.keyCode] = (Keyboard[e.keyCode] == 0 ? 2 : 1);
  }
  
  private static function KeyUp(e:KeyboardEvent):void
  {
   Keyboard[e.keyCode] = -1;
  }
  
  public static function Update():void
  {
   for (var i:int = 0; i < char_count; i++)
   {
    if (Keyboard[i] > 0)
     Keyboard[i] = 1;
    else
     Keyboard[i] = 0;
   }
  }
 }
}

Mouse

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
package  
{
 import flash.display.DisplayObject;
 import flash.events.MouseEvent;
 
 /**
  * ...
  * @author Zero
  */
 public final class Mouse extends Array
 {
  public static const LEFT:int = 0;
  public static const MIDDLE:int = 1;
  public static const RIGHT:int = 2;
  
  public static const BUTTON_DOWN:int = 1;
  public static const BUTTON_UP:int = 0;
  public static const BUTTON_PRESSED:int = 2;
  public static const BUTTON_RELEASED:int = -1;
  
  public static var initialized:Boolean;
  
  private static var mouse_dX:int, mouse_dY:int, mouse_X:int, mouse_Y:int;
  private static var mouse_moving:Boolean, mouse_delta_sign:Boolean = true;
  
  public static function Initialize(main_class:DisplayObject):void
  {
   if (initialized)
    return;
    
   initialized = true;
   
   main_class.stage.addEventListener(MouseEvent.MOUSE_DOWN, MouseDown);
   main_class.stage.addEventListener(MouseEvent.MOUSE_UP, MouseUp);
   
   main_class.stage.addEventListener(MouseEvent.MIDDLE_MOUSE_DOWN, MouseDown);
   main_class.stage.addEventListener(MouseEvent.MIDDLE_MOUSE_UP, MouseUp);
   
   main_class.stage.addEventListener(MouseEvent.RIGHT_MOUSE_DOWN, MouseDown);
   main_class.stage.addEventListener(MouseEvent.RIGHT_MOUSE_UP, MouseUp);
   
   main_class.stage.addEventListener(MouseEvent.MOUSE_MOVE, MouseMove);
  }
  
  private static function MouseDown(e:MouseEvent):void
  {
   var button_code:int;
   
   if (e.type == MouseEvent.MOUSE_DOWN)
    button_code = LEFT;
   if (e.type == MouseEvent.MIDDLE_MOUSE_DOWN)
    button_code = MIDDLE;
   if (e.type == MouseEvent.RIGHT_MOUSE_DOWN)
    button_code = RIGHT;
    
   Mouse[button_code] = (Mouse[button_code] == 0 ? 2 : 1);
  }
  
  private static function MouseUp(e:MouseEvent):void
  {
   var button_code:int;
   
   if (e.type == MouseEvent.MOUSE_UP)
    button_code = LEFT;
   if (e.type == MouseEvent.MIDDLE_MOUSE_UP)
    button_code = MIDDLE;
   if (e.type == MouseEvent.RIGHT_MOUSE_UP)
    button_code = RIGHT;
   
   Mouse[button_code] = -1;
  }
  
  private static function MouseMove(e:MouseEvent):void
  {
   mouse_dX = (int)(e.localX) - mouse_X;
   mouse_dY = (int)(e.localY) - mouse_Y;
   
   mouse_X = e.localX;
   mouse_Y = e.localY;
   
   mouse_moving = true;
  }
  
  public static function get Moving():Boolean
  {
   return mouse_moving;
  }
  
  public static function get X():int
  {
   return mouse_X;
  }
  
  public static function get Y():int
  {
   return mouse_Y;
  }
  
  public static function SetDeltaSign(flag:Boolean):void
  {
   mouse_delta_sign = flag;
  }
  
  public static function get DeltaX():int
  {
   return (mouse_delta_sign ? (mouse_dX < -1 ? -1 : mouse_dX > 1 ? 1 : 0) : mouse_dX);
  }
  
  public static function get DeltaY():int
  {
   return (mouse_delta_sign ? (mouse_dY < -1 ? -1 : mouse_dY > 1 ? 1 : 0) : mouse_dY);
  }
  
  public static function Update():void
  {
   for (var i:int = 0; i < 3; i++)
   {
    if (Mouse[i] > 0)
     Mouse[i] = 1;
    else
     Mouse[i] = 0;
   }
   
   mouse_moving = false;
   
   //reset delta sign
   mouse_dX = 0;
   mouse_dY = 0;
  }
 }
}

Usage Example
I use FlashDevelop :]
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
package 
{
 import flash.display.Sprite;
 import flash.events.Event;
 
 /**
  * ...
  * @author Zero
  */
 
 [SWF(backgroundColor='0x000000', frameRate='60')]
 public class Main extends Sprite 
 {
  public function Main():void 
  {
   if (stage) init();
   else addEventListener(Event.ADDED_TO_STAGE, init);
  }
  
  private function init(e:Event = null):void 
  {
   removeEventListener(Event.ADDED_TO_STAGE, init);
   // entry point

   Keyboard.Initialize(this);
   Mouse.Initialize(this);
   
   addEventListener(Event.ENTER_FRAME, Update);
  }
  
  private final function Update(e:Event):void
  {
   if (Keyboard[e2Key.D] == Keyboard.KEY_PRESSED)
    trace("Key Pressed");
   if (Keyboard[e2Key.D] == Keyboard.KEY_DOWN)
    trace("Key Down");
   if (Keyboard[e2Key.D] == Keyboard.KEY_RELEASED)
    trace("Key Released");
    
   //Get any key pressed
   if (Keyboard.Pressed())
   {
    trace(Keyboard.Pressed())
   }
    
   if (Mouse[0] == Mouse.BUTTON_PRESSED)
    trace("Left Mouse Pressed");
   if (Mouse[0] == Mouse.BUTTON_DOWN)
    trace("Left Mouse Down");
   if (Mouse[0] == Mouse.BUTTON_RELEASED)
    trace("Left Mouse Released");
    
   if (Mouse[1] == Mouse.BUTTON_PRESSED)
    trace("Middle Mouse Pressed");
   if (Mouse[1] == Mouse.BUTTON_DOWN)
    trace("Middle Mouse Down");
   if (Mouse[1] == Mouse.BUTTON_RELEASED)
    trace("Middle Mouse Released");
    
   if (Mouse[2] == Mouse.BUTTON_PRESSED)
    trace("Right Mouse Pressed");
   if (Mouse[2] == Mouse.BUTTON_DOWN)
    trace("Right Mouse Down");
   if (Mouse[2] == Mouse.BUTTON_RELEASED)
    trace("Right Mouse Released");
    
   if (Mouse.Moving)
   {
    trace("Mouse Delta X " + Mouse.DeltaX);
    trace("Mouse Delta Y " + Mouse.DeltaY);
   } 
   
   //update has to be after events else everything is reset.
   Keyboard.Update();
   Mouse.Update();
  }
 }
}

No comments :

Post a Comment