A pixel art painter geared specifically at NES pixel art. Includes export for .chr binary file as well as palette and namespace data.
Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

109 lines
2.7KB

  1. function isElement(el){
  2. // Code based on...
  3. // https://stackoverflow.com/questions/384286/javascript-isdom-how-do-you-check-if-a-javascript-object-is-a-dom-object
  4. try {
  5. // Using W3 DOM2 (works for FF, Opera and Chrome)
  6. return el instanceof HTMLElement;
  7. } catch(e) {
  8. // Browsers not supporting W3 DOM2 don't have HTMLElement and
  9. // an exception is thrown and we end up here. Testing some
  10. // properties that all elements have (works on IE7)
  11. return (typeof(el) === "object") &&
  12. (el.nodeType === 1) &&
  13. (typeof(el.style) === "object") &&
  14. (typeof(el.ownerDocument) === "object");
  15. }
  16. }
  17. const utils = {
  18. isInt:function(v){
  19. if (isNaN(v)){
  20. return false;
  21. }
  22. var x = parseFloat(v);
  23. return (x | 0) === x;
  24. },
  25. isElement:isElement,
  26. addEventListeners(el, listeners){
  27. if (!isElement(el))
  28. throw new TypeError("Can only attach listeners to HTMLElement objects.");
  29. Objects.keys(listeners).forEach((key) => {
  30. el.addEventListener(key, listeners[key]);
  31. });
  32. },
  33. addListenerToEvents(el, enames, listener){
  34. if (!isElement(el))
  35. throw new TypeError("Can only attach listeners to HTMLElement objects.");
  36. if (!(enames instanceof Array))
  37. throw new TypeError("Expected an array of event name strings.");
  38. if (typeof(listener) !== 'function')
  39. throw new TypeError("Listener expected to be a function.");
  40. enames.forEach((name) => {
  41. el.addEventListener(name, listener);
  42. });
  43. },
  44. range:function(a, b, step){
  45. var arr = [];
  46. if (!isNaN(a) && !isNaN(b)){
  47. if (a == b || step < 0){
  48. arr.push(a);
  49. } else {
  50. if (a < b){
  51. for (var i=a; i <= b; i+=step)
  52. arr.push(i);
  53. } else {
  54. for (var i=a; i >= b; i-=step)
  55. arr.push(i);
  56. }
  57. }
  58. }
  59. return arr;
  60. },
  61. debounce:function(func, delay, scope){
  62. var timeout = null;
  63. return function(){
  64. //var context = this;
  65. var context = scope || this;
  66. var args = arguments;
  67. clearTimeout(timeout);
  68. timeout = setTimeout(function(){
  69. func.apply(context, args);
  70. }, delay);
  71. };
  72. },
  73. throttle:function(func, threshold, scope){
  74. threshold || (threshold = 250);
  75. var lst = 0;
  76. var timer;
  77. return function(){
  78. var context = scope || this;
  79. var args = arguments;
  80. var now = Date.now();
  81. if (now < lst + threshold){
  82. clearTimeout(timer);
  83. timer = setTimeout(function(){
  84. lst = now;
  85. func.apply(context, args);
  86. }, threshold);
  87. } else {
  88. lst = now;
  89. func.apply(context, args);
  90. }
  91. };
  92. }
  93. };
  94. Object.freeze(utils);
  95. export default utils;