Сцена Маджонга | Mahjong scene
Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

фишки|tiles.js 15KB

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