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.

197 lines
6.5KB

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