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.

143 lines
4.6KB

  1. function Сцена(состояние, события, тела)
  2. {
  3. this.создать = function()
  4. {
  5. this.умолчание = {
  6. скорость: [1, 1],
  7. };
  8. this.задано = {};
  9. this.сцены = null;
  10. события.подписать(this);
  11. };
  12. this.загрузитьОглавление = function(адрес)
  13. {
  14. var тут = this;
  15. var запрос = new XMLHttpRequest();
  16. запрос.onreadystatechange = function()
  17. {
  18. if (this.readyState == 4)
  19. {
  20. if (this.status == 200)
  21. {
  22. тут.разобратьОглавление(this.responseText);
  23. }
  24. else
  25. {
  26. console.error("Не удалось загрузить оглавление сцен:", this.status);
  27. }
  28. }
  29. }
  30. запрос.open("GET", адрес);
  31. запрос.send();
  32. };
  33. this.обновить = function()
  34. {
  35. this.переместитьИгрока();
  36. };
  37. this.обработатьКлюч = function(ключ, путь, значение)
  38. {
  39. if (путь[0] != "сцена")
  40. {
  41. return;
  42. }
  43. var свойство = путь.slice(1).join(".");
  44. this.задано[свойство] = значение;
  45. if (свойство == "оглавление")
  46. {
  47. this.загрузитьОглавление(значение);
  48. }
  49. };
  50. this.обработатьНажатиеМышиУказатьИНажать = function(x, y, указатель)
  51. {
  52. var тип = this.задано["тип"];
  53. var игрок = this.задано["игрок"];
  54. var цель = this.задано["цель"];
  55. if (!тип || !игрок || !цель || тип != "указать и нажать")
  56. {
  57. return;
  58. }
  59. var тело = тела.тела[цель];
  60. if (!тело)
  61. {
  62. return;
  63. }
  64. var пр = [
  65. тело.bounds.min.x,
  66. тело.bounds.min.y,
  67. тело.bounds.max.x - тело.bounds.min.x,
  68. тело.bounds.max.y - тело.bounds.min.y,
  69. ]
  70. let ширина = пр[2];
  71. пр[0] = x - ширина;
  72. состояние.разобрать({
  73. тела: {
  74. [цель]: {
  75. пр: пр,
  76. },
  77. },
  78. });
  79. };
  80. this.обработатьСобытие = function(событие)
  81. {
  82. let префикс = "мышь/нажатие/";
  83. if (событие.startsWith(префикс))
  84. {
  85. let значения = событие.substring(префикс.length).split("/");
  86. let x = Number(значения[0]);
  87. let y = Number(значения[1]);
  88. let указатель = значения[2];
  89. this.обработатьНажатиеМышиУказатьИНажать(x, y, указатель);
  90. }
  91. };
  92. this.переместитьИгрока = function()
  93. {
  94. let тип = this.задано["тип"];
  95. let игрок = this.задано["игрок"];
  96. let цель = this.задано["цель"];
  97. let скоростьX = this.задано["скорость.0"];
  98. if (!тип || !игрок || !цель || !скоростьX || тип != "указать и нажать")
  99. {
  100. return;
  101. }
  102. let телоЦели = тела.тела[цель];
  103. let телоИгрока = тела.тела[игрок];
  104. if (!телоЦели || !телоИгрока)
  105. {
  106. return;
  107. }
  108. let игрокX = телоИгрока.position.x;
  109. let цельX = телоЦели.position.x;
  110. let ширина = телоЦели.bounds.max.x - телоЦели.bounds.min.x;
  111. let расстояние = цельX - игрокX;
  112. if (Math.abs(расстояние) < ширина / 2)
  113. {
  114. return;
  115. }
  116. let направление = расстояние > 0 ? 1 : -1;
  117. Matter.Sleeping.set(телоИгрока, false);
  118. Matter.Body.setVelocity(телоИгрока, { x: скоростьX * направление, y: 0 });
  119. };
  120. this.разобратьОглавление = function(содержимое)
  121. {
  122. let код = "this.сцены = " + содержимое;
  123. eval(код);
  124. };
  125. // Конструктор.
  126. this.создать();
  127. };