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

374 lines
11KB

  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. var касание = мир.колобок.body.touching;
  78. if (касание.down && вещь.body.touching.up && мир.колобок.прыжок)
  79. {
  80. мир.колобок.вещь = вещь.name;
  81. мир.уведомить("колобок прыгнул на вещь");
  82. }
  83. //if (мир.колобок.body.touching.down && (мир.колобок.body.touching.left || мир.коло
  84. };
  85. var столкновениеВраги = мир.сцена.physics.add.collider(мир.колобок, мир.враги);
  86. столкновениеВраги.overlapOnly = true;
  87. столкновениеВраги.collideCallback = function(a, b) {
  88. мир.уведомить("столкновение с врагом");
  89. };
  90. };
  91. // // // //
  92. ПереместитьКолобка = мир =>
  93. {
  94. if (!мир.управление)
  95. {
  96. мир.колобок.setVelocityX(0);
  97. return;
  98. }
  99. var x = 0;
  100. if (мир.управление.направление == -1)
  101. {
  102. x = -200;
  103. мир.колобок.flipX = true;
  104. }
  105. else if (мир.управление.направление == 1)
  106. {
  107. x = 200;
  108. мир.колобок.flipX = false;
  109. }
  110. мир.колобок.setVelocityX(x);
  111. if (мир.управление.прыжок && !мир.колобок.прыжок)
  112. {
  113. мир.колобок.прыжок = true;
  114. var скорость = мир.колобок.прыгучесть * мир.колобок.коэффициентПрыгучести;
  115. мир.колобок.setVelocityY(скорость);
  116. мир.уведомить("колобок начал прыжок");
  117. }
  118. };
  119. // // // //
  120. ВоспроизвестиЗвукПрыжка = мир =>
  121. {
  122. мир.сцена.sound.play("прыжок");
  123. };
  124. // // // //
  125. ОпределитьОкончаниеПрыжкаКолобка = мир =>
  126. {
  127. if (!мир.колобок.прыжок)
  128. {
  129. return;
  130. }
  131. var скоростьПадения = мир.колобок.body.velocity.y;
  132. if (
  133. (
  134. мир.колобок.скоростьПадения > 40 ||
  135. мир.колобок.скоростьПадения == 0
  136. ) &&
  137. (скоростьПадения == 0) &&
  138. мир.колобок.body.touching.down
  139. ) {
  140. мир.уведомить("колобок закончит прыжок");
  141. мир.колобок.прыжок = false;
  142. мир.уведомить("колобок закончил прыжок");
  143. }
  144. мир.колобок.скоростьПадения = скоростьПадения;
  145. };
  146. // // // //
  147. АнимироватьКолобка = мир =>
  148. {
  149. var есть = "";
  150. if (мир.колобок.anims.currentAnim)
  151. {
  152. есть = мир.колобок.anims.currentAnim.key;
  153. }
  154. var надо = "колобок-неподвижен";
  155. if (мир.колобок.прыжок)
  156. {
  157. надо = "колобок-прыжок";
  158. }
  159. else if (мир.колобок.body.velocity.x != 0)
  160. {
  161. надо = "колобок-движение";
  162. }
  163. if (есть != надо)
  164. {
  165. мир.колобок.anims.play(надо);
  166. мир.уведомить("изменили анимацию колобка");
  167. }
  168. };
  169. // // // //
  170. ОтключитьСтолкновениеСПлатформамиИВещами = мир =>
  171. {
  172. мир.столкновениеПлатформы.active = false;
  173. мир.столкновениеВещи.active = false;
  174. };
  175. // // // //
  176. ВключитьСтолкновениеСПлатформамиИВещами = мир =>
  177. {
  178. мир.столкновениеПлатформы.active = true;
  179. мир.столкновениеВещи.active = true;
  180. };
  181. // // // //
  182. ОстановитьПередвижениеВещей = мир =>
  183. {
  184. var вещи = мир.вещи.getChildren();
  185. for (var н in вещи)
  186. {
  187. var вещь = вещи[н];
  188. if (вещь.body.touching.down)
  189. {
  190. вещь.body.stop();
  191. }
  192. }
  193. };
  194. // // // //
  195. НачатьМиганиеКолобка = мир =>
  196. {
  197. var конец = new Date();
  198. конец.setSeconds(конец.getSeconds() + 6);
  199. мир.колобок.мигание.окончание = конец;
  200. var звук = мир.сцена.sound.get("повреждение");
  201. if (!звук || !звук.isPlaying)
  202. {
  203. мир.сцена.sound.play("повреждение");
  204. }
  205. if (мир.колобок.мигать)
  206. {
  207. return;
  208. }
  209. мир.колобок.мигать = true;
  210. мир.колобок.мигание = {
  211. шаг: 0.1,
  212. цель: 0,
  213. };
  214. мир.уведомить("начали мигать колобка");
  215. };
  216. // // // //
  217. МигатьКолобка = мир =>
  218. {
  219. if (!мир.колобок.мигать)
  220. {
  221. return;
  222. }
  223. var м = мир.колобок.мигание;
  224. var сейчас = new Date();
  225. if (м.окончание - сейчас < 0)
  226. {
  227. мир.колобок.мигать = false;
  228. мир.колобок.alpha = 1;
  229. мир.уведомить("закончили мигать колобка");
  230. return;
  231. }
  232. var к = (м.цель == 1) ? 1 : -1;
  233. мир.колобок.alpha += к * м.шаг;
  234. if ((мир.колобок.alpha <= 0) || (мир.колобок.alpha >= 1))
  235. {
  236. м.цель = к * -1;
  237. }
  238. };
  239. // // // //
  240. УменьшитьПрыгучестьКолобка = мир =>
  241. {
  242. мир.колобок.коэффициентПрыгучести = 0.6;
  243. };
  244. // // // //
  245. ВосстановитьПрыгучестьКолобка = мир =>
  246. {
  247. мир.колобок.коэффициентПрыгучести = 1;
  248. };
  249. // // // //
  250. ВывестиНачалоПрыжкаВКонсоль = мир =>
  251. {
  252. console.debug("начало прыжка");
  253. };
  254. ВывестиОкончаниеПрыжкаВКонсоль = мир =>
  255. {
  256. console.debug("окончание прыжка. скорость:", мир.колобок.скоростьПадения);
  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. включить столкновение с платформами и вещами
  288. восстановить прыгучесть колобка
  289. `);