Сцена Маджонга | Mahjong scene
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.

фишки|tiles.js 9.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332
  1. // // // //
  2. ОчиститьВыборПервойНайденнойФишки = мир =>
  3. {
  4. мир.номераВыбранныхФишек.shift();
  5. };
  6. // // // //
  7. ОчиститьОкрашиваниеПервойНайденнойФишки = мир =>
  8. {
  9. var номер = мир.номераВыбранныхФишек[0];
  10. var фишка = мир.фишки[номер];
  11. var группа = мир.группыФишек[номер];
  12. var материал = мир.материалыФишек[группа];
  13. фишка.material = материал;
  14. };
  15. // // // //
  16. ВывестиРазличиеФишек = мир =>
  17. {
  18. console.debug("ВывестиРазличиеФишек");
  19. };
  20. // // // //
  21. ВывестиСовпадениеФишек = мир =>
  22. {
  23. console.debug("ВывестиСовпадениеФишек");
  24. };
  25. // // // //
  26. СравнитьВыбранныеФишки = мир =>
  27. {
  28. var номер0 = мир.номераВыбранныхФишек[0];
  29. var группа0 = мир.группыФишек[номер0];
  30. var номер1 = мир.номераВыбранныхФишек[1];
  31. var группа1 = мир.группыФишек[номер1];
  32. if (группа0 == группа1)
  33. {
  34. мир.уведомить("фишки совпадают");
  35. }
  36. else
  37. {
  38. мир.уведомить("фишки не совпадают");
  39. }
  40. };
  41. // // // //
  42. ПроверитьНаличиеДвухВыбранныхФишек = мир =>
  43. {
  44. if (мир.номераВыбранныхФишек.length == 2)
  45. {
  46. мир.уведомить("выбраны две фишки");
  47. }
  48. };
  49. // // // //
  50. ОкраситьНайденнуюФишку = мир =>
  51. {
  52. /*
  53. // Очищаем цвета всех фишек.
  54. for (var номер in мир.фишки)
  55. {
  56. var фишка = мир.фишки[номер];
  57. var группа = мир.группыФишек[номер];
  58. var материал = мир.материалыФишек[группа];
  59. фишка.material = материал;
  60. }
  61. // Окрашиваем выбранные фишки.
  62. for (var id in мир.номераВыбранныхФишек)
  63. {
  64. var номер = мир.номераВыбранныхФишек[id];
  65. var фишка = мир.фишки[номер];
  66. var группа = мир.группыФишек[номер];
  67. var материал = мир.материалыВыбранныхФишек[группа];
  68. фишка.material = материал;
  69. }
  70. */
  71. var номер = мир.номерНайденнойФишки;
  72. var фишка = мир.фишки[номер];
  73. var группа = мир.группыФишек[номер];
  74. var материал = мир.материалыВыбранныхФишек[группа];
  75. фишка.material = материал;
  76. };
  77. // // // //
  78. ВывестиВыбраннуюФишку = мир =>
  79. {
  80. var номер = мир.номерНайденнойФишки;
  81. var группа = мир.группыФишек[номер];
  82. console.debug(`ВЫБРАЛИ фишку. номер: '${номер}' группа: '${группа}'`);
  83. };
  84. // // // //
  85. ВыбратьНайденнуюФишку = мир =>
  86. {
  87. мир.номераВыбранныхФишек.push(мир.номерНайденнойФишки);
  88. мир.уведомить("выбрали фишку");
  89. };
  90. // // // //
  91. ПроверитьДоступностьФишкиДляВыбора = мир =>
  92. {
  93. // Проверяем заблокированность фишки одновременно с обеих сторон.
  94. var позиция = мир.раскладкаKMahjongg.позиции[мир.номерНайденнойФишки];
  95. var слева = уФишкиЕстьСоседи(мир.индексыФишек, позиция, 0, -2);
  96. var справа = уФишкиЕстьСоседи(мир.индексыФишек, позиция, 0, 2);
  97. if (слева && справа)
  98. {
  99. return;
  100. }
  101. // Проверяем заблокированность сверху.
  102. for (var смещениеСтолбца = -1; смещениеСтолбца < 2; ++смещениеСтолбца)
  103. {
  104. if (уФишкиЕстьСоседи(мир.индексыФишек, позиция, 1, смещениеСтолбца))
  105. {
  106. return;
  107. }
  108. }
  109. мир.уведомить("фишка доступна для выбора");
  110. };
  111. // // // //
  112. УведомитьОСозданииФишекВСцене = мир =>
  113. {
  114. мир.уведомить("создали фишки в сцене");
  115. };
  116. // // // //
  117. ПодготовитьФишкиКВыбору = мир =>
  118. {
  119. мир.номераВыбранныхФишек = [];
  120. };
  121. // // // //
  122. СоздатьИндексыФишек = мир =>
  123. {
  124. мир.индексыФишек = {};
  125. const позиции = мир.раскладкаKMahjongg.позиции;
  126. for (var номер in позиции)
  127. {
  128. var позиция = позиции[номер];
  129. var фишка = мир.фишки[номер];
  130. var индекс = индексПозицииФишки(позиция);
  131. мир.индексыФишек[индекс] = фишка;
  132. };
  133. };
  134. // // // //
  135. ВывестиНайденнуюФишку = мир =>
  136. {
  137. var номер = мир.номерНайденнойФишки;
  138. var группа = мир.группыФишек[номер];
  139. console.debug(`Нашли фишку. номер: '${номер}' группа: '${группа}'`);
  140. };
  141. // // // //
  142. НайтиФишкуВКоординатахНажатия = мир =>
  143. {
  144. мир.ловецНажатий.setFromCamera(мир.позицияНажатия, мир.камера);
  145. var пересечения = мир.ловецНажатий.intersectObjects(мир.корень.children);
  146. if (пересечения.length)
  147. {
  148. var фишка = пересечения[0].object;
  149. var номер = номерФишки(мир.фишки, фишка.id);
  150. if (номер)
  151. {
  152. мир.номерНайденнойФишки = номер;
  153. мир.уведомить("нашли фишку в координатах нажатия");
  154. }
  155. }
  156. };
  157. // // // //
  158. СоздатьМатериалыВыбранныхФишекОтладочнойТемы = мир =>
  159. {
  160. мир.материалыВыбранныхФишек = [];
  161. for (var номер in мир.материалыФишек)
  162. {
  163. var материал = мир.материалыФишек[номер].clone();
  164. материал.color = new THREE.Color(0xff0000);
  165. мир.материалыВыбранныхФишек.push(материал);
  166. }
  167. };
  168. // // // //
  169. ПодготовитьПоискФишек = мир =>
  170. {
  171. мир.номераНайденныхФишек = [];
  172. };
  173. // // // //
  174. ЗадатьМатериалыФишкамПоГруппам = мир =>
  175. {
  176. for (var номер in мир.группыФишек)
  177. {
  178. var группа = мир.группыФишек[номер];
  179. var материал = мир.материалыФишек[группа];
  180. фишка = мир.фишки[номер];
  181. фишка.material = материал;
  182. }
  183. };
  184. // // // //
  185. СоздатьГруппыФишек = мир =>
  186. {
  187. мир.группыФишек = [];
  188. const позиции = мир.раскладкаKMahjongg.позиции;
  189. var группа = 0;
  190. for (var номер in позиции)
  191. {
  192. мир.группыФишек.push(группа);
  193. // Меняем группу каждую пару фишек.
  194. if (номер % 2 == 1)
  195. {
  196. ++группа;
  197. // Начинаем группы заново, как только они заканчиваются.
  198. if (группа >= 42)
  199. {
  200. группа = 0;
  201. }
  202. }
  203. }
  204. };
  205. // // // //
  206. СоздатьУзлыФишек = мир =>
  207. {
  208. var границы = мир.фишка.geometry.boundingBox;
  209. var размеры = [
  210. (границы.max.x - границы.min.x) / 2,
  211. (границы.max.z - границы.min.z) / 2,
  212. границы.max.y - границы.min.y,
  213. ];
  214. const позиции = мир.раскладкаKMahjongg.позиции;
  215. мир.фишки = [];
  216. for (var номер in позиции)
  217. {
  218. // Модель.
  219. var фишка = мир.фишка.clone();
  220. мир.фишки.push(фишка);
  221. мир.корень.add(фишка);
  222. // Расположение.
  223. var позиция = позиции[номер];
  224. var слой = позиция[0];
  225. var ряд = позиция[1];
  226. var столбец = позиция[2];
  227. фишка.position.x = столбец * размеры[0];
  228. фишка.position.z = ряд * размеры[1];
  229. фишка.position.y = слой;
  230. }
  231. };
  232. // // // //
  233. СоздатьМатериалыФишекОтладочнойТемы = мир =>
  234. {
  235. мир.материалыФишек = [];
  236. var тема = "отладочная|debug";
  237. for (var номер = 1; номер <= 42; ++номер)
  238. {
  239. var текстура = мир.текстурыТемФишек[тема][номер];
  240. var материал = new THREE.MeshLambertMaterial({map: текстура});
  241. мир.материалыФишек.push(материал);
  242. }
  243. };