Колобок на Phaser
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

433 行
12KB

  1. /*
  2. *
  3. * Реакции
  4. *
  5. */
  6. ЗагрузитьРесурсыИзбы = мир =>
  7. {
  8. мир.сцена.load.audio("звук-избы", "ресурсы/звуки/387922__setuniman__scheming-1o95.mp3");
  9. мир.сцена.load.audio("звук-зарядки", "ресурсы/звуки/543927__eminyildirim__pistol-gun-cocking.wav");
  10. мир.сцена.load.image("основа", "ресурсы/отладка/основа.jpg");
  11. мир.сцена.load.image("линия", "ресурсы/отладка/линия_вертикальная.png");
  12. мир.сцена.load.image("изба", "ресурсы/сцены/изба.jpg");
  13. мир.сцена.load.image("молоко", "ресурсы/вещи/банка_молока.png");
  14. мир.сцена.load.image("паук", "ресурсы/животные/паук.png");
  15. мир.сцена.load.image("мышь", "ресурсы/животные/мышь.png");
  16. мир.сцена.load.image("мышь", "ресурсы/животные/мышь.png");
  17. мир.сцена.load.image("самовар", "ресурсы/вещи/самовар.png");
  18. мир.сцена.load.image("стрела", "ресурсы/вещи/стрела.png");
  19. };
  20. // // // //
  21. СоздатьИзбу = мир =>
  22. {
  23. мир.сцена.sound.play("звук-избы", { loop: true });
  24. мир.сцена.add.image(0, 0, "изба").setOrigin(0, 0);
  25. };
  26. // // // //
  27. СоздатьПолыИСтеныКаркаса = мир =>
  28. {
  29. var полы = [
  30. {
  31. x: 0,
  32. y: 585,
  33. ширина: 43,
  34. },
  35. {
  36. x: 300,
  37. y: 585,
  38. ширина: 30,
  39. },
  40. {
  41. x: 510,
  42. y: 585,
  43. ширина: 200,
  44. },
  45. ];
  46. for (var номер in полы)
  47. {
  48. var пол = полы[номер];
  49. var элемент = мир.каркас.create(пол.x, пол.y, "основа").setOrigin(0, 0);
  50. элемент.setScale(пол.ширина, 1).refreshBody();
  51. элемент.setVisible(false);
  52. }
  53. var стены = [
  54. {
  55. x: 0,
  56. y: 385,
  57. высота: 50,
  58. },
  59. {
  60. x: 2000,
  61. y: 385,
  62. высота: 50,
  63. },
  64. ];
  65. for (var номер in стены)
  66. {
  67. var стена = стены[номер];
  68. var элемент = мир.каркас.create(стена.x, стена.y, "основа");
  69. элемент.setScale(1, стена.высота).refreshBody();
  70. элемент.setVisible(false);
  71. }
  72. };
  73. // // // //
  74. СоздатьПлатформы = мир =>
  75. {
  76. var п = [
  77. {
  78. x: 583,
  79. y: 473,
  80. ширина: 65,
  81. },
  82. // Полка 1.
  83. {
  84. x: 666,
  85. y: 335,
  86. ширина: 3,
  87. },
  88. // Полка молока.
  89. {
  90. x: 771,
  91. y: 335,
  92. ширина: 3,
  93. },
  94. // Полка 3.
  95. {
  96. x: 862,
  97. y: 335,
  98. ширина: 3,
  99. },
  100. // Полка самовара.
  101. {
  102. x: 995,
  103. y: 355,
  104. ширина: 4,
  105. },
  106. {
  107. x: 620,
  108. y: 245,
  109. ширина: 35,
  110. },
  111. {
  112. x: 950,
  113. y: 180,
  114. ширина: 12,
  115. },
  116. // Стол.
  117. {
  118. x: 1270,
  119. y: 427,
  120. ширина: 70,
  121. },
  122. // Окно.
  123. {
  124. x: 1690,
  125. y: 375,
  126. ширина: 20,
  127. },
  128. ];
  129. for (var номер in п)
  130. {
  131. var часть = п[номер];
  132. var элемент = мир.платформы.create(часть.x, часть.y, "основа").setOrigin(0, 0);
  133. элемент.setScale(часть.ширина, 1).refreshBody();
  134. элемент.setVisible(false);
  135. }
  136. };
  137. // // // //
  138. ПозволитьПлатформамПропускатьПрыжки = мир =>
  139. {
  140. мир.платформы.children.iterate(function(платформа) {
  141. платформа.body.checkCollision.down = false;
  142. платформа.body.checkCollision.left = false;
  143. платформа.body.checkCollision.right = false;
  144. });
  145. };
  146. // // // //
  147. СоздатьВещи = мир =>
  148. {
  149. var молоко = мир.сцена.physics.add.sprite(785, 240, "молоко");
  150. молоко.setScale(0.4, 0.4).refreshBody();
  151. молоко.depth = 5;
  152. мир.вещи.add(молоко);
  153. var самовар = мир.сцена.physics.add.sprite(1003, 200, "самовар");
  154. самовар.setScale(0.25, 0.25).refreshBody();
  155. самовар.depth = 5;
  156. мир.вещи.add(самовар);
  157. };
  158. // // // //
  159. СоздатьПауков = мир =>
  160. {
  161. мир.настройкиПауков = [
  162. {
  163. x: 620,
  164. y: 345,
  165. скорость: 50,
  166. низ: 550,
  167. верх: 270,
  168. },
  169. {
  170. x: 785,
  171. y: 375,
  172. скорость: 80,
  173. низ: 400,
  174. верх: 270,
  175. },
  176. {
  177. x: 930,
  178. y: 500,
  179. скорость: 70,
  180. низ: 550,
  181. верх: 270,
  182. },
  183. {
  184. x: 1003,
  185. y: 250,
  186. скорость: 55,
  187. низ: 400,
  188. верх: 200,
  189. },
  190. ];
  191. мир.пауки = [];
  192. мир.нитиПауков = [];
  193. for (var номер in мир.настройкиПауков)
  194. {
  195. var настройки = мир.настройкиПауков[номер];
  196. var паук = мир.враги.create(настройки.x, настройки.y, "паук");
  197. паук.body.setVelocityY(настройки.скорость);
  198. паук.depth = 10;
  199. мир.пауки.push(паук);
  200. var нить = мир.сцена.add.image(настройки.x - 1, настройки.верх - 25, "линия").setOrigin(0, 0);
  201. нить.depth = паук.depth;
  202. мир.нитиПауков.push(нить);
  203. }
  204. };
  205. // // // //
  206. АнимироватьПауков = мир =>
  207. {
  208. for (var номер in мир.пауки)
  209. {
  210. var паук = мир.пауки[номер];
  211. var нить = мир.нитиПауков[номер];
  212. var настройки = мир.настройкиПауков[номер];
  213. нить.displayHeight = паук.y - нить.y - 5;
  214. if (паук.y > настройки.низ)
  215. {
  216. паук.setVelocityY(-настройки.скорость);
  217. } else if (паук.y < настройки.верх)
  218. {
  219. паук.setVelocityY(настройки.скорость);
  220. }
  221. }
  222. };
  223. // // // //
  224. СоздатьМышей = мир =>
  225. {
  226. мир.настройкиМышей= [
  227. {
  228. x: 350,
  229. y: 575,
  230. скорость: 290,
  231. },
  232. {
  233. x: 740,
  234. y: 575,
  235. скорость: 375,
  236. },
  237. ];
  238. мир.мыши = [];
  239. for (var номер in мир.настройкиМышей)
  240. {
  241. var настройки = мир.настройкиМышей[номер];
  242. var мышь = мир.враги.create(настройки.x, настройки.y, "мышь");
  243. мышь.body.setVelocityX(настройки.скорость);
  244. мышь.depth = 10;
  245. мышь.flipX = true;
  246. мир.мыши.push(мышь);
  247. }
  248. };
  249. // // // //
  250. АнимироватьМышей = мир =>
  251. {
  252. for (var номер in мир.мыши)
  253. {
  254. var мышь= мир.мыши[номер];
  255. var скорость = мир.настройкиМышей[номер].скорость;
  256. if (мышь.x > 1950)
  257. {
  258. мышь.setVelocityX(-скорость);
  259. мышь.flipX = false;
  260. } else if (мышь.x < 50)
  261. {
  262. мышь.setVelocityX(скорость);
  263. мышь.flipX = true;
  264. }
  265. }
  266. };
  267. // // // //
  268. СоздатьСтрелы = мир =>
  269. {
  270. мир.стрелаЗаряжена = false;
  271. // Кучка стрел.
  272. var группаСтрел = мир.сцена.physics.add.staticGroup();
  273. var стрелы = группаСтрел.create(1270, 405, "основа").setOrigin(0, 0);
  274. стрелы.setScale(25, 2).refreshBody();
  275. стрелы.body.checkCollision.down = false;
  276. стрелы.setVisible(false);
  277. var столкновение = мир.сцена.physics.add.collider(мир.колобок, стрелы);
  278. столкновение.collideCallback = function(a, b) {
  279. мир.состояниеКолобка.прыжокПоСтрелам = true;
  280. };
  281. // Стрела в луку.
  282. мир.стрелаКЛуку = мир.сцена.physics.add.sprite(1250, 380, "стрела").setOrigin(0, 0);
  283. мир.стрелаКЛуку.setScale(0.5, 0.5).refreshBody();
  284. мир.стрелаКЛуку.depth = 15;
  285. // Учитываем платформы.
  286. мир.сцена.physics.add.collider(мир.стрелаКЛуку, мир.каркас);
  287. мир.сцена.physics.add.collider(мир.стрелаКЛуку, мир.платформы);
  288. // Платформа для стрелы у лука, чтобы стрела оставалась в луке.
  289. var платформы = мир.сцена.physics.add.staticGroup();
  290. var платформаЛука = платформы.create(1280, 200, "основа").setOrigin(0, 0);
  291. платформаЛука.body.checkCollision.down = false;
  292. var столкновениеЛука = мир.сцена.physics.add.collider(мир.стрелаКЛуку, платформаЛука);
  293. платформаЛука.setVisible(false);
  294. // Определение заряда стрелы.
  295. столкновениеЛука.collideCallback = function заряд(a, b) {
  296. if (мир.стрелаКЛуку.body.touching.down && !мир.стрелаЗаряжена)
  297. {
  298. мир.стрелаЗаряжена = true;
  299. мир.уведомить("стрела заряжена");
  300. }
  301. }
  302. };
  303. // // // //
  304. ОтследитьПрыжокПоСтрелам = мир =>
  305. {
  306. мир.состояниеКолобка.прыжокПоСтрелам = null;
  307. };
  308. // // // //
  309. ПроверитьНаличиеПрыжкаПоСтрелам = мир =>
  310. {
  311. if (!мир.состояниеКолобка.прыжокПоСтрелам)
  312. {
  313. return;
  314. }
  315. мир.уведомить("прыжок по платформе стрел");
  316. };
  317. // // // //
  318. ПодкидыватьСтрелуКЛуку = мир =>
  319. {
  320. if (!мир.стрелаКЛуку.body.touching.down || мир.стрелаЗаряжена)
  321. {
  322. return;
  323. }
  324. var скорость = мир.состояниеКолобка.скоростьПадения * 0.9;
  325. мир.стрелаКЛуку.setVelocityY(-скорость);
  326. };
  327. // // // //
  328. ВоспроизвестиЗвукЗарядкиСтрелы = мир =>
  329. {
  330. мир.сцена.sound.play("звук-зарядки");
  331. };
  332. /*
  333. *
  334. * Последовательность
  335. *
  336. */
  337. мир.разобрать(`
  338. загрузить ресурсы сцены
  339. загрузить ресурсы избы
  340. создать сцену
  341. создать избу
  342. создать полы и стены каркаса
  343. создать платформы
  344. позволить платформам пропускать прыжки
  345. создать вещи
  346. создать пауков
  347. создать мышей
  348. создать стрелы
  349. обновить сцену
  350. анимировать пауков
  351. анимировать мышей
  352. колобок начал прыжок
  353. отследить прыжок по стрелам
  354. колобок закончил прыжок
  355. проверить наличие прыжка по стрелам
  356. прыжок по платформе стрел
  357. подкидывать стрелу к луку
  358. стрела заряжена
  359. воспроизвести звук зарядки стрелы
  360. `);