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

106 lines
2.9KB

  1. // // // //
  2. сообщитьОНажатии = (мир, событие) =>
  3. {
  4. if (!мир.отслеживатьНажатия)
  5. {
  6. return;
  7. }
  8. var позиция = new THREE.Vector2();
  9. var ширина = window.innerWidth * мир.масштаб;
  10. var высота = window.innerHeight * мир.масштаб;
  11. позиция.x = ((событие.clientX + window.pageXOffset) / ширина ) * 2 - 1;
  12. позиция.y = - ((событие.clientY + window.pageYOffset) / высота) * 2 + 1;
  13. мир.позицияНажатия = позиция;
  14. мир.уведомить("нажали");
  15. };
  16. // // // //
  17. фишкуМожноВыбрать = (индексы, индекс) =>
  18. {
  19. var позиция = позицияИндексаФишки(индекс);
  20. // Проверяем заблокированность фишки одновременно с обеих сторон.
  21. var слева = уФишкиЕстьСоседи(индексы, позиция, 0, -2);
  22. var справа = уФишкиЕстьСоседи(индексы, позиция, 0, 2);
  23. if (слева && справа)
  24. {
  25. return false;
  26. }
  27. // Проверяем заблокированность сверху.
  28. for (var смещениеСтолбца = -1; смещениеСтолбца < 2; ++смещениеСтолбца)
  29. {
  30. if (уФишкиЕстьСоседи(индексы, позиция, 1, смещениеСтолбца))
  31. {
  32. return false;
  33. }
  34. }
  35. return true;
  36. };
  37. // // // //
  38. уФишкиЕстьСоседи = (индексы, позиция, смещениеСлоя, смещениеСтолбца) =>
  39. {
  40. for (var смещениеРяда = -1; смещениеРяда < 2; ++смещениеРяда)
  41. {
  42. var позицияСоседа = [
  43. позиция[0] + смещениеСлоя,
  44. позиция[1] + смещениеРяда,
  45. позиция[2] + смещениеСтолбца,
  46. ];
  47. var индексСоседа = индексПозицииФишки(позицияСоседа);
  48. if (индексСоседа in индексы)
  49. {
  50. return true;
  51. }
  52. }
  53. return false;
  54. };
  55. // // // //
  56. позицияИндексаФишки = (индекс) =>
  57. {
  58. const x = Math.round(индекс / 1000000);
  59. const y = Math.round((индекс - x * 1000000) / 1000);
  60. const z = индекс - x * 1000000 - y * 1000;
  61. return [x, y, z];
  62. };
  63. // // // //
  64. индексПозицииФишки = (позиция) =>
  65. {
  66. return позиция[0] * 1000000 + позиция[1] * 1000 + позиция[2];
  67. };
  68. // // // //
  69. номерФишки = (фишки, id) =>
  70. {
  71. for (var номер in фишки)
  72. {
  73. var фишка = фишки[номер];
  74. if (фишка.id == id)
  75. {
  76. return номер;
  77. }
  78. }
  79. return null;
  80. };