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

425 line
12KB

  1. const ИМЯ = "ОМ | MB";
  2. const ИМЯ_МОДУЛЯ_РЕСУРСОВ = "Ресурсы Маджонга | Mahjong resources";
  3. // // // //
  4. ВывестиКоординатыНажатия = мир =>
  5. {
  6. var п = мир.позицияНажатия;
  7. console.debug("нажатие", п.x, п.y);
  8. };
  9. // // // //
  10. ИсправитьОтслеживаниеНажатийНаIOS = мир =>
  11. {
  12. // https://stackoverflow.com/a/31459240/3404710
  13. мир.отрисовщик.domElement.style.cursor = "pointer";
  14. };
  15. // // // //
  16. ОтслеживатьНажатияПальцем = мир =>
  17. {
  18. window.addEventListener(
  19. "touchstart",
  20. function(событие) {
  21. var позиция = new THREE.Vector2();
  22. позиция.x = (событие.touches[0].clientX / window.innerWidth) * 2 - 1;
  23. позиция.y = - (событие.touches[0].clientY / window.innerHeight) * 2 + 1;
  24. мир.позицияНажатия = позиция;
  25. мир.уведомить("нажали");
  26. }
  27. );
  28. };
  29. // // // //
  30. ОтслеживатьНажатияМышью = мир =>
  31. {
  32. window.addEventListener(
  33. "click",
  34. function(событие) {
  35. var позиция = new THREE.Vector2();
  36. позиция.x = (событие.clientX / window.innerWidth) * 2 - 1;
  37. позиция.y = - (событие.clientY / window.innerHeight) * 2 + 1;
  38. мир.позицияНажатия = позиция;
  39. мир.уведомить("нажали");
  40. }
  41. );
  42. };
  43. // // // //
  44. ЗадатьМатериалыФишкамПоГруппам = мир =>
  45. {
  46. for (var номер in мир.группыФишек)
  47. {
  48. var группа = мир.группыФишек[номер];
  49. var материал = мир.материалыФишек[группа];
  50. фишка = мир.фишки[номер];
  51. фишка.material = материал;
  52. }
  53. };
  54. // // // //
  55. СоздатьГруппыФишек = мир =>
  56. {
  57. мир.группыФишек = [];
  58. const позиции = мир.раскладкаKMahjongg.позиции;
  59. var группа = 0;
  60. for (var номер in позиции)
  61. {
  62. мир.группыФишек.push(группа);
  63. // Меняем группу каждую пару фишек.
  64. if (номер %2 == 0)
  65. {
  66. ++группа;
  67. // Начинаем группы заново, как только они заканчиваются.
  68. if (группа >= 42)
  69. {
  70. группа = 0;
  71. }
  72. }
  73. }
  74. };
  75. // // // //
  76. СоздатьУзлыФишек = мир =>
  77. {
  78. var границы = мир.фишка.geometry.boundingBox;
  79. var размеры = [
  80. (границы.max.x - границы.min.x) / 2,
  81. (границы.max.z - границы.min.z) / 2,
  82. границы.max.y - границы.min.y,
  83. ];
  84. const позиции = мир.раскладкаKMahjongg.позиции;
  85. мир.фишки = [];
  86. for (var номер in позиции)
  87. {
  88. // Модель.
  89. var фишка = мир.фишка.clone();
  90. мир.фишки.push(фишка);
  91. мир.корень.add(фишка);
  92. // Расположение.
  93. var позиция = позиции[номер];
  94. var слой = позиция[0];
  95. var ряд = позиция[1];
  96. var столбец = позиция[2];
  97. фишка.position.x = столбец * размеры[0];
  98. фишка.position.z = ряд * размеры[1];
  99. фишка.position.y = слой;
  100. }
  101. };
  102. // // // //
  103. ОтобразитьРаскладкуПоследовательноСоВсемиТекстурами = мир =>
  104. {
  105. var границы = мир.фишка.geometry.boundingBox;
  106. var размеры = [
  107. (границы.max.x - границы.min.x) / 2,
  108. (границы.max.z - границы.min.z) / 2,
  109. границы.max.y - границы.min.y,
  110. ];
  111. const позиции = мир.раскладкаKMahjongg.позиции;
  112. мир.фишки = [];
  113. for (var номер in позиции)
  114. {
  115. // Модель.
  116. var фишка = мир.фишка.clone();
  117. мир.фишки.push(фишка);
  118. мир.корень.add(фишка);
  119. // Расположение.
  120. var позиция = позиции[номер];
  121. var слой = позиция[0];
  122. var ряд = позиция[1];
  123. var столбец = позиция[2];
  124. фишка.position.x = столбец * размеры[0];
  125. фишка.position.z = ряд * размеры[1];
  126. фишка.position.y = слой;
  127. // Материал.
  128. var номерМатериала = номер % 42;
  129. var материал = мир.материалыФишек[номерМатериала];
  130. фишка.material = материал;
  131. }
  132. };
  133. // // // //
  134. СоздатьМатериалыФишекОтладочнойТемы = мир =>
  135. {
  136. мир.материалыФишек = [];
  137. var тема = "отладочная|debug";
  138. for (var номер = 1; номер <= 42; ++номер)
  139. {
  140. var текстура = мир.текстурыТемФишек[тема][номер];
  141. var материал = new THREE.MeshLambertMaterial({map: текстура});
  142. мир.материалыФишек.push(материал);
  143. }
  144. };
  145. // // // //
  146. ВывестиФактЗагрузкиТемыФишекМаджонга = мир =>
  147. {
  148. console.debug("ВывестиФактЗагрузкиТемыФишекМаджонга");
  149. };
  150. // // // //
  151. ЗадатьТемуФишекДляЗагрузки = мир =>
  152. {
  153. мир.темаФишек = "отладочная|debug";
  154. };
  155. // // // //
  156. ЦентрироватьСцену = мир =>
  157. {
  158. var мин = {
  159. "x": 0,
  160. "z": 0,
  161. };
  162. var макс = {
  163. "x": 0,
  164. "z": 0,
  165. };
  166. for (var номер in мир.фишки)
  167. {
  168. const фишка = мир.фишки[номер];
  169. if (фишка.position.x < мин.x)
  170. {
  171. мин.x = фишка.position.x;
  172. }
  173. if (фишка.position.x > макс.x)
  174. {
  175. макс.x = фишка.position.x;
  176. }
  177. if (фишка.position.z < мин.z)
  178. {
  179. мин.z = фишка.position.z;
  180. }
  181. if (фишка.position.z > макс.z)
  182. {
  183. макс.z = фишка.position.z;
  184. }
  185. }
  186. мир.корень.position.x -= (макс.x - мин.x) / 2;
  187. мир.корень.position.z -= (макс.z - мин.z) / 2;
  188. };
  189. // // // //
  190. ОтобразитьРаскладкуОднойФишкой = мир =>
  191. {
  192. var границы = мир.фишка.geometry.boundingBox;
  193. var размеры = [
  194. (границы.max.x - границы.min.x) / 2,
  195. (границы.max.z - границы.min.z) / 2,
  196. границы.max.y - границы.min.y,
  197. ];
  198. const позиции = мир.раскладкаKMahjongg.позиции;
  199. мир.фишки = [];
  200. for (var номер in позиции)
  201. {
  202. var фишка = мир.фишка.clone();
  203. мир.фишки.push(фишка);
  204. мир.корень.add(фишка);
  205. var позиция = позиции[номер];
  206. var слой = позиция[0];
  207. var ряд = позиция[1];
  208. var столбец = позиция[2];
  209. фишка.position.x = столбец * размеры[0];
  210. фишка.position.z = ряд * размеры[1];
  211. фишка.position.y = слой;
  212. }
  213. };
  214. // // // //
  215. ЗагрузитьРаскладку = мир =>
  216. {
  217. var модуль = мир.модули.модульПоИмени(ИМЯ_МОДУЛЯ_РЕСУРСОВ);
  218. //var ресурс = "/cat.layout";
  219. var ресурс = "/X_shaped.layout";
  220. var содержимое = модуль.содержимое[ресурс];
  221. мир.раскладкаKMahjongg = {
  222. "содержимое": содержимое,
  223. };
  224. };
  225. // // // //
  226. ПовернутьФишку = мир =>
  227. {
  228. мир.фишка.rotation.x += 0.03;
  229. мир.фишка.rotation.y += 0.02;
  230. };
  231. // // // //
  232. Отладка = мир =>
  233. {
  234. console.debug("Отладка", Date());
  235. };
  236. // // // //
  237. ЗапуститьТаймерПоворотаФишки = мир =>
  238. {
  239. setInterval(
  240. function() {
  241. мир.уведомить("поворот фишки");
  242. },
  243. 60
  244. );
  245. };
  246. // // // //
  247. ПодготовитьСцену = мир =>
  248. {
  249. var коэффициент = 2;
  250. var расстояние = 12;
  251. мир.камера.position.y = расстояние * коэффициент;
  252. мир.камера.position.z = расстояние;
  253. мир.камера.lookAt(new THREE.Vector3(0, 0, 0));
  254. мир.свет = new THREE.DirectionalLight(0xffffff, 1);
  255. мир.свет.position.set(-0.5, 1, 0.5).normalize();
  256. мир.сцена.add(мир.свет);
  257. мир.корень = new THREE.Group();
  258. мир.сцена.add(мир.корень);
  259. };
  260. // // // //
  261. ПодготовитьФишку = мир =>
  262. {
  263. var материал = new THREE.MeshLambertMaterial({map: мир.текстураФишки});
  264. мир.фишка.material = материал;
  265. };
  266. // // // //
  267. ЗагрузитьТекстуруФишкиИзМодуля = мир =>
  268. {
  269. var модуль = мир.модули.модульПоИмени(ИМЯ_МОДУЛЯ_РЕСУРСОВ);
  270. var ресурс = "/текстура.png";
  271. var содержимое = модуль.содержимое[ресурс];
  272. var b64 = base64js.fromByteArray(new Uint8Array(содержимое));
  273. var адрес = `data:image/png;base64,${b64}`;
  274. мир.загрузчикТекстур.load(
  275. адрес,
  276. function(текстура) {
  277. мир.текстураФишки = текстура;
  278. мир.текстураФишки.flipY = false;
  279. мир.уведомить("загрузили текстуру фишки из модуля");
  280. },
  281. null,
  282. function(error) {
  283. console.error("ОШИБКА | ERROR", error);
  284. }
  285. );
  286. };
  287. // // // //
  288. СоздатьЗагрузчикТекстур = мир =>
  289. {
  290. мир.загрузчикТекстур = new THREE.TextureLoader();
  291. };
  292. // // // //
  293. ЗагрузитьФишку = мир =>
  294. {
  295. var модуль = мир.модули.модульПоИмени(ИМЯ_МОДУЛЯ_РЕСУРСОВ);
  296. var ресурс = "/фишка.gltf";
  297. var адрес = `${window.location.origin}${ресурс}`;
  298. THREE.Cache.enabled = true;
  299. THREE.Cache.add(адрес, модуль.содержимое[ресурс]);
  300. мир.загрузчикGLTF.load(
  301. адрес,
  302. function(gltf) {
  303. // Вычленяем Mesh.
  304. gltf.scene.traverse(function(ребёнок) {
  305. if (ребёнок.isMesh)
  306. {
  307. мир.фишка = ребёнок;
  308. }
  309. });
  310. мир.уведомить("загрузили фишку");
  311. },
  312. null,
  313. function(error) {
  314. console.error("ОШИБКА | ERROR", error);
  315. }
  316. );
  317. };
  318. // // // //
  319. СоздатьЗагрузчикGLTF = мир =>
  320. {
  321. мир.загрузчикGLTF = new THREE.GLTFLoader();
  322. };