ОТладка МАджонга
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.

153 lines
4.3KB

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