Колобок на Phaser
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.

372 lines
10KB

  1. /*
  2. *
  3. * Реакции
  4. *
  5. */
  6. ЗагрузитьРесурсыКолобка= мир =>
  7. {
  8. мир.сцена.load.spritesheet(
  9. "колобок",
  10. "ресурсы/колобок/колобок.png",
  11. {
  12. frameWidth: 97,
  13. frameHeight: 94,
  14. }
  15. );
  16. мир.сцена.load.audio("прыжок", "ресурсы/звуки/331381__qubodup__public-domain-jump-sound.wav");
  17. мир.сцена.load.audio("повреждение", "ресурсы/звуки/437650__dersuperanton__getting-hit-damage-scream.wav");
  18. };
  19. // // // //
  20. СоздатьКолобка = мир =>
  21. {
  22. var x = 100;
  23. var y = 500;
  24. //var x = 1500;
  25. //var y = 200;
  26. мир.колобок = мир.сцена.physics.add.sprite(x, y, "колобок");
  27. мир.колобок.depth = 10;
  28. мир.колобок.body.setSize(50);
  29. // Портит анимацию прыжков!
  30. // мир.колобок.setBounceY(0.1);
  31. // Следить за колобком камерой.
  32. const камера = мир.сцена.cameras.main;
  33. камера.startFollow(мир.колобок, false, 0.1, 0.1);
  34. // Состояние.
  35. мир.колобок["мигать"] = false;
  36. мир.колобок["мигание"] = { };
  37. мир.колобок["прыгучесть"] = -570;
  38. мир.колобок["коэффициентПрыгучести"] = 1;
  39. мир.колобок["прыжок"] = false;
  40. мир.колобок["скоростьПадения"] = 0;
  41. };
  42. // // // //
  43. СоздатьАнимацииКолобка = мир =>
  44. {
  45. var анимации = мир.сцена.anims;
  46. анимации.create({
  47. key: "колобок-неподвижен",
  48. frames: [{ key: "колобок", frame: 0 }],
  49. frameRate: 20,
  50. })
  51. анимации.create({
  52. key: "колобок-движение",
  53. frames: мир.сцена.anims.generateFrameNumbers("колобок", { start: 23, end: 1 }),
  54. frameRate: 20,
  55. repeat: -1,
  56. })
  57. анимации.create({
  58. key: "колобок-прыжок",
  59. frames: [{ key: "колобок", frame: 24 }],
  60. frameRate: 20,
  61. })
  62. };
  63. // // // //
  64. НастроитьСтолкновениеКолобка = мир =>
  65. {
  66. var столкновениеКаркас = мир.сцена.physics.add.collider(мир.колобок, мир.каркас);
  67. столкновениеКаркас.collideCallback = function(a, каркас) {
  68. if (мир.колобок.body.touching.down && каркас.body.touching.up && мир.колобок.прыжок)
  69. {
  70. мир.колобок.каркас = каркас.name;
  71. мир.уведомить("колобок прыгнул на каркас");
  72. }
  73. };
  74. мир.столкновениеПлатформы = мир.сцена.physics.add.collider(мир.колобок, мир.платформы);
  75. мир.столкновениеВещи = мир.сцена.physics.add.collider(мир.колобок, мир.вещи);
  76. мир.столкновениеВещи.collideCallback = function(a, вещь) {
  77. if (мир.колобок.body.touching.down && вещь.body.touching.up && мир.колобок.прыжок)
  78. {
  79. мир.колобок.вещь = вещь.name;
  80. мир.уведомить("колобок прыгнул на вещь");
  81. }
  82. };
  83. var столкновениеВраги = мир.сцена.physics.add.collider(мир.колобок, мир.враги);
  84. столкновениеВраги.overlapOnly = true;
  85. столкновениеВраги.collideCallback = function(a, b) {
  86. мир.уведомить("столкновение с врагом");
  87. };
  88. };
  89. // // // //
  90. ПереместитьКолобка = мир =>
  91. {
  92. if (!мир.управление)
  93. {
  94. мир.колобок.setVelocityX(0);
  95. return;
  96. }
  97. var x = 0;
  98. if (мир.управление.направление == -1)
  99. {
  100. x = -200;
  101. мир.колобок.flipX = true;
  102. }
  103. else if (мир.управление.направление == 1)
  104. {
  105. x = 200;
  106. мир.колобок.flipX = false;
  107. }
  108. мир.колобок.setVelocityX(x);
  109. if (мир.управление.прыжок && !мир.колобок.прыжок)
  110. {
  111. мир.колобок.прыжок = true;
  112. var скорость = мир.колобок.прыгучесть * мир.колобок.коэффициентПрыгучести;
  113. мир.колобок.setVelocityY(скорость);
  114. мир.уведомить("колобок начал прыжок");
  115. }
  116. };
  117. // // // //
  118. ВоспроизвестиЗвукПрыжка = мир =>
  119. {
  120. мир.сцена.sound.play("прыжок");
  121. };
  122. // // // //
  123. ОпределитьОкончаниеПрыжкаКолобка = мир =>
  124. {
  125. if (!мир.колобок.прыжок)
  126. {
  127. return;
  128. }
  129. var скоростьПадения = мир.колобок.body.velocity.y;
  130. if (
  131. (
  132. мир.колобок.скоростьПадения > 40 ||
  133. мир.колобок.скоростьПадения == 0
  134. ) &&
  135. (скоростьПадения == 0) &&
  136. мир.колобок.body.touching.down
  137. ) {
  138. мир.уведомить("колобок закончит прыжок");
  139. мир.колобок.прыжок = false;
  140. мир.уведомить("колобок закончил прыжок");
  141. }
  142. мир.колобок.скоростьПадения = скоростьПадения;
  143. };
  144. // // // //
  145. АнимироватьКолобка = мир =>
  146. {
  147. var есть = "";
  148. if (мир.колобок.anims.currentAnim)
  149. {
  150. есть = мир.колобок.anims.currentAnim.key;
  151. }
  152. var надо = "колобок-неподвижен";
  153. if (мир.колобок.прыжок)
  154. {
  155. надо = "колобок-прыжок";
  156. }
  157. else if (мир.колобок.body.velocity.x != 0)
  158. {
  159. надо = "колобок-движение";
  160. }
  161. if (есть != надо)
  162. {
  163. мир.колобок.anims.play(надо);
  164. мир.уведомить("изменили анимацию колобка");
  165. }
  166. };
  167. // // // //
  168. ОтключитьСтолкновениеСПлатформамиИВещами = мир =>
  169. {
  170. мир.столкновениеПлатформы.active = false;
  171. мир.столкновениеВещи.active = false;
  172. };
  173. // // // //
  174. ВключитьСтолкновениеСПлатформамиИВещами = мир =>
  175. {
  176. мир.столкновениеПлатформы.active = true;
  177. мир.столкновениеВещи.active = true;
  178. };
  179. // // // //
  180. ОстановитьПередвижениеВещей = мир =>
  181. {
  182. var вещи = мир.вещи.getChildren();
  183. for (var н in вещи)
  184. {
  185. var вещь = вещи[н];
  186. if (вещь.body.touching.down)
  187. {
  188. вещь.body.stop();
  189. }
  190. }
  191. };
  192. // // // //
  193. НачатьМиганиеКолобка = мир =>
  194. {
  195. var конец = new Date();
  196. конец.setSeconds(конец.getSeconds() + 6);
  197. мир.колобок.мигание.окончание = конец;
  198. var звук = мир.сцена.sound.get("повреждение");
  199. if (!звук || !звук.isPlaying)
  200. {
  201. мир.сцена.sound.play("повреждение");
  202. }
  203. if (мир.колобок.мигать)
  204. {
  205. return;
  206. }
  207. мир.колобок.мигать = true;
  208. мир.колобок.мигание = {
  209. шаг: 0.1,
  210. цель: 0,
  211. };
  212. мир.уведомить("начали мигать колобка");
  213. };
  214. // // // //
  215. МигатьКолобка = мир =>
  216. {
  217. if (!мир.колобок.мигать)
  218. {
  219. return;
  220. }
  221. var м = мир.колобок.мигание;
  222. var сейчас = new Date();
  223. if (м.окончание - сейчас < 0)
  224. {
  225. мир.колобок.мигать = false;
  226. мир.колобок.alpha = 1;
  227. мир.уведомить("закончили мигать колобка");
  228. return;
  229. }
  230. var к = (м.цель == 1) ? 1 : -1;
  231. мир.колобок.alpha += к * м.шаг;
  232. if ((мир.колобок.alpha <= 0) || (мир.колобок.alpha >= 1))
  233. {
  234. м.цель = к * -1;
  235. }
  236. };
  237. // // // //
  238. УменьшитьПрыгучестьКолобка = мир =>
  239. {
  240. мир.колобок.коэффициентПрыгучести = 0.6;
  241. };
  242. // // // //
  243. ВосстановитьПрыгучестьКолобка = мир =>
  244. {
  245. мир.колобок.коэффициентПрыгучести = 1;
  246. };
  247. // // // //
  248. ВывестиНачалоПрыжкаВКонсоль = мир =>
  249. {
  250. console.debug("начало прыжка");
  251. };
  252. ВывестиОкончаниеПрыжкаВКонсоль = мир =>
  253. {
  254. console.debug("окончание прыжка. скорость:", мир.колобок.скоростьПадения);
  255. };
  256. /*
  257. *
  258. * Последовательность
  259. *
  260. */
  261. мир.разобрать(`
  262. загрузить ресурсы сцены
  263. загрузить ресурсы колобка
  264. создать сцену
  265. создать колобка
  266. создать анимации колобка
  267. настроить столкновение колобка
  268. столкновение с врагом
  269. начать мигание колобка
  270. обновить сцену
  271. переместить колобка
  272. анимировать колобка
  273. определить окончание прыжка колобка
  274. мигать колобка
  275. # остановить передвижение вещей
  276. колобок начал прыжок
  277. воспроизвести звук прыжка
  278. вывести начало прыжка в консоль
  279. колобок закончил прыжок
  280. вывести окончание прыжка в консоль
  281. начали мигать колобка
  282. # отключить столкновение с платформами и вещами
  283. # уменьшить прыгучесть колобка
  284. закончили мигать колобка
  285. включить столкновение с платформами и вещами
  286. восстановить прыгучесть колобка
  287. `);