From 05da6a78934fb80574de39207fda9dcd09500df7 Mon Sep 17 00:00:00 2001 From: Evert Prants Date: Sun, 19 Aug 2018 13:50:13 +0300 Subject: [PATCH] Keyboard handler --- dist/dwelibs.min.js | 2 +- src/index.js | 3 + src/keyboard.js | 136 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 140 insertions(+), 1 deletion(-) create mode 100644 src/keyboard.js diff --git a/dist/dwelibs.min.js b/dist/dwelibs.min.js index 3fa67b5..d4b4d13 100644 --- a/dist/dwelibs.min.js +++ b/dist/dwelibs.min.js @@ -1 +1 @@ -!function(t){var e={};function n(r){if(e[r])return e[r].exports;var i=e[r]={i:r,l:!1,exports:{}};return t[r].call(i.exports,i,i.exports,n),i.l=!0,i.exports}n.m=t,n.c=e,n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:r})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var i in t)n.d(r,i,function(e){return t[e]}.bind(null,i));return r},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=0)}([function(t,e,n){"use strict";window.DWE={};n(1),n(2),n(3),n(4)},function(t,e,n){"use strict";DWE.context=function(t){return t.star=function(e,n,r,i,o){var a=Math.PI/2*3,h=e,c=n,u=Math.PI/r;t.beginPath(),t.moveTo(e,n-i);for(var s=0;sthis.width/2+t.r)&&(!(e.y>this.height/2+t.r)&&(e.x<=this.width/2||(e.y<=this.height/2||Math.pow(e.x-this.width/2,2)+Math.pow(e.y-this.height/2,2)<=Math.pow(t.r,2))))}}]),t}(),DWE.Math.Circle=function(){function t(e,n,r){i(this,t),this.x=e,this.y=n,this.r=r}return r(t,[{key:"radius",get:function(){return this.r}}]),t}()},function(t,e,n){"use strict";DWE.getMousePosition=function(t,e){var n=void 0,r=void 0;if(t.changedTouches){var i=t.changedTouches[0];i&&(t.pageX=i.pageX,t.pageY=i.pageY)}return t.pageX||t.pageY?(n=t.pageX,r=t.pageY):(n=t.clientX+document.body.scrollLeft+document.documentElement.scrollLeft,r=t.clientY+document.body.scrollTop+document.documentElement.scrollTop),n-=e.offsetLeft,r-=e.offsetTop,new DWE.Math.Vector2(n,r)}},function(t,e,n){"use strict";DWE.Image={},DWE.Image.Image=function(t){var e=this;this.src=t,this.img=new Image,this.img.src=this.src,this.width=0,this.height=0,this.loaded=!1,this.errored=!1,this.img.onload=function(){e.loaded=!0,e.width=e.img.width,e.height=e.img.height,e.onload&&e.onload.apply(e,[])},this.img.onerror=function(t){e.loaded=!1,e.errored=!0,e.onerror&&e.onerror.apply(e,[t])}},DWE.Image.loadImageArray=function(t){return new Promise(function(e,n){var r=0,i=t.length,o=[];!function a(h){var c=t[h],u=new DWE.Image.Image(c);u.onload=function(){o.push(u),++r==i?e(o):a(r)},u.onerror=function(t){n(t)}}(r)})}}]); \ No newline at end of file +!function(t){var e={};function n(r){if(e[r])return e[r].exports;var o=e[r]={i:r,l:!1,exports:{}};return t[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=t,n.c=e,n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:r})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var o in t)n.d(r,o,function(e){return t[e]}.bind(null,o));return r},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=0)}([function(t,e,n){"use strict";window.DWE={};n(1),n(2),n(3),n(4),n(5)},function(t,e,n){"use strict";DWE.context=function(t){return t.star=function(e,n,r,o,i){var a=Math.PI/2*3,u=e,c=n,s=Math.PI/r;t.beginPath(),t.moveTo(e,n-o);for(var h=0;hthis.width/2+t.r)&&(!(e.y>this.height/2+t.r)&&(e.x<=this.width/2||(e.y<=this.height/2||Math.pow(e.x-this.width/2,2)+Math.pow(e.y-this.height/2,2)<=Math.pow(t.r,2))))}}]),t}(),DWE.Math.Circle=function(){function t(e,n,r){o(this,t),this.x=e,this.y=n,this.r=r}return r(t,[{key:"radius",get:function(){return this.r}}]),t}()},function(t,e,n){"use strict";DWE.getMousePosition=function(t,e){var n=void 0,r=void 0;if(t.changedTouches){var o=t.changedTouches[0];o&&(t.pageX=o.pageX,t.pageY=o.pageY)}return t.pageX||t.pageY?(n=t.pageX,r=t.pageY):(n=t.clientX+document.body.scrollLeft+document.documentElement.scrollLeft,r=t.clientY+document.body.scrollTop+document.documentElement.scrollTop),n-=e.offsetLeft,r-=e.offsetTop,new DWE.Math.Vector2(n,r)}},function(t,e,n){"use strict";DWE.Keyboard={};var r={},o={},i={backspace:8,tab:9,enter:13,shift:16,ctrl:17,alt:18,pausebreak:19,capslock:20,escape:27,pgup:33,pgdown:34,end:35,home:36,left:37,up:38,right:39,down:40,insert:45,delete:46,"left-window":91,"right-window":92,select:93,numpad0:96,numpad1:97,numpad2:98,numpad3:99,numpad4:100,numpad5:101,numpad6:102,numpad7:103,numpad8:104,numpad9:105,multiply:106,add:107,subtract:109,decimal:110,divide:111,f1:112,f2:113,f3:114,f4:115,f5:116,f6:117,f7:118,f8:119,f9:120,f10:121,f11:122,f12:123,numlock:144,scrolllock:145,"semi-colon":186,equals:187,comma:188,dash:189,period:190,fwdslash:191,grave:192,"open-bracket":219,bkslash:220,"close-braket":221,"single-quote":222};function a(t){return null!=r[t]&&r[t]}function u(t){return null!=o[t]&&o[t]}DWE.Keyboard.toggleKey=function(t,e){var n=null;for(var o in i){if(t===i[o]){n=o;break}}n||(n=String.fromCharCode(t).toLowerCase()),r[n]=!0===e},DWE.Keyboard.keyDown=function(t){var e;window.event?e=window.event.keyCode:t&&(e=t.which),DWE.Keyboard.toggleKey(e,!0)},DWE.Keyboard.keyUp=function(t){var e;window.event?e=window.event.keyCode:t&&(e=t.which),DWE.Keyboard.toggleKey(e,!1)},DWE.Keyboard.isDown=function(t){return a(t)&&u(t)},DWE.Keyboard.isUp=function(t){return!DWE.Keyboard.isDown(t)},DWE.Keyboard.isPressed=function(t){return!0===a(t)&&!1===u(t)},DWE.Keyboard.nextIteration=function(){for(var t in o={},r)!0===r[t]&&(o[t]=!0)}},function(t,e,n){"use strict";DWE.Image={},DWE.Image.Image=function(t){var e=this;this.src=t,this.img=new Image,this.img.src=this.src,this.width=0,this.height=0,this.loaded=!1,this.errored=!1,this.img.onload=function(){e.loaded=!0,e.width=e.img.width,e.height=e.img.height,e.onload&&e.onload.apply(e,[])},this.img.onerror=function(t){e.loaded=!1,e.errored=!0,e.onerror&&e.onerror.apply(e,[t])}},DWE.Image.loadImageArray=function(t){return new Promise(function(e,n){var r=0,o=t.length,i=[];!function a(u){var c=t[u],s=new DWE.Image.Image(c);s.onload=function(){i.push(s),++r==o?e(i):a(r)},s.onerror=function(t){n(t)}}(r)})}}]); \ No newline at end of file diff --git a/src/index.js b/src/index.js index 7c7aa89..5b629a5 100644 --- a/src/index.js +++ b/src/index.js @@ -9,5 +9,8 @@ require('./math.js') // Mouse helpers require('./mouse.js') +// Keyboard helpers +require('./keyboard.js') + // Image helpers require('./image.js') diff --git a/src/keyboard.js b/src/keyboard.js new file mode 100644 index 0000000..b6225b0 --- /dev/null +++ b/src/keyboard.js @@ -0,0 +1,136 @@ + +DWE.Keyboard = {} + +var keyList = {} +var previousKeyList = {} + +var specialKeyMap = { + 'backspace': 8, + 'tab': 9, + 'enter': 13, + 'shift': 16, + 'ctrl': 17, + 'alt': 18, + 'pausebreak': 19, + 'capslock': 20, + 'escape': 27, + 'pgup': 33, + 'pgdown': 34, + 'end': 35, + 'home': 36, + 'left': 37, + 'up': 38, + 'right': 39, + 'down': 40, + 'insert': 45, + 'delete': 46, + 'left-window': 91, + 'right-window': 92, + 'select': 93, + 'numpad0': 96, + 'numpad1': 97, + 'numpad2': 98, + 'numpad3': 99, + 'numpad4': 100, + 'numpad5': 101, + 'numpad6': 102, + 'numpad7': 103, + 'numpad8': 104, + 'numpad9': 105, + 'multiply': 106, + 'add': 107, + 'subtract': 109, + 'decimal': 110, + 'divide': 111, + 'f1': 112, + 'f2': 113, + 'f3': 114, + 'f4': 115, + 'f5': 116, + 'f6': 117, + 'f7': 118, + 'f8': 119, + 'f9': 120, + 'f10': 121, + 'f11': 122, + 'f12': 123, + 'numlock': 144, + 'scrolllock': 145, + 'semi-colon': 186, + 'equals': 187, + 'comma': 188, + 'dash': 189, + 'period': 190, + 'fwdslash': 191, + 'grave': 192, + 'open-bracket': 219, + 'bkslash': 220, + 'close-braket': 221, + 'single-quote': 222 +} + +DWE.Keyboard.toggleKey = function (keyCode, on) { + // Find key in special key list + var key = null + for (let k in specialKeyMap) { + let val = specialKeyMap[k] + if (keyCode === val) { + key = k + break + } + } + + // Use fromCharCode + if (!key) { + key = String.fromCharCode(keyCode).toLowerCase() + } + + keyList[key] = (on === true) +} + +DWE.Keyboard.keyDown = function (e) { + var keycode + if (window.event) + keycode = window.event.keyCode + else if (e) + keycode = e.which + DWE.Keyboard.toggleKey(keycode, true) +} + +DWE.Keyboard.keyUp = function (e) { + var keycode + if (window.event) + keycode = window.event.keyCode + else if (e) + keycode = e.which + DWE.Keyboard.toggleKey(keycode, false) +} + +function down (key) { + return keyList[key] != null ? keyList[key] : false +} + +function downLast (key) { + return previousKeyList[key] != null ? previousKeyList[key] : false +} + +DWE.Keyboard.isDown = function (key) { + return down(key) && downLast(key) +} + +DWE.Keyboard.isUp = function (key) { + return !DWE.Keyboard.isDown(key) +} + +DWE.Keyboard.isPressed = function (key) { + return down(key) === true && downLast(key) === false +} + +DWE.Keyboard.nextIteration = function () { + previousKeyList = {} + for (let k in keyList) { + if (keyList[k] === true) { + previousKeyList[k] = true + } + } +}