You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

107 lines
1.9 KiB

  1. define([
  2. 'js/resources',
  3. 'js/rendering/tileOpacity'
  4. ], function (
  5. resources,
  6. tileOpacity
  7. ) {
  8. let tileSize = 32;
  9. let width = 0;
  10. let height = 0;
  11. let canvas = null;
  12. let ctx = null;
  13. return {
  14. buildSprite: function (layers, maps, opacities) {
  15. width = maps[0].length;
  16. height = maps[0][0].length;
  17. if (canvas)
  18. canvas.remove();
  19. canvas = $('<canvas></canvas>')
  20. .appendTo('body')
  21. .css('display', 'none');
  22. canvas[0].width = width * tileSize;
  23. canvas[0].height = height * tileSize;
  24. ctx = canvas[0].getContext('2d');
  25. this.build(layers, maps, opacities);
  26. return canvas[0];
  27. },
  28. build: function (layers, maps, opacities) {
  29. let random = Math.random.bind(Math);
  30. for (let m = 0; m < maps.length; m++) {
  31. let map = maps[m];
  32. if (!map)
  33. continue;
  34. let layer = layers[m];
  35. let sprite = resources.sprites[layer].image;
  36. let opacity = opacities[m];
  37. for (let i = 0; i < width; i++) {
  38. let x = i * tileSize;
  39. for (let j = 0; j < height; j++) {
  40. let y = j * tileSize;
  41. let cell = map[i][j];
  42. if (cell == 0)
  43. continue;
  44. cell--;
  45. let tileY = ~~(cell / 8);
  46. let tileX = cell - (tileY * 8);
  47. let tileO = tileOpacity[layer];
  48. if (tileO) {
  49. if (tileO[cell])
  50. ctx.globalAlpha = tileO[cell];
  51. else
  52. ctx.globalAlpha = opacity;
  53. } else
  54. ctx.globalAlpha = opacity;
  55. if (random() > 0.5) {
  56. ctx.drawImage(
  57. sprite,
  58. tileX * tileSize,
  59. tileY * tileSize,
  60. tileSize,
  61. tileSize,
  62. x,
  63. y,
  64. tileSize,
  65. tileSize
  66. );
  67. } else {
  68. ctx.save();
  69. ctx.scale(-1, 1);
  70. ctx.drawImage(
  71. sprite,
  72. tileX * tileSize,
  73. tileY * tileSize,
  74. tileSize,
  75. tileSize,
  76. -x,
  77. y,
  78. -tileSize,
  79. tileSize
  80. );
  81. ctx.restore();
  82. }
  83. }
  84. }
  85. }
  86. }
  87. };
  88. });