Сцена Маджонга | Mahjong scene
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

467 linhas
13KB

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