Основа Маджонга | Mahjong's base
Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

сцена|scene.js 5.8KB

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