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

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