forked from jeremyckahn/keydrown
-
Notifications
You must be signed in to change notification settings - Fork 0
/
kd.core.js
94 lines (70 loc) · 1.83 KB
/
kd.core.js
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
var kd = (function (keysDown) {
'use strict';
var kd = {};
kd.Key = Key;
var isRunning = false;
/**
* Evaluate which keys are held down and invoke their handler functions.
*/
kd.tick = function () {
var i, len = keysDown.length;
for (i = 0; i < len; i++) {
var keyCode = keysDown[i];
var keyName = TRANSPOSED_KEY_MAP[keyCode];
if (keyName) {
kd[keyName].down();
}
}
};
/**
* A basic run loop. `handler` gets called approximately 60 times a second.
*
* @param {function} handler The function to call on every tick. You almost certainly want to call `kd.tick` in this function.
*/
kd.run = function (handler) {
isRunning = true;
util.requestAnimationFrame.call(window, function () {
if (!isRunning) {
return;
}
kd.run(handler);
handler();
});
};
/**
* Cancels the loop created by [`kd.run`](#run).
*/
kd.stop = function () {
isRunning = false;
};
// SETUP
//
// Initialize the KEY Objects
util.forEach(KEY_MAP, function (keyCode, keyName) {
kd[keyName] = new Key();
});
util.documentOn('keydown', function (evt) {
var keyCode = evt.keyCode;
var keyName = TRANSPOSED_KEY_MAP[keyCode];
var isNew = util.pushUnique(keysDown, keyCode);
if (isNew && kd[keyName]) {
kd[keyName].press();
}
});
util.documentOn('keyup', function (evt) {
var keyCode = util.removeValue(keysDown, evt.keyCode);
var keyName = TRANSPOSED_KEY_MAP[keyCode];
if (keyName) {
kd[keyName].up();
}
});
// Stop firing the "down" handlers if the user loses focus of the browser
// window.
util.documentOn('blur', function (evt) {
keysDown.length = 0;
});
return kd;
/*!
* The variables passed into the closure here are defined in kd.key.js.
*/ /*!*/
}(keysDown));