Основа Маджонга | Mahjong's base
25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

433 lines
12KB

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