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.

171 lines
5.5KB

  1. function Объекты(состояние, события)
  2. {
  3. this.создать = function()
  4. {
  5. this.умолчание = {
  6. пр: [0, 0, 40, 20],
  7. };
  8. this.задано = {};
  9. события.подписать(this);
  10. };
  11. // Ключи и события.
  12. this.обработатьКлюч = function(ключ, путь, значение)
  13. {
  14. if (путь[0] != "объекты")
  15. {
  16. return;
  17. }
  18. let имя = путь[1];
  19. let свойство = путь.slice(2).join(".");
  20. if (!this.задано[имя])
  21. {
  22. this.задано[имя] = {};
  23. }
  24. this.задано[имя][свойство] = значение;
  25. let производноеИмя = `объекты-${имя}`;
  26. if (свойство.startsWith("пр."))
  27. {
  28. let пр = this.пр(имя);
  29. this.обновитьПозициюРазмер(производноеИмя, пр);
  30. this.обновитьСлежение(производноеИмя, пр);
  31. let вид = this.задано[имя]["вид"];
  32. let анимация = this.задано[имя]["анимация"];
  33. this.обновитьИзображение(производноеИмя, пр, вид, анимация);
  34. }
  35. else if (свойство == "физика")
  36. {
  37. this.обновитьФизику(производноеИмя, значение);
  38. }
  39. else if (
  40. свойство == "вид" ||
  41. свойство == "анимация"
  42. ) {
  43. let вид = this.задано[имя]["вид"];
  44. let анимация = this.задано[имя]["анимация"];
  45. this.обновитьИзображение(производноеИмя, null, вид, анимация);
  46. }
  47. };
  48. this.обработатьСобытие = function(событие)
  49. {
  50. let в = "виды/";
  51. let а = "анимации/";
  52. if (событие.startsWith(в))
  53. {
  54. let вид = событие.substring(в.length);
  55. this.обновитьОбъектыВида(вид);
  56. }
  57. else if (событие.startsWith(а))
  58. {
  59. let анимация = событие.substring(а.length);
  60. this.обновитьОбъектыАнимации(анимация);
  61. }
  62. };
  63. this.обновитьОбъектыАнимации = function(анимация)
  64. {
  65. for (let имя in this.задано)
  66. {
  67. let за = this.задано[имя];
  68. let зан = за["анимация"];
  69. if (зан && зан == анимация)
  70. {
  71. this.обновитьВидАнимацию(имя);
  72. }
  73. }
  74. };
  75. this.обновитьОбъектыВида = function(вид)
  76. {
  77. for (let имя in this.задано)
  78. {
  79. let за = this.задано[имя];
  80. let зви = за["вид"];
  81. if (зви && зви == вид)
  82. {
  83. this.обновитьВидАнимацию(имя);
  84. }
  85. }
  86. };
  87. this.обновитьВидАнимацию = function(имя)
  88. {
  89. let вид = this.задано[имя]["вид"];
  90. let анимация = this.задано[имя]["анимация"];
  91. let производноеИмя = `объекты-${имя}`;
  92. this.обновитьИзображение(производноеИмя, null, вид, анимация);
  93. };
  94. this.обновитьИзображение = function(имя, пр, вид, анимация)
  95. {
  96. var описание = {
  97. вид: вид,
  98. анимация: анимация,
  99. };
  100. if (пр)
  101. {
  102. описание["пр"] = пр;
  103. }
  104. состояние.разобрать({
  105. изображения: {
  106. [имя]: описание,
  107. },
  108. });
  109. };
  110. this.обновитьПозициюРазмер = function(имя, пр)
  111. {
  112. состояние.разобрать({
  113. тела: {
  114. [имя]: {
  115. пр: пр,
  116. },
  117. },
  118. });
  119. };
  120. this.обновитьСлежение = function(имя, пр)
  121. {
  122. состояние.разобрать({
  123. слежение: {
  124. [имя]: {
  125. изображение: имя,
  126. тело: имя,
  127. смещение: [-пр[2] / 2, -пр[3] / 2],
  128. },
  129. },
  130. });
  131. };
  132. this.обновитьФизику = function(имя, значение)
  133. {
  134. состояние.разобрать({
  135. тела: {
  136. [имя]: {
  137. физика: значение,
  138. },
  139. },
  140. });
  141. };
  142. this.пр = function(имя)
  143. {
  144. let за = this.задано[имя];
  145. let пр = this.умолчание.пр;
  146. return [
  147. за["пр.0"] ? за["пр.0"] : пр[0],
  148. за["пр.1"] ? за["пр.1"] : пр[1],
  149. за["пр.2"] ? за["пр.2"] : пр[2],
  150. за["пр.3"] ? за["пр.3"] : пр[3],
  151. ];
  152. };
  153. // Конструктор.
  154. this.создать();
  155. };