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.

169 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. let анимация = this.задано[имя]["анимация"];
  46. this.обновитьИзображение(производноеИмя, пр, вид, анимация);
  47. }
  48. };
  49. this.обработатьСобытие = function(событие)
  50. {
  51. let в = "виды/";
  52. let а = "анимации/";
  53. if (событие.startsWith(в))
  54. {
  55. let вид = событие.substring(в.length);
  56. this.обновитьОбъектыВида(вид);
  57. }
  58. else if (событие.startsWith(а))
  59. {
  60. let анимация = событие.substring(а.length);
  61. this.обновитьОбъектыАнимации(анимация);
  62. }
  63. };
  64. this.обновитьОбъектыАнимации = function(анимация)
  65. {
  66. for (let имя in this.задано)
  67. {
  68. let за = this.задано[имя];
  69. let зан = за["анимация"];
  70. if (зан && зан == анимация)
  71. {
  72. this.обновитьВидАнимацию(имя);
  73. }
  74. }
  75. };
  76. this.обновитьОбъектыВида = function(вид)
  77. {
  78. for (let имя in this.задано)
  79. {
  80. let за = this.задано[имя];
  81. let зви = за["вид"];
  82. if (зви && зви == вид)
  83. {
  84. this.обновитьВидАнимацию(имя);
  85. }
  86. }
  87. };
  88. this.обновитьВидАнимацию = function(имя)
  89. {
  90. let пр = this.пр(имя);
  91. let вид = this.задано[имя]["вид"];
  92. let анимация = this.задано[имя]["анимация"];
  93. let производноеИмя = `объекты-${имя}`;
  94. this.обновитьИзображение(производноеИмя, пр, вид, анимация);
  95. };
  96. this.обновитьИзображение = function(имя, пр, вид, анимация)
  97. {
  98. состояние.разобрать({
  99. изображения: {
  100. [имя]: {
  101. пр: пр,
  102. вид: вид,
  103. анимация: анимация,
  104. },
  105. },
  106. });
  107. };
  108. this.обновитьПозициюРазмер = function(имя, пр)
  109. {
  110. состояние.разобрать({
  111. тела: {
  112. [имя]: {
  113. пр: пр,
  114. },
  115. },
  116. });
  117. };
  118. this.обновитьСлежение = function(имя, пр)
  119. {
  120. состояние.разобрать({
  121. слежение: {
  122. [имя]: {
  123. изображение: имя,
  124. тело: имя,
  125. смещение: [-пр[2] / 2, -пр[3] / 2],
  126. },
  127. },
  128. });
  129. };
  130. this.обновитьФизику = function(имя, значение)
  131. {
  132. состояние.разобрать({
  133. тела: {
  134. [имя]: {
  135. физика: значение,
  136. },
  137. },
  138. });
  139. };
  140. this.пр = function(имя)
  141. {
  142. let за = this.задано[имя];
  143. let пр = this.умолчание.пр;
  144. return [
  145. за["пр.0"] ? за["пр.0"] : пр[0],
  146. за["пр.1"] ? за["пр.1"] : пр[1],
  147. за["пр.2"] ? за["пр.2"] : пр[2],
  148. за["пр.3"] ? за["пр.3"] : пр[3],
  149. ];
  150. };
  151. // Конструктор.
  152. this.создать();
  153. };