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

241 lines
6.1KB

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