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

409 lines
12KB

  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 (кк.down && кв.up && мир.колобок.прыжок)
  80. {
  81. мир.колобок.вещь = вещь.name;
  82. мир.уведомить("колобок прыгнул на вещь");
  83. }
  84. // Передвижение вещей.
  85. if (кк.down && (кк.left || кк.right) && (кв.left || кв.right))
  86. {
  87. мир.колобок.датаПередвиженияВещи = new Date();
  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 вещи = мир.вещи.getChildren();
  190. for (var н in вещи)
  191. {
  192. var вещь = вещи[н];
  193. if (вещь.body.touching.down)
  194. {
  195. вещь.body.stop();
  196. }
  197. }
  198. };
  199. // // // //
  200. НачатьМиганиеКолобка = мир =>
  201. {
  202. var конец = new Date();
  203. конец.setSeconds(конец.getSeconds() + 6);
  204. мир.колобок.мигание.окончание = конец;
  205. var звук = мир.сцена.sound.get("повреждение");
  206. if (!звук || !звук.isPlaying)
  207. {
  208. мир.сцена.sound.play("повреждение");
  209. }
  210. if (мир.колобок.мигать)
  211. {
  212. return;
  213. }
  214. мир.колобок.мигать = true;
  215. мир.колобок.мигание = {
  216. шаг: 0.1,
  217. цель: 0,
  218. };
  219. мир.уведомить("начали мигать колобка");
  220. };
  221. // // // //
  222. МигатьКолобка = мир =>
  223. {
  224. if (!мир.колобок.мигать)
  225. {
  226. return;
  227. }
  228. var м = мир.колобок.мигание;
  229. var сейчас = new Date();
  230. if (м.окончание - сейчас < 0)
  231. {
  232. мир.колобок.мигать = false;
  233. мир.колобок.alpha = 1;
  234. мир.уведомить("закончили мигать колобка");
  235. return;
  236. }
  237. var к = (м.цель == 1) ? 1 : -1;
  238. мир.колобок.alpha += к * м.шаг;
  239. if ((мир.колобок.alpha <= 0) || (мир.колобок.alpha >= 1))
  240. {
  241. м.цель = к * -1;
  242. }
  243. };
  244. // // // //
  245. УменьшитьПрыгучестьКолобка = мир =>
  246. {
  247. мир.колобок.коэффициентПрыгучести = 0.6;
  248. };
  249. // // // //
  250. ВосстановитьПрыгучестьКолобка = мир =>
  251. {
  252. мир.колобок.коэффициентПрыгучести = 1;
  253. };
  254. // // // //
  255. ВывестиНачалоПрыжкаВКонсоль = мир =>
  256. {
  257. console.debug("начало прыжка");
  258. };
  259. ВывестиОкончаниеПрыжкаВКонсоль = мир =>
  260. {
  261. console.debug("окончание прыжка. скорость:", мир.колобок.скоростьПадения);
  262. };
  263. // // // //
  264. ОпределитьПередвижениеВещей = мир =>
  265. {
  266. if (!мир.колобок.датаПередвиженияВещи)
  267. {
  268. return;
  269. }
  270. var было = мир.колобок.передвижениеВещи != null ? мир.колобок.передвижениеВещи : false;
  271. var стало = new Date() - мир.колобок.датаПередвиженияВещи < 10;
  272. if (было != стало)
  273. {
  274. мир.колобок.передвижениеВещи = стало;
  275. if (стало)
  276. {
  277. console.debug("колобок начал передвижение вещи");
  278. мир.уведомить("колобок начал передвижение вещи");
  279. }
  280. else
  281. {
  282. console.debug("колобок закончил передвижение вещи");
  283. мир.уведомить("колобок закончил передвижение вещи");
  284. }
  285. }
  286. };
  287. /*
  288. *
  289. * Последовательность
  290. *
  291. */
  292. мир.разобрать(`
  293. загрузить ресурсы сцены
  294. загрузить ресурсы колобка
  295. создать сцену
  296. создать колобка
  297. создать анимации колобка
  298. настроить столкновение колобка
  299. столкновение с врагом
  300. начать мигание колобка
  301. обновить сцену
  302. переместить колобка
  303. анимировать колобка
  304. определить окончание прыжка колобка
  305. мигать колобка
  306. определить передвижение вещей
  307. # остановить передвижение вещей
  308. колобок начал прыжок
  309. воспроизвести звук прыжка
  310. вывести начало прыжка в консоль
  311. колобок закончил прыжок
  312. вывести окончание прыжка в консоль
  313. начали мигать колобка
  314. # отключить столкновение с платформами и вещами
  315. # уменьшить прыгучесть колобка
  316. закончили мигать колобка
  317. включить столкновение с платформами и вещами
  318. восстановить прыгучесть колобка
  319. `);