diff options
Diffstat (limited to 'jaws/src/input.js')
| -rwxr-xr-x | jaws/src/input.js | 286 |
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 || {}); |
