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 | /////////////////////////////////////////////////////////////////////////////// |
---|