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

271 lines
5.6KB

  1. // // // //
  2. СообщитьТекущееЗначениеМасштаба = мир =>
  3. {
  4. UIkit.notification({
  5. message: "🔍 " + мир.масштаб,
  6. //status: 'primary',
  7. //pos: 'top-right',
  8. timeout: 500
  9. });
  10. };
  11. // // // //
  12. УменьшитьМасштаб = мир =>
  13. {
  14. мир.масштаб -= 0.5;
  15. if (мир.масштаб < 1)
  16. {
  17. мир.масштаб = 1;
  18. }
  19. мир.уведомить("изменили масштаб");
  20. };
  21. // // // //
  22. УвеличитьМасштаб = мир =>
  23. {
  24. мир.масштаб += 0.5;
  25. мир.уведомить("изменили масштаб");
  26. };
  27. // // // //
  28. ИзменитьРазмерОтрисовщикаThreeJS = мир =>
  29. {
  30. console.debug("масштаб:", мир.масштаб);
  31. var ширина = window.innerWidth * мир.масштаб;
  32. var высота = window.innerHeight * мир.масштаб;
  33. мир.камера.aspect = ширина / высота;
  34. мир.камера.updateProjectionMatrix();
  35. мир.отрисовщик.setSize(ширина, высота);
  36. var размер = мир.масштаб * 100;
  37. мир.канва.style = `
  38. max-width: ${размер}%;
  39. max-height: ${размер}%;
  40. width: ${размер}%;
  41. height: ${размер}%;
  42. `;
  43. };
  44. // // // //
  45. ЗадатьОтладочныйМасштаб = мир =>
  46. {
  47. мир.масштаб = 3;
  48. мир.уведомить("изменили масштаб");
  49. };
  50. // // // //
  51. ИсправитьОтслеживаниеНажатийНаIOS = мир =>
  52. {
  53. // https://stackoverflow.com/a/31459240/3404710
  54. мир.отрисовщик.domElement.style.cursor = "pointer";
  55. };
  56. // // // //
  57. ОтслеживатьНажатияПальцем = мир =>
  58. {
  59. window.addEventListener(
  60. "touchstart",
  61. function(событие) {
  62. сообщитьОНажатии(мир, событие.touches[0]);
  63. }
  64. );
  65. };
  66. // // // //
  67. ОтслеживатьНажатияМышью = мир =>
  68. {
  69. window.addEventListener(
  70. "click",
  71. function(событие) {
  72. сообщитьОНажатии(мир, событие);
  73. }
  74. );
  75. };
  76. // // // //
  77. ЦентрироватьСцену = мир =>
  78. {
  79. var мин = {
  80. "x": 0,
  81. "z": 0,
  82. };
  83. var макс = {
  84. "x": 0,
  85. "z": 0,
  86. };
  87. for (var номер in мир.фишки)
  88. {
  89. const фишка = мир.фишки[номер];
  90. if (фишка.position.x < мин.x)
  91. {
  92. мин.x = фишка.position.x;
  93. }
  94. if (фишка.position.x > макс.x)
  95. {
  96. макс.x = фишка.position.x;
  97. }
  98. if (фишка.position.z < мин.z)
  99. {
  100. мин.z = фишка.position.z;
  101. }
  102. if (фишка.position.z > макс.z)
  103. {
  104. макс.z = фишка.position.z;
  105. }
  106. }
  107. мир.корень.position.x -= (макс.x - мин.x) / 2;
  108. мир.корень.position.z -= (макс.z - мин.z) / 2;
  109. };
  110. // // // //
  111. СоздатьФишкиВСцене = мир =>
  112. {
  113. мир.уведомить("надо создать фишки в сцене");
  114. };
  115. // // // //
  116. ЗагрузитьРесурсыСцены = мир =>
  117. {
  118. мир.уведомить("надо загрузить ресурсы сцены");
  119. };
  120. // // // //
  121. ПодготовитьСцену = мир =>
  122. {
  123. var коэффициент = 2;
  124. var расстояние = 14;
  125. мир.камера.position.y = расстояние * коэффициент;
  126. мир.камера.position.z = расстояние;
  127. мир.камера.lookAt(new THREE.Vector3(0, 0, 0));
  128. мир.свет = new THREE.DirectionalLight(0xffffff, 1);
  129. мир.свет.position.set(-0.5, 1, 0.5).normalize();
  130. мир.сцена.add(мир.свет);
  131. мир.корень = new THREE.Group();
  132. мир.сцена.add(мир.корень);
  133. };
  134. // // // //
  135. СоздатьЗагрузчикТекстур = мир =>
  136. {
  137. мир.загрузчикТекстур = new THREE.TextureLoader();
  138. };
  139. // // // //
  140. СоздатьЗагрузчикGLTF = мир =>
  141. {
  142. мир.загрузчикGLTF = new THREE.GLTFLoader();
  143. };
  144. // // // //
  145. /*
  146. ВстроитьОтрисовщикаThreeJS = мир =>
  147. {
  148. // Задать вид.
  149. var css = `
  150. html, body {
  151. margin: 0;
  152. }
  153. `;
  154. var вид = document.createElement("style");
  155. вид.innerHTML = css;
  156. document.head.appendChild(вид);
  157. document.body.appendChild(мир.отрисовщик.domElement);
  158. };
  159. */
  160. // // // //
  161. НастроитьThreeJS = мир =>
  162. {
  163. мир.сцена = new THREE.Scene();
  164. мир.сцена.background = new THREE.Color(0xFFFFFF);
  165. мир.камера = new THREE.PerspectiveCamera(45, 1, 0.1, 1000);
  166. мир.ловецНажатий = new THREE.Raycaster();
  167. мир.отрисовщик = new THREE.WebGLRenderer({canvas: мир.канва, antialias: true});
  168. };
  169. // // // //
  170. СоздатьКанвуThreeJS = мир =>
  171. {
  172. мир.канва = document.createElement("canvas");
  173. мир.канва.id = "канва-threejs";
  174. мир.канва.style = `
  175. position: absolute;
  176. left: 0;
  177. top: 0;
  178. width: 100%;
  179. height: 100%;
  180. `;
  181. var первый = document.body.firstChild;
  182. if (первый)
  183. {
  184. document.body.insertBefore(мир.канва, первый);
  185. }
  186. else
  187. {
  188. document.body.appendChild(мир.канва);
  189. }
  190. };
  191. // // // //
  192. СоздатьМасштаб = мир =>
  193. {
  194. мир.масштаб = 1;
  195. };