Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.
 
 
 

303 righe
5.9 KiB

  1. define([
  2. 'js/system/events',
  3. 'js/resources',
  4. 'js/rendering/tileOpacity',
  5. 'js/misc/physics',
  6. 'js/spriteBuilder'
  7. ], function(
  8. events,
  9. resources,
  10. tileOpacity,
  11. physics,
  12. spriteBuilder
  13. ) {
  14. return {
  15. map: null,
  16. mapSprite: null,
  17. //TEST: Remove
  18. visMap: null,
  19. pos: {
  20. x: 0,
  21. y: 0
  22. },
  23. moveTo: null,
  24. moveSpeed: 0,
  25. moveSpeedMax: 1.5,
  26. moveSpeedInc: 0.5,
  27. moveSpeedFlatten: 16,
  28. size: {
  29. x: 0,
  30. y: 0,
  31. },
  32. layers: {},
  33. tileSize: {
  34. w: 32,
  35. h: 32
  36. },
  37. zoneId: null,
  38. player: null,
  39. init: function() {
  40. events.on('onGetMap', this.onGetMap.bind(this));
  41. var canvas = $('.canvasContainer canvas');
  42. canvas.each(function(i, c) {
  43. c = $(c);
  44. if (!c.attr('layer'))
  45. return;
  46. this.layers[c.attr('layer')] = {
  47. canvas: c,
  48. ctx: c[0].getContext('2d')
  49. };
  50. c[0].width = this.size.x = $('body').width();
  51. c[0].height = this.size.y = $('body').height();
  52. c.css('z-index', i + 1);
  53. }.bind(this));
  54. this.layers.particles.ctx.globalCompositeOperation = 'lighter';
  55. $('.canvasContainer')
  56. .width(this.size.x)
  57. .height(this.size.y);
  58. },
  59. onGetMap: function(msg) {
  60. $('.canvasContainer')
  61. .removeClass('visible');
  62. setTimeout(function() {
  63. $('.canvasContainer').addClass('visible');
  64. }, 1000);
  65. if (this.zoneId != null) {
  66. events.emit('onRezone', this.zoneId);
  67. }
  68. this.zoneId = msg.zoneId;
  69. $('.canvasContainer').addClass('visible');
  70. this.map = msg.map;
  71. this.visMap = msg.visMap;
  72. physics.init(msg.collisionMap);
  73. msg.clientObjects.forEach(function(c) {
  74. c.zoneId = this.zoneId;
  75. events.emit('onGetObject', c);
  76. }, this);
  77. this.mapSprite = spriteBuilder.buildSprite(
  78. ['tiles', 'walls', 'objects'], [this.map['tiles'], this.map['walls'], this.map['objects']], [0.55, 0.85, 0.85]
  79. );
  80. },
  81. fadeOut: function() {
  82. $('.canvasContainer')
  83. .removeClass('visible');
  84. setTimeout(function() {
  85. $('.canvasContainer').addClass('visible');
  86. }, 1000);
  87. },
  88. setPosition: function(pos, instant) {
  89. if (instant) {
  90. this.fadeOut();
  91. this.moveTo = null;
  92. this.pos = pos;
  93. return;
  94. }
  95. this.moveTo = pos;
  96. },
  97. clear: function(filter) {
  98. for (var l in this.layers) {
  99. var ctx = this.layers[l].ctx;
  100. ctx.save();
  101. ctx.setTransform(1, 0, 0, 1, 0, 0);
  102. ctx.clearRect(0, 0, this.size.x, this.size.y);
  103. ctx.restore();
  104. }
  105. },
  106. begin: function() {
  107. if (this.moveTo) {
  108. var deltaX = this.moveTo.x - this.pos.x;
  109. var deltaY = this.moveTo.y - this.pos.y;
  110. if ((deltaX != 0) || (deltaY != 0)) {
  111. var moveSpeed = this.moveSpeed;
  112. var distance = Math.max(Math.abs(deltaX), Math.abs(deltaY));
  113. if (moveSpeed > distance)
  114. moveSpeed = distance;
  115. if (distance > this.moveSpeedFlatten) {
  116. var maxSpeed = this.moveSpeedMax;
  117. if (distance > 64) {
  118. maxSpeed += (distance - 64) / 1000;
  119. }
  120. if (this.moveSpeed < maxSpeed)
  121. this.moveSpeed += this.moveSpeedInc;
  122. }
  123. deltaX = (deltaX / distance) * moveSpeed;
  124. deltaY = (deltaY / distance) * moveSpeed;
  125. this.pos.x = this.pos.x + (deltaX);
  126. this.pos.y = this.pos.y + (deltaY);
  127. } else {
  128. this.moveSpeed = 0;
  129. this.moveTo = null;
  130. }
  131. }
  132. for (var l in this.layers) {
  133. var ctx = this.layers[l].ctx;
  134. ctx.save();
  135. ctx.translate(-~~this.pos.x, -~~this.pos.y);
  136. }
  137. },
  138. end: function() {
  139. for (var l in this.layers) {
  140. var ctx = this.layers[l].ctx;
  141. ctx.restore();
  142. }
  143. },
  144. renderMap: function() {
  145. if (!this.player)
  146. return;
  147. this.layers['tiles'].ctx.drawImage(
  148. this.mapSprite,
  149. this.pos.x,
  150. this.pos.y,
  151. this.size.x,
  152. this.size.y,
  153. this.pos.x,
  154. this.pos.y,
  155. this.size.x,
  156. this.size.y
  157. );
  158. },
  159. renderObject: function(obj) {
  160. if (!this.player)
  161. return;
  162. var x = obj.x;
  163. var y = obj.y;
  164. var pX = this.player.x;
  165. var pY = this.player.y;
  166. var dx = Math.abs(x - pX);
  167. var dy = Math.abs(y - pY);
  168. var dxMax = (this.size.x / 64) + 4;
  169. var dyMax = (this.size.y / 64) + 4;
  170. if ((dx > dxMax) || (dy > dyMax))
  171. return;
  172. var sprite = resources.sprites[obj.sheetName].image;
  173. var ctx = this.layers[obj.layerName || obj.sheetName].ctx;
  174. var tileY = ~~(obj.cell / 8);
  175. var tileX = obj.cell - (tileY * 8);
  176. var offsetX = obj.offsetX || 0;
  177. var offsetY = obj.offsetY || 0;
  178. var alpha = 1;
  179. if (obj.alpha != null)
  180. alpha = obj.alpha;
  181. ctx.globalAlpha = alpha;
  182. var size = obj.size || 32;
  183. if (obj.flipX) {
  184. ctx.save();
  185. ctx.scale(-1, 1);
  186. ctx.drawImage(
  187. sprite,
  188. tileX * 32,
  189. tileY * 32,
  190. 32,
  191. 32,
  192. -(x * 32) - (~~(offsetX / 4) * 4),
  193. (y * 32) + (~~(offsetY / 4) * 4),
  194. -32,
  195. 32
  196. );
  197. ctx.restore();
  198. }
  199. else if (obj.flipY) {
  200. ctx.save();
  201. ctx.scale(1, -1);
  202. ctx.drawImage(
  203. sprite,
  204. tileX * 32,
  205. tileY * 32,
  206. 32,
  207. 32,
  208. (x * 32) - (~~(offsetX / 4) * 4),
  209. -(y * 32) + (~~(offsetY / 4) * 4),
  210. 32,
  211. -32
  212. );
  213. ctx.restore();
  214. } else
  215. ctx.drawImage(sprite, tileX * size, tileY * size, size, size, (x * 32) + (~~(offsetX / 4) * 4), (y * 32) + (~~(offsetY / 4) * 4), size, size);
  216. },
  217. renderRect: function(layer, x, y, color) {
  218. if (!this.player)
  219. return;
  220. var pX = this.player.x;
  221. var pY = this.player.y;
  222. var dx = Math.abs(x - pX);
  223. var dy = Math.abs(y - pY);
  224. var dxMax = (this.size.x / 64) + 4;
  225. var dyMax = (this.size.y / 64) + 4;
  226. if ((dx > dxMax) || (dy > dyMax))
  227. return;
  228. var ctx = this.layers[layer].ctx;
  229. ctx.fillStyle = color;
  230. ctx.fillRect(x * 32, y * 32, 32, 32);
  231. },
  232. renderText: function(layer, text, x, y) {
  233. var ctx = this.layers[layer].ctx;
  234. ctx.fillStyle = 'white';
  235. ctx.fillText(text, x, y);
  236. },
  237. renderOutlineText: function(layer, text, x, y, centerX) {
  238. var ctx = this.layers[layer].ctx;
  239. ctx.lineWidth = 2;
  240. if (centerX)
  241. x -= (ctx.measureText(text).width / 2);
  242. ctx.strokeText(text, x, y);
  243. ctx.fillText(text, x, y);
  244. }
  245. };
  246. });