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.

110 lines
3.6KB

  1. function Сцена(состояние, события, тела)
  2. {
  3. this.создать = function()
  4. {
  5. this.умолчание = {
  6. скорость: [1, 1],
  7. };
  8. this.задано = {};
  9. события.подписать(this);
  10. };
  11. this.обновить = function()
  12. {
  13. this.переместитьИгрока();
  14. };
  15. this.обработатьКлюч = function(ключ, путь, значение)
  16. {
  17. if (путь[0] != "сцена")
  18. {
  19. return;
  20. }
  21. var свойство = путь.slice(1).join(".");
  22. this.задано[свойство] = значение;
  23. };
  24. this.обработатьНажатиеМышиУказатьИНажать = function(x, y, указатель)
  25. {
  26. var тип = this.задано["тип"];
  27. var игрок = this.задано["игрок"];
  28. var цель = this.задано["цель"];
  29. if (!тип || !игрок || !цель || тип != "указать и нажать")
  30. {
  31. return;
  32. }
  33. var тело = тела.тела[цель];
  34. if (!тело)
  35. {
  36. return;
  37. }
  38. var пр = [
  39. тело.bounds.min.x,
  40. тело.bounds.min.y,
  41. тело.bounds.max.x - тело.bounds.min.x,
  42. тело.bounds.max.y - тело.bounds.min.y,
  43. ]
  44. let ширина = пр[2];
  45. пр[0] = x - ширина;
  46. состояние.разобрать({
  47. тела: {
  48. [цель]: {
  49. пр: пр,
  50. },
  51. },
  52. });
  53. };
  54. this.обработатьСобытие = function(событие)
  55. {
  56. let префикс = "мышь/нажатие/";
  57. if (событие.startsWith(префикс))
  58. {
  59. let значения = событие.substring(префикс.length).split("/");
  60. let x = Number(значения[0]);
  61. let y = Number(значения[1]);
  62. let указатель = значения[2];
  63. this.обработатьНажатиеМышиУказатьИНажать(x, y, указатель);
  64. }
  65. };
  66. this.переместитьИгрока = function()
  67. {
  68. let тип = this.задано["тип"];
  69. let игрок = this.задано["игрок"];
  70. let цель = this.задано["цель"];
  71. let скоростьX = this.задано["скорость.0"];
  72. if (!тип || !игрок || !цель || !скоростьX || тип != "указать и нажать")
  73. {
  74. return;
  75. }
  76. let телоЦели = тела.тела[цель];
  77. let телоИгрока = тела.тела[игрок];
  78. if (!телоЦели || !телоИгрока)
  79. {
  80. return;
  81. }
  82. let игрокX = телоИгрока.position.x;
  83. let цельX = телоЦели.position.x;
  84. let ширина = телоЦели.bounds.max.x - телоЦели.bounds.min.x;
  85. let расстояние = цельX - игрокX;
  86. if (Math.abs(расстояние) < ширина / 2)
  87. {
  88. return;
  89. }
  90. let направление = расстояние > 0 ? 1 : -1;
  91. Matter.Sleeping.set(телоИгрока, false);
  92. Matter.Body.setVelocity(телоИгрока, { x: скоростьX * направление, y: 0 });
  93. };
  94. // Конструктор.
  95. this.создать();
  96. };