Сцена Маджонга | Mahjong scene
25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

101 lines
2.9KB

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