Основа Маджонга | Mahjong's base
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.

282 lines
7.7KB

  1. const ИМЯ = "ОМ | MB";
  2. const ИМЯ_МОДУЛЯ_РЕСУРСОВ = "Ресурсы Маджонга | Mahjong resources";
  3. // // // //
  4. ОтобразитьРаскладкуПоследовательноСоВсемиТекстурами = мир =>
  5. {
  6. var границы = мир.фишка.geometry.boundingBox;
  7. var размеры = [
  8. (границы.max.x - границы.min.x) / 2,
  9. (границы.max.z - границы.min.z) / 2,
  10. границы.max.y - границы.min.y,
  11. ];
  12. const позиции = мир.раскладкаKMahjongg.позиции;
  13. мир.фишки = [];
  14. for (var номер in позиции)
  15. {
  16. // Модель.
  17. var фишка = мир.фишка.clone();
  18. мир.фишки.push(фишка);
  19. мир.корень.add(фишка);
  20. // Расположение.
  21. var позиция = позиции[номер];
  22. var слой = позиция[0];
  23. var ряд = позиция[1];
  24. var столбец = позиция[2];
  25. фишка.position.x = столбец * размеры[0];
  26. фишка.position.z = ряд * размеры[1];
  27. фишка.position.y = слой;
  28. // Текстура.
  29. var номерТекстуры = номер % 42;
  30. // Потому что текстуры с индекса 1 начинаются.
  31. номерТекстуры += 1;
  32. var текстура = мир.текстурыТемФишек["отладочная|debug"][номерТекстуры];
  33. var материал = new THREE.MeshLambertMaterial({map: текстура});
  34. фишка.material = материал;
  35. }
  36. };
  37. // // // //
  38. ВывестиФактЗагрузкиТемыФишекМаджонга = мир =>
  39. {
  40. console.debug("ВывестиФактЗагрузкиТемыФишекМаджонга");
  41. };
  42. // // // //
  43. ЗадатьТемуФишекДляЗагрузки = мир =>
  44. {
  45. мир.темаФишек = "отладочная|debug";
  46. };
  47. // // // //
  48. ЦентрироватьСцену = мир =>
  49. {
  50. var мин = {
  51. "x": 0,
  52. "z": 0,
  53. };
  54. var макс = {
  55. "x": 0,
  56. "z": 0,
  57. };
  58. for (var номер in мир.фишки)
  59. {
  60. const фишка = мир.фишки[номер];
  61. if (фишка.position.x < мин.x)
  62. {
  63. мин.x = фишка.position.x;
  64. }
  65. if (фишка.position.x > макс.x)
  66. {
  67. макс.x = фишка.position.x;
  68. }
  69. if (фишка.position.z < мин.z)
  70. {
  71. мин.z = фишка.position.z;
  72. }
  73. if (фишка.position.z > макс.z)
  74. {
  75. макс.z = фишка.position.z;
  76. }
  77. }
  78. мир.корень.position.x -= (макс.x - мин.x) / 2;
  79. мир.корень.position.z -= (макс.z - мин.z) / 2;
  80. };
  81. // // // //
  82. ОтобразитьРаскладкуОднойФишкой = мир =>
  83. {
  84. var границы = мир.фишка.geometry.boundingBox;
  85. var размеры = [
  86. (границы.max.x - границы.min.x) / 2,
  87. (границы.max.z - границы.min.z) / 2,
  88. границы.max.y - границы.min.y,
  89. ];
  90. const позиции = мир.раскладкаKMahjongg.позиции;
  91. мир.фишки = [];
  92. for (var номер in позиции)
  93. {
  94. var фишка = мир.фишка.clone();
  95. мир.фишки.push(фишка);
  96. мир.корень.add(фишка);
  97. var позиция = позиции[номер];
  98. var слой = позиция[0];
  99. var ряд = позиция[1];
  100. var столбец = позиция[2];
  101. фишка.position.x = столбец * размеры[0];
  102. фишка.position.z = ряд * размеры[1];
  103. фишка.position.y = слой;
  104. }
  105. };
  106. // // // //
  107. ЗагрузитьРаскладку = мир =>
  108. {
  109. var модуль = мир.модули.модульПоИмени(ИМЯ_МОДУЛЯ_РЕСУРСОВ);
  110. //var ресурс = "/cat.layout";
  111. var ресурс = "/X_shaped.layout";
  112. var содержимое = модуль.содержимое[ресурс];
  113. мир.раскладкаKMahjongg = {
  114. "содержимое": содержимое,
  115. };
  116. };
  117. // // // //
  118. ПовернутьФишку = мир =>
  119. {
  120. мир.фишка.rotation.x += 0.03;
  121. мир.фишка.rotation.y += 0.02;
  122. };
  123. // // // //
  124. Отладка = мир =>
  125. {
  126. console.debug("Отладка", Date());
  127. };
  128. // // // //
  129. ЗапуститьТаймерПоворотаФишки = мир =>
  130. {
  131. setInterval(
  132. function() {
  133. мир.уведомить("поворот фишки");
  134. },
  135. 60
  136. );
  137. };
  138. // // // //
  139. ПодготовитьСцену = мир =>
  140. {
  141. var коэффициент = 2;
  142. var расстояние = 12;
  143. мир.камера.position.y = расстояние * коэффициент;
  144. мир.камера.position.z = расстояние;
  145. мир.камера.lookAt(new THREE.Vector3(0, 0, 0));
  146. мир.свет = new THREE.DirectionalLight(0xffffff, 1);
  147. мир.свет.position.set(-0.5, 1, 0.5).normalize();
  148. мир.сцена.add(мир.свет);
  149. мир.корень = new THREE.Group();
  150. мир.сцена.add(мир.корень);
  151. };
  152. // // // //
  153. ПодготовитьФишку = мир =>
  154. {
  155. var материал = new THREE.MeshLambertMaterial({map: мир.текстураФишки});
  156. мир.фишка.material = материал;
  157. };
  158. // // // //
  159. ЗагрузитьТекстуруФишкиИзМодуля = мир =>
  160. {
  161. var модуль = мир.модули.модульПоИмени(ИМЯ_МОДУЛЯ_РЕСУРСОВ);
  162. var ресурс = "/текстура.png";
  163. var содержимое = модуль.содержимое[ресурс];
  164. var b64 = base64js.fromByteArray(new Uint8Array(содержимое));
  165. var адрес = `data:image/png;base64,${b64}`;
  166. мир.загрузчикТекстур.load(
  167. адрес,
  168. function(текстура) {
  169. мир.текстураФишки = текстура;
  170. мир.текстураФишки.flipY = false;
  171. мир.уведомить("загрузили текстуру фишки из модуля");
  172. },
  173. null,
  174. function(error) {
  175. console.error("ОШИБКА | ERROR", error);
  176. }
  177. );
  178. };
  179. // // // //
  180. СоздатьЗагрузчикТекстур = мир =>
  181. {
  182. мир.загрузчикТекстур = new THREE.TextureLoader();
  183. };
  184. // // // //
  185. ЗагрузитьФишку = мир =>
  186. {
  187. var модуль = мир.модули.модульПоИмени(ИМЯ_МОДУЛЯ_РЕСУРСОВ);
  188. var ресурс = "/фишка.gltf";
  189. var адрес = `${window.location.origin}${ресурс}`;
  190. THREE.Cache.enabled = true;
  191. THREE.Cache.add(адрес, модуль.содержимое[ресурс]);
  192. мир.загрузчикGLTF.load(
  193. адрес,
  194. function(gltf) {
  195. // Вычленяем Mesh.
  196. gltf.scene.traverse(function(ребёнок) {
  197. if (ребёнок.isMesh)
  198. {
  199. мир.фишка = ребёнок;
  200. }
  201. });
  202. мир.уведомить("загрузили фишку");
  203. },
  204. null,
  205. function(error) {
  206. console.error("ОШИБКА | ERROR", error);
  207. }
  208. );
  209. };
  210. // // // //
  211. СоздатьЗагрузчикGLTF = мир =>
  212. {
  213. мир.загрузчикGLTF = new THREE.GLTFLoader();
  214. };