summaryrefslogtreecommitdiff
path: root/jaws/src/input.js
diff options
context:
space:
mode:
Diffstat (limited to 'jaws/src/input.js')
-rwxr-xr-xjaws/src/input.js286
1 files changed, 286 insertions, 0 deletions
diff --git a/jaws/src/input.js b/jaws/src/input.js
new file mode 100755
index 0000000..1c500f8
--- /dev/null
+++ b/jaws/src/input.js
@@ -0,0 +1,286 @@
+var jaws = (function(jaws) {
+
+ var pressed_keys = {}
+ var previously_pressed_keys = {}
+ var keycode_to_string = []
+ var on_keydown_callbacks = []
+ var on_keyup_callbacks = []
+ var mousebuttoncode_to_string = []
+ var ie_mousebuttoncode_to_string = []
+
+/** @private
+ * Map all javascript keycodes to easy-to-remember letters/words
+ */
+jaws.setupInput = function() {
+ var k = []
+
+ k[8] = "backspace"
+ k[9] = "tab"
+ k[13] = "enter"
+ k[16] = "shift"
+ k[17] = "ctrl"
+ k[18] = "alt"
+ k[19] = "pause"
+ k[20] = "capslock"
+ k[27] = "esc"
+ k[32] = "space"
+ k[33] = "pageup"
+ k[34] = "pagedown"
+ k[35] = "end"
+ k[36] = "home"
+ k[37] = "left"
+ k[38] = "up"
+ k[39] = "right"
+ k[40] = "down"
+ k[45] = "insert"
+ k[46] = "delete"
+
+ k[91] = "left_window_key leftwindowkey"
+ k[92] = "right_window_key rightwindowkey"
+ k[93] = "select_key selectkey"
+ k[106] = "multiply *"
+ k[107] = "add plus +"
+ k[109] = "subtract minus -"
+ k[110] = "decimalpoint"
+ k[111] = "divide /"
+
+ k[144] = "numlock"
+ k[145] = "scrollock"
+ k[186] = "semicolon ;"
+ k[187] = "equalsign ="
+ k[188] = "comma ,"
+ k[189] = "dash -"
+ k[190] = "period ."
+ k[191] = "forwardslash /"
+ k[192] = "graveaccent `"
+ k[219] = "openbracket ["
+ k[220] = "backslash \\"
+ k[221] = "closebracket ]"
+ k[222] = "singlequote '"
+
+ var m = []
+
+ m[0] = "left_mouse_button"
+ m[1] = "center_mouse_button"
+ m[2] = "right_mouse_button"
+
+ var ie_m = [];
+ ie_m[1] = "left_mouse_button";
+ ie_m[2] = "right_mouse_button";
+ ie_m[4] = "center_mouse_button";
+
+ mousebuttoncode_to_string = m
+ ie_mousebuttoncode_to_string = ie_m;
+
+
+ var numpadkeys = ["numpad0","numpad1","numpad2","numpad3","numpad4","numpad5","numpad6","numpad7","numpad8","numpad9"]
+ var fkeys = ["f1","f2","f3","f4","f5","f6","f7","f8","f9"]
+ var numbers = ["0","1","2","3","4","5","6","7","8","9"]
+ var letters = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"]
+ for(var i = 0; numbers[i]; i++) { k[48+i] = numbers[i] }
+ for(var i = 0; letters[i]; i++) { k[65+i] = letters[i] }
+ for(var i = 0; numpadkeys[i]; i++) { k[96+i] = numpadkeys[i] }
+ for(var i = 0; fkeys[i]; i++) { k[112+i] = fkeys[i] }
+
+ keycode_to_string = k
+
+ window.addEventListener("keydown", handleKeyDown)
+ window.addEventListener("keyup", handleKeyUp)
+
+ var jawswindow = jaws.canvas || jaws.dom
+ jawswindow.addEventListener("mousedown", handleMouseDown, false);
+ jawswindow.addEventListener("mouseup", handleMouseUp, false);
+ jawswindow.addEventListener("touchstart", handleTouchStart, false);
+ jawswindow.addEventListener("touchend", handleTouchEnd, false);
+
+ window.addEventListener("blur", resetPressedKeys, false);
+
+ // this turns off the right click context menu which screws up the mouseup event for button 2
+ document.oncontextmenu = function() {return false};
+}
+
+/** @private
+ * Reset input-hash. Called when game is blurred so a key-controlled player doesn't keep on moving when the game isn't focused.
+ */
+function resetPressedKeys(e) {
+ pressed_keys = {};
+}
+
+/** @private
+ * handle event "onkeydown" by remembering what key was pressed
+ */
+function handleKeyUp(e) {
+ event = (e) ? e : window.event
+ var human_names = keycode_to_string[event.keyCode].split(" ")
+ human_names.forEach( function(human_name) {
+ pressed_keys[human_name] = false
+ if(on_keyup_callbacks[human_name]) {
+ on_keyup_callbacks[human_name](human_name)
+ e.preventDefault()
+ }
+ if(prevent_default_keys[human_name]) { e.preventDefault() }
+ });
+}
+
+/** @private
+ * handle event "onkeydown" by remembering what key was un-pressed
+ */
+function handleKeyDown(e) {
+ event = (e) ? e : window.event
+ var human_names = keycode_to_string[event.keyCode].split(" ")
+ human_names.forEach( function(human_name) {
+ pressed_keys[human_name] = true
+ if(on_keydown_callbacks[human_name]) {
+ on_keydown_callbacks[human_name](human_name)
+ e.preventDefault()
+ }
+ if(prevent_default_keys[human_name]) { e.preventDefault() }
+ });
+}
+/** @private
+ * handle event "onmousedown" by remembering what button was pressed
+ */
+function handleMouseDown(e) {
+ event = (e) ? e : window.event
+ var human_name = mousebuttoncode_to_string[event.button] // 0 1 2
+ if (navigator.appName == "Microsoft Internet Explorer"){
+ human_name = ie_mousebuttoncode_to_string[event.button];
+ }
+ pressed_keys[human_name] = true
+ if(on_keydown_callbacks[human_name]) {
+ on_keydown_callbacks[human_name](human_name)
+ e.preventDefault()
+ }
+}
+
+
+/** @private
+ * handle event "onmouseup" by remembering what button was un-pressed
+ */
+function handleMouseUp(e) {
+ event = (e) ? e : window.event
+ var human_name = mousebuttoncode_to_string[event.button]
+
+ if (navigator.appName == "Microsoft Internet Explorer"){
+ human_name = ie_mousebuttoncode_to_string[event.button];
+ }
+ pressed_keys[human_name] = false
+ if(on_keyup_callbacks[human_name]) {
+ on_keyup_callbacks[human_name](human_name)
+ e.preventDefault()
+ }
+}
+
+/** @private
+ * handle event "touchstart" by remembering what button was pressed
+ */
+function handleTouchStart(e) {
+ event = (e) ? e : window.event
+ pressed_keys["left_mouse_button"] = true
+ jaws.mouse_x = e.touches[0].pageX - jaws.canvas.offsetLeft;
+ jaws.mouse_y = e.touches[0].pageY - jaws.canvas.offsetTop;
+ //e.preventDefault()
+}
+
+/** @private
+ * handle event "touchend" by remembering what button was pressed
+ */
+function handleTouchEnd(e) {
+ event = (e) ? e : window.event
+ pressed_keys["left_mouse_button"] = false
+ jaws.mouse_x = undefined;
+ jaws.mouse_y = undefined;
+
+}
+
+var prevent_default_keys = []
+/**
+ * Prevents default browseraction for given keys.
+ * @example
+ * jaws.preventDefaultKeys( ["down"] ) // Stop down-arrow-key from scrolling page down
+ */
+jaws.preventDefaultKeys = function(array_of_strings) {
+ var list = arguments;
+ if(list.length == 1 && jaws.isArray(list[0])) list = list[0];
+
+ for(var i=0; i < list.length; i++) {
+ prevent_default_keys[list[i]] = true;
+ }
+}
+
+/**
+ * Check if *keys* are pressed. Second argument specifies use of logical AND when checking multiple keys.
+ * @example
+ * jaws.pressed("left a"); // returns true if left arrow key OR a is pressed
+ * jaws.pressed("ctrl c", true); // returns true if ctrl AND a is pressed
+ */
+jaws.pressed = function(keys, logical_and) {
+ if(jaws.isString(keys)) { keys = keys.split(" ") }
+ if(logical_and) { return keys.every( function(key) { return pressed_keys[key] } ) }
+ else { return keys.some( function(key) { return pressed_keys[key] } ) }
+}
+
+/**
+ * Check if *keys* are pressed, but only return true Once for any given keys. Once keys have been released, pressedWithoutRepeat can return true again when keys are pressed.
+ * Second argument specifies use of logical AND when checking multiple keys.
+ * @example
+ * if(jaws.pressedWithoutRepeat("space")) { player.jump() } // with this in the gameloop player will only jump once even if space is held down
+ */
+jaws.pressedWithoutRepeat = function(keys, logical_and) {
+ if( jaws.pressed(keys, logical_and) ) {
+ if(!previously_pressed_keys[keys]) {
+ previously_pressed_keys[keys] = true
+ return true
+ }
+ }
+ else {
+ previously_pressed_keys[keys] = false
+ return false
+ }
+}
+
+/**
+ * sets up a callback for a key (or array of keys) to call when it's pressed down
+ *
+ * @example
+ * // call goLeft() when left arrow key is pressed
+ * jaws.on_keypress("left", goLeft)
+ *
+ * // call fireWeapon() when SPACE or CTRL is pressed
+ * jaws.on_keypress(["space","ctrl"], fireWeapon)
+ */
+jaws.on_keydown = function(key, callback) {
+ if(jaws.isArray(key)) {
+ for(var i=0; key[i]; i++) {
+ on_keydown_callbacks[key[i]] = callback
+ }
+ }
+ else {
+ on_keydown_callbacks[key] = callback
+ }
+}
+
+/**
+ * sets up a callback when a key (or array of keys) to call when it's released
+ */
+jaws.on_keyup = function(key, callback) {
+ if(jaws.isArray(key)) {
+ for(var i=0; key[i]; i++) {
+ on_keyup_callbacks[key[i]] = callback
+ }
+ }
+ else {
+ on_keyup_callbacks[key] = callback
+ }
+}
+
+/** @private
+ * Clean up all callbacks set by on_keydown / on_keyup
+ */
+jaws.clearKeyCallbacks = function() {
+ on_keyup_callbacks = []
+ on_keydown_callbacks = []
+}
+
+return jaws;
+})(jaws || {});