Skip to content

Instantly share code, notes, and snippets.

@YellowAfterlife
Created September 30, 2014 19:33
Show Gist options
  • Save YellowAfterlife/4034c19015d353fdf23f to your computer and use it in GitHub Desktop.
Save YellowAfterlife/4034c19015d353fdf23f to your computer and use it in GitHub Desktop.
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