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.

155 lines
5.0KB

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