Blame view

js/threejs/THREEx_003.js 3.1 KB
670b6d6f8   tuan   2016/09/22 - Copy...
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
  // 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
  //
  
  /** @namespace */
  var 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,
  	'tab'		: 9
  };
  
  /**
   * 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;
  }