Created
September 30, 2014 19:33
-
-
Save YellowAfterlife/4034c19015d353fdf23f to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package openfl.state; | |
import openfl.events.Event; | |
import openfl.events.KeyboardEvent; | |
import openfl.Lib; | |
/** | |
* Provides a simple interface to get keyboard state. | |
* @author YellowAfterlife | |
*/ | |
class Keyboard { | |
private static var keyBound:Bool; | |
private static var keyPrev(default, null):KeyState; | |
private static var keyNext(default, null):KeyState; | |
public static var keyDown(default, null):KeyState; | |
public static var keyPressed(default, null):KeyState; | |
public static var keyReleased(default, null):KeyState; | |
private static function onFrame(_) { | |
var i:Int = 0; | |
while (i < 256) { | |
keyPrev.set(i, keyDown[i]); | |
keyDown.set(i, keyNext[i]); | |
i++; | |
} | |
i = 0; | |
while (i < 256) { | |
keyPressed.set(i, !keyPrev[i] && keyDown[i]); | |
keyReleased.set(i, keyPrev[i] && !keyDown[i]); | |
i++; | |
} | |
} | |
private static function onKeyDown(e:KeyboardEvent) keyNext.set(e.keyCode, true); | |
private static function onKeyUp(e:KeyboardEvent) keyNext.set(e.keyCode, false); | |
public static function bind() { | |
if (!keyBound) { | |
var stage = Lib.current.stage; | |
keyBound = true; | |
keyPrev = KeyState.create(); | |
keyNext = KeyState.create(); | |
keyDown = KeyState.create(); | |
keyPressed = KeyState.create(); | |
keyReleased = KeyState.create(); | |
stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown); | |
stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp); | |
stage.addEventListener(Event.ENTER_FRAME, onFrame); | |
} | |
} | |
// Buttons (kind of duplicate of flash.ui.Keyboard): | |
// Digits: | |
@:extern public static inline var NUMBER_0 = 48; | |
@:extern public static inline var NUMBER_1 = 49; | |
@:extern public static inline var NUMBER_2 = 50; | |
@:extern public static inline var NUMBER_3 = 51; | |
@:extern public static inline var NUMBER_4 = 52; | |
@:extern public static inline var NUMBER_5 = 53; | |
@:extern public static inline var NUMBER_6 = 54; | |
@:extern public static inline var NUMBER_7 = 55; | |
@:extern public static inline var NUMBER_8 = 56; | |
@:extern public static inline var NUMBER_9 = 57; | |
// Letters: | |
@:extern public static inline var A = 65; | |
@:extern public static inline var B = 66; | |
@:extern public static inline var C = 67; | |
@:extern public static inline var D = 68; | |
@:extern public static inline var E = 69; | |
@:extern public static inline var F = 70; | |
@:extern public static inline var G = 71; | |
@:extern public static inline var H = 72; | |
@:extern public static inline var I = 73; | |
@:extern public static inline var J = 74; | |
@:extern public static inline var K = 75; | |
@:extern public static inline var L = 76; | |
@:extern public static inline var M = 77; | |
@:extern public static inline var N = 78; | |
@:extern public static inline var O = 79; | |
@:extern public static inline var P = 80; | |
@:extern public static inline var Q = 81; | |
@:extern public static inline var R = 82; | |
@:extern public static inline var S = 83; | |
@:extern public static inline var T = 84; | |
@:extern public static inline var U = 85; | |
@:extern public static inline var V = 86; | |
@:extern public static inline var W = 87; | |
@:extern public static inline var X = 88; | |
@:extern public static inline var Y = 89; | |
@:extern public static inline var Z = 90; | |
// Numpad: | |
@:extern public static inline var NUMPAD_0 = 96; | |
@:extern public static inline var NUMPAD_1 = 97; | |
@:extern public static inline var NUMPAD_2 = 98; | |
@:extern public static inline var NUMPAD_3 = 99; | |
@:extern public static inline var NUMPAD_4 = 100; | |
@:extern public static inline var NUMPAD_5 = 101; | |
@:extern public static inline var NUMPAD_6 = 102; | |
@:extern public static inline var NUMPAD_7 = 103; | |
@:extern public static inline var NUMPAD_8 = 104; | |
@:extern public static inline var NUMPAD_9 = 105; | |
@:extern public static inline var NUMPAD_MULTIPLY = 106; | |
@:extern public static inline var NUMPAD_ADD = 107; | |
@:extern public static inline var NUMPAD_ENTER = 108; | |
@:extern public static inline var NUMPAD_SUBTRACT = 109; | |
@:extern public static inline var NUMPAD_DECIMAL = 110; | |
@:extern public static inline var NUMPAD_DIVIDE = 111; | |
// Function keys: | |
@:extern public static inline var F1 = 112; | |
@:extern public static inline var F2 = 113; | |
@:extern public static inline var F3 = 114; | |
@:extern public static inline var F4 = 115; | |
@:extern public static inline var F5 = 116; | |
@:extern public static inline var F6 = 117; | |
@:extern public static inline var F7 = 118; | |
@:extern public static inline var F8 = 119; | |
@:extern public static inline var F9 = 120; | |
@:extern public static inline var F10 = 121; | |
@:extern public static inline var F11 = 122; | |
@:extern public static inline var F12 = 123; | |
@:extern public static inline var F13 = 124; | |
@:extern public static inline var F14 = 125; | |
@:extern public static inline var F15 = 126; | |
// Main group: | |
@:extern public static inline var BACKSPACE = 8; | |
@:extern public static inline var TAB = 9; | |
@:extern public static inline var ENTER = 13; | |
@:extern public static inline var SHIFT = 16; | |
@:extern public static inline var CONTROL = 17; | |
@:extern public static inline var CAPS_LOCK = 18; | |
@:extern public static inline var ESCAPE = 27; | |
@:extern public static inline var SPACE = 32; | |
@:extern public static inline var PAGE_UP = 33; | |
@:extern public static inline var PAGE_DOWN = 34; | |
@:extern public static inline var END = 35; | |
@:extern public static inline var HOME = 36; | |
@:extern public static inline var LEFT = 37; | |
@:extern public static inline var RIGHT = 39; | |
@:extern public static inline var UP = 38; | |
@:extern public static inline var DOWN = 40; | |
@:extern public static inline var INSERT = 45; | |
@:extern public static inline var DELETE = 46; | |
@:extern public static inline var NUMLOCK = 144; | |
@:extern public static inline var BREAK = 19; | |
} | |
abstract KeyState(Array<Bool>) from Array<Bool> { | |
public var length(get, never):Int; | |
inline function get_length() return this.length; | |
@:arrayAccess inline function get(i:Int):Bool return this[i]; | |
@:allow(openfl.state.Keyboard) private inline function set(i:Int, v:Bool) return this[i] = v; | |
public static function create():KeyState { | |
var r:KeyState = [], i:Int = -1; | |
while (i < 256) { | |
r.set(i, false); | |
i++; | |
} | |
return r; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment