[29475] | 1 | /**
|
---|
| 2 | * @author Lee Stemkoski
|
---|
| 3 | *
|
---|
| 4 | * Usage:
|
---|
| 5 | * (1) create a global variable:
|
---|
| 6 | * var keyboard = new KeyboardState();
|
---|
| 7 | * (2) during main loop:
|
---|
| 8 | * keyboard.update();
|
---|
| 9 | * (3) check state of keys:
|
---|
| 10 | * keyboard.down("A") -- true for one update cycle after key is pressed
|
---|
| 11 | * keyboard.pressed("A") -- true as long as key is being pressed
|
---|
| 12 | * keyboard.up("A") -- true for one update cycle after key is released
|
---|
| 13 | *
|
---|
| 14 | * See KeyboardState.k object data below for names of keys whose state can be polled
|
---|
| 15 | */
|
---|
| 16 |
|
---|
| 17 | // initialization
|
---|
| 18 | KeyboardState = function()
|
---|
| 19 | {
|
---|
| 20 | // bind keyEvents
|
---|
| 21 | document.addEventListener("keydown", KeyboardState.onKeyDown, false);
|
---|
| 22 | document.addEventListener("keyup", KeyboardState.onKeyUp, false);
|
---|
| 23 | }
|
---|
| 24 |
|
---|
| 25 | ///////////////////////////////////////////////////////////////////////////////
|
---|
| 26 |
|
---|
| 27 | KeyboardState.k =
|
---|
| 28 | {
|
---|
| 29 | 8: "backspace", 9: "tab", 13: "enter", 16: "shift",
|
---|
| 30 | 17: "ctrl", 18: "alt", 27: "esc", 32: "space",
|
---|
| 31 | 33: "pageup", 34: "pagedown", 35: "end", 36: "home",
|
---|
| 32 | 37: "left", 38: "up", 39: "right", 40: "down",
|
---|
| 33 | 45: "insert", 46: "delete", 186: ";", 187: "=",
|
---|
| 34 | 188: ",", 189: "-", 190: ".", 191: "/",
|
---|
| 35 | 219: "[", 220: "\\", 221: "]", 222: "'"
|
---|
| 36 | }
|
---|
| 37 |
|
---|
| 38 | KeyboardState.status = {};
|
---|
| 39 |
|
---|
| 40 | KeyboardState.keyName = function ( keyCode )
|
---|
| 41 | {
|
---|
| 42 | return ( KeyboardState.k[keyCode] != null ) ?
|
---|
| 43 | KeyboardState.k[keyCode] :
|
---|
| 44 | String.fromCharCode(keyCode);
|
---|
| 45 | }
|
---|
| 46 |
|
---|
| 47 | KeyboardState.onKeyUp = function(event)
|
---|
| 48 | {
|
---|
| 49 | var key = KeyboardState.keyName(event.keyCode);
|
---|
| 50 | if ( KeyboardState.status[key] )
|
---|
| 51 | KeyboardState.status[key].pressed = false;
|
---|
| 52 | }
|
---|
| 53 |
|
---|
| 54 | KeyboardState.onKeyDown = function(event)
|
---|
| 55 | {
|
---|
| 56 | var key = KeyboardState.keyName(event.keyCode);
|
---|
| 57 | if ( !KeyboardState.status[key] )
|
---|
| 58 | KeyboardState.status[key] = { down: false, pressed: false, up: false, updatedPreviously: false };
|
---|
| 59 | }
|
---|
| 60 |
|
---|
| 61 | KeyboardState.prototype.update = function()
|
---|
| 62 | {
|
---|
| 63 | for (var key in KeyboardState.status)
|
---|
| 64 | {
|
---|
| 65 | // insure that every keypress has "down" status exactly once
|
---|
| 66 | if ( !KeyboardState.status[key].updatedPreviously )
|
---|
| 67 | {
|
---|
| 68 | KeyboardState.status[key].down = true;
|
---|
| 69 | KeyboardState.status[key].pressed = true;
|
---|
| 70 | KeyboardState.status[key].updatedPreviously = true;
|
---|
| 71 | }
|
---|
| 72 | else // updated previously
|
---|
| 73 | {
|
---|
| 74 | KeyboardState.status[key].down = false;
|
---|
| 75 | }
|
---|
| 76 |
|
---|
| 77 | // key has been flagged as "up" since last update
|
---|
| 78 | if ( KeyboardState.status[key].up )
|
---|
| 79 | {
|
---|
| 80 | delete KeyboardState.status[key];
|
---|
| 81 | continue; // move on to next key
|
---|
| 82 | }
|
---|
| 83 |
|
---|
| 84 | if ( !KeyboardState.status[key].pressed ) // key released
|
---|
| 85 | KeyboardState.status[key].up = true;
|
---|
| 86 | }
|
---|
| 87 | }
|
---|
| 88 |
|
---|
| 89 | KeyboardState.prototype.down = function(keyName)
|
---|
| 90 | {
|
---|
| 91 | return (KeyboardState.status[keyName] && KeyboardState.status[keyName].down);
|
---|
| 92 | }
|
---|
| 93 |
|
---|
| 94 | KeyboardState.prototype.pressed = function(keyName)
|
---|
| 95 | {
|
---|
| 96 | return (KeyboardState.status[keyName] && KeyboardState.status[keyName].pressed);
|
---|
| 97 | }
|
---|
| 98 |
|
---|
| 99 | KeyboardState.prototype.up = function(keyName)
|
---|
| 100 | {
|
---|
| 101 | return (KeyboardState.status[keyName] && KeyboardState.status[keyName].up);
|
---|
| 102 | }
|
---|
| 103 |
|
---|
| 104 | KeyboardState.prototype.debug = function()
|
---|
| 105 | {
|
---|
| 106 | var list = "Keys active: ";
|
---|
| 107 | for (var arg in KeyboardState.status)
|
---|
| 108 | list += " " + arg
|
---|
| 109 | console.log(list);
|
---|
| 110 | }
|
---|
| 111 |
|
---|
| 112 | /////////////////////////////////////////////////////////////////////////////// |
---|