-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathTHREEx.KeyboardState.js
130 lines (118 loc) · 3.47 KB
/
THREEx.KeyboardState.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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/*
* THREEx.KeyboardState.js keep the current state of the keyboard.
* It is possible to query it at any time. No need of an event.
* This is particularly convenient in loop driven case, like in
* 3D demos or games.
*
* # Usage
*
* **Step 1**: Create the object
*
* ```var keyboard = new THREEx.KeyboardState();```
*
* **Step 2**: Query the keyboard state
*
* This will return true if shift and A are pressed, false otherwise
*
* ```keyboard.pressed("shift+A")```
*
* **Step 3**: Stop listening to the keyboard
*
* ```keyboard.destroy()```
*
* NOTE: this library may be nice as standaline. independant from three.js
* - rename it keyboardForGame
*
* # Code
*
*/
define(function () {
/** @namespace */
var THREEx = THREEx || {};
window.THREEx = THREEx;
/**
* - NOTE: it would be quite easy to push event-driven too
* - microevent.js for events handling
* - in this._onkeyChange, generate a string from the DOM event
* - use this as event name
*/
THREEx.KeyboardState = function () {
// to store the current state
this.keyCodes = {};
this.modifiers = {};
// create callback to bind/unbind keyboard events
var self = this;
this._onKeyDown = function (event){
self._onKeyChange(event, true);
};
this._onKeyUp = function (event){
self._onKeyChange(event, false);
};
// bind keyEvents
document.addEventListener("keydown", this._onKeyDown, false);
document.addEventListener("keyup", this._onKeyUp, false);
};
/**
* To stop listening of the keyboard events
*/
THREEx.KeyboardState.prototype.destroy = function () {
// unbind keyEvents
document.removeEventListener("keydown", this._onKeyDown, false);
document.removeEventListener("keyup", this._onKeyUp, false);
};
THREEx.KeyboardState.MODIFIERS = ['shift', 'ctrl', 'alt', 'meta'];
THREEx.KeyboardState.ALIAS = {
'left': 37,
'up': 38,
'right': 39,
'down': 40,
'space': 32,
'pageup': 33,
'pagedown': 34,
'enter': 13,
'tab': 9,
'escape': 27
};
/**
* to process the keyboard dom event
*/
THREEx.KeyboardState.prototype._onKeyChange = function (event, pressed) {
/*
* log to debug
* console.log("onKeyChange", event, pressed, event.keyCode, event.shiftKey, event.ctrlKey, event.altKey, event.metaKey)
*/
// update this.keyCodes
var keyCode = event.keyCode;
this.keyCodes[keyCode] = pressed;
// update this.modifiers
this.modifiers['shift'] = event.shiftKey;
this.modifiers['ctrl'] = event.ctrlKey;
this.modifiers['alt'] = event.altKey;
this.modifiers['meta'] = event.metaKey;
};
/**
* query keyboard state to know if a key is pressed of not
*
* @param {String} keyDesc the description of the key. format : modifiers+key e.g shift+A
* @returns {Boolean} true if the key is pressed, false otherwise
*/
THREEx.KeyboardState.prototype.pressed = function (keyDesc) {
var keys = keyDesc.split("+");
for (var i = 0; i < keys.length; i++){
var key = keys[i];
var pressed;
if ( THREEx.KeyboardState.MODIFIERS.indexOf( key ) !== -1 ){
pressed = this.modifiers[key];
} else if ( Object.keys(THREEx.KeyboardState.ALIAS).indexOf( key ) != -1 ){
pressed = this.keyCodes[ THREEx.KeyboardState.ALIAS[key] ];
} else {
pressed = this.keyCodes[key.toUpperCase().charCodeAt(0)];
}
if ( !pressed){
return false;
}
}
return true;
};
return THREEx;
});