СцЕНа МАджонга
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.

170 lines
4.6KB

  1. const ОТСТУП_МЕЖДУ_ФИШКАМИ = 0.02;
  2. const КОЭФФИЦИЕНТ_ВЫСОТЫ = 1.5;
  3. // // // //
  4. РасположитьКамеруСцены = мир =>
  5. {
  6. var р = мир.размерПоляФишек;
  7. var расстояние = р.макс.z - р.мин.z;
  8. мир.камера.position.y = расстояние * КОЭФФИЦИЕНТ_ВЫСОТЫ;
  9. мир.камера.position.z = расстояние;
  10. мир.камера.lookAt(new THREE.Vector3(0, 0, 0));
  11. };
  12. // // // //
  13. ЦентрироватьФишкиСцены = мир =>
  14. {
  15. // Возвращаем в центр.
  16. мир.сценаМаджонга.position.x = 0;
  17. мир.сценаМаджонга.position.z = 0;
  18. var р = мир.размерПоляФишек;
  19. // Убираем пустоту слева.
  20. мир.сценаМаджонга.position.x -= р.мин.x;
  21. мир.сценаМаджонга.position.z -= р.мин.z;
  22. // Центрируем остаток.
  23. мир.сценаМаджонга.position.x -= (р.макс.x - р.мин.x) / 2;
  24. мир.сценаМаджонга.position.z -= (р.макс.z - р.мин.z) / 2;
  25. };
  26. // // // //
  27. ПосчитатьРазмерПоляФишек = мир =>
  28. {
  29. var мин = {
  30. "x": 1000000,
  31. "z": 1000000,
  32. };
  33. var макс = {
  34. "x": 0,
  35. "z": 0,
  36. };
  37. for (var номер in мир.фишкиМаджонга)
  38. {
  39. const ф = мир.фишкиСцены[номер];
  40. if (ф.position.x < мин.x)
  41. {
  42. мин.x = ф.position.x;
  43. }
  44. if (ф.position.x > макс.x)
  45. {
  46. макс.x = ф.position.x;
  47. }
  48. if (ф.position.z < мин.z)
  49. {
  50. мин.z = ф.position.z;
  51. }
  52. if (ф.position.z > макс.z)
  53. {
  54. макс.z = ф.position.z;
  55. }
  56. }
  57. мир.размерПоляФишек = {
  58. "мин": мин,
  59. "макс": макс,
  60. };
  61. };
  62. // // // //
  63. ЗадатьМатериалыФишкамСцены = мир =>
  64. {
  65. for (var н in мир.фишкиМаджонга)
  66. {
  67. var ф = мир.фишкиСцены[н];
  68. var г = мир.фишкиМаджонга[н]["🚩"];
  69. var м = мир.материалыФишекСцены[г];
  70. ф.material = м;
  71. }
  72. };
  73. // // // //
  74. ПерезадатьФишкиСцены = мир =>
  75. {
  76. var фишка = мир.модельФишкиСцены;
  77. var границы = фишка.geometry.boundingBox;
  78. var размеры = [
  79. (границы.max.x - границы.min.x) / 2,
  80. (границы.max.z - границы.min.z) / 2,
  81. (границы.max.y - границы.min.y),
  82. ];
  83. var отступ = мир.отступМеждуФишкамиСцены;
  84. for (var номер in мир.фишкиМаджонга)
  85. {
  86. // Узел сцены.
  87. var ф = мир.фишкиСцены[номер];
  88. ф.layers.set(0);
  89. ф.userData = номер;
  90. // Расположение.
  91. var фм = мир.фишкиМаджонга[номер];
  92. var п = фм["📍"];
  93. var слой = п[0];
  94. var ряд = п[1];
  95. var столбец = п[2];
  96. ф.position.x = столбец * (размеры[0] + отступ);
  97. ф.position.z = ряд * (размеры[1] + отступ);
  98. ф.position.y = слой * (размеры[2] + отступ);
  99. }
  100. };
  101. // // // //
  102. СкрытьФишкиСцены = мир =>
  103. {
  104. var фишки = мир.фишкиСцены;
  105. for (var н in фишки)
  106. {
  107. var ф = фишки[н];
  108. ф.layers.set(1);
  109. }
  110. };
  111. // // // //
  112. ДосоздатьФишкиСцены = мир =>
  113. {
  114. // Если фишек в сцене уже достаточно, то ничего не делаем.
  115. if (мир.фишкиСцены.length >= мир.фишкиМаджонга.length)
  116. {
  117. return;
  118. }
  119. var фишка = мир.модельФишкиСцены;
  120. var колво = мир.фишкиМаджонга.length - мир.фишкиСцены.length;
  121. for (var н = 0; н < колво; ++н)
  122. {
  123. var ф = фишка.clone();
  124. мир.фишкиСцены.push(ф);
  125. мир.кореньСценыМаджонга.add(ф);
  126. }
  127. }
  128. // // // //
  129. ПодготовитьСценуМаджонга = мир =>
  130. {
  131. мир.отступМеждуФишкамиСцены = ОТСТУП_МЕЖДУ_ФИШКАМИ;
  132. мир.сценаМаджонга = new THREE.Group();
  133. мир.фишкиСцены = [];
  134. };