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.
 
 
 

174 lines
3.2 KiB

  1. define([
  2. 'js/components/components',
  3. 'js/renderer',
  4. 'js/system/events'
  5. ], function(
  6. components,
  7. renderer,
  8. events
  9. ) {
  10. var scale = 40;
  11. var scaleMult = 5;
  12. return {
  13. components: [],
  14. offsetX: 0,
  15. offsetY: 0,
  16. eventCallbacks: {},
  17. addComponent: function(type, options) {
  18. var c = this[type];
  19. if ((!c) || (options.new)) {
  20. var template = components.getTemplate(type);
  21. if (!template)
  22. return;
  23. c = $.extend(true, {}, template);
  24. c.obj = this;
  25. for (var o in options) {
  26. c[o] = options[o];
  27. }
  28. //Only use component to initialize other components?
  29. if ((c.init) && (c.init(options)))
  30. return null;
  31. this[c.type] = c;
  32. this.components.push(c);
  33. return c;
  34. }
  35. else {
  36. if (c.extend)
  37. c.extend(options);
  38. return c;
  39. }
  40. },
  41. removeComponent: function(type) {
  42. var cpn = this[type];
  43. if (!cpn)
  44. return;
  45. this.components.spliceWhere(function(c) {
  46. return (c == cpn);
  47. });
  48. delete this[type];
  49. },
  50. render: function() {
  51. return;
  52. if (this.sheetName)
  53. canvas.renderObject(this);
  54. var components = this.components;
  55. var len = components.length;
  56. for (var i = 0; i < len; i++) {
  57. var c = components[i];
  58. if (c.render)
  59. c.render();
  60. }
  61. },
  62. update: function() {
  63. var components = this.components;
  64. var len = components.length;
  65. for (var i = 0; i < len; i++) {
  66. var c = components[i];
  67. if (c.update)
  68. c.update();
  69. if (c.destroyed) {
  70. if (c.destroy)
  71. c.destroy();
  72. components.splice(i, 1);
  73. i--;
  74. len--;
  75. delete this[c.type];
  76. }
  77. }
  78. },
  79. on: function(event, callback) {
  80. var list = this.eventCallbacks[event] || (this.eventCallbacks[event] = []);
  81. list.push(events.on(event, callback));
  82. },
  83. setSpritePosition: function() {
  84. if (!this.sprite)
  85. return;
  86. this.sprite.x = (this.x * scale) + (this.flipX ? scale : 0) + this.offsetX;
  87. var oldY = this.sprite.x;
  88. this.sprite.y = (this.y * scale) + this.offsetY;
  89. if (this.sprite.width > scale) {
  90. if (this.flipX)
  91. this.sprite.x += scale;
  92. else
  93. this.sprite.x -= scale;
  94. this.sprite.y -= (scale * 2);
  95. }
  96. if (oldY != this.sprite.y)
  97. renderer.reorder();
  98. this.sprite.scale.x = (this.flipX ? -scaleMult : scaleMult);
  99. ['nameSprite', 'chatSprite'].forEach(function(s, i) {
  100. var sprite = this[s];
  101. if (!sprite)
  102. return;
  103. var yAdd = scale;
  104. if (i == 1)
  105. yAdd *= -0.8;
  106. sprite.x = (this.x * scale) + (scale / 2) - (sprite.width / 2);
  107. sprite.y = (this.y * scale) + yAdd;
  108. }, this);
  109. if (this.stats)
  110. this.stats.updateHpSprite();
  111. },
  112. destroy: function() {
  113. if (this.sprite)
  114. renderer.destroyObject(this);
  115. if (this.nameSprite)
  116. renderer.destroyObject({
  117. layerName: 'effects',
  118. sprite: this.nameSprite
  119. });
  120. var components = this.components;
  121. var cLen = components.length;
  122. for (var i = 0; i < cLen; i++) {
  123. var c = components[i];
  124. if (c.destroy)
  125. c.destroy();
  126. }
  127. this.destroyed = true;
  128. this.offEvents();
  129. },
  130. offEvents: function() {
  131. if (this.pather)
  132. this.pather.onDeath();
  133. for (var e in this.eventCallbacks) {
  134. this.eventCallbacks[e].forEach(function(c) {
  135. events.off(e, c);
  136. }, this);
  137. }
  138. }
  139. };
  140. });