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

669 lines
19KB

  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.audio("пуск-стрелы", "ресурсы/звуки/521552__omerbhatti34__arrow-impact.mp3");
  11. мир.сцена.load.audio("удар-стрелы", "ресурсы/звуки/330800__czarcazas__shattering-glass-small.mp3");
  12. мир.сцена.load.audio("выломали-окно", "ресурсы/звуки/448004__kneeling__break-window.mp3");
  13. мир.сцена.load.image("основа", "ресурсы/отладка/основа.jpg");
  14. мир.сцена.load.image("линия", "ресурсы/отладка/линия_вертикальная.png");
  15. мир.сцена.load.image("изба", "ресурсы/сцены/изба.jpg");
  16. мир.сцена.load.image("молоко", "ресурсы/вещи/банка_молока.png");
  17. мир.сцена.load.image("паук", "ресурсы/животные/паук.png");
  18. мир.сцена.load.image("мышь", "ресурсы/животные/мышь.png");
  19. мир.сцена.load.image("мышь", "ресурсы/животные/мышь.png");
  20. мир.сцена.load.image("самовар", "ресурсы/вещи/самовар.png");
  21. мир.сцена.load.image("стрела", "ресурсы/вещи/стрела.png");
  22. мир.сцена.load.image("окно-разбито", "ресурсы/вещи/окно_разбитая-часть.png");
  23. мир.сцена.load.image("окно-выломано", "ресурсы/вещи/окно_дыра.png");
  24. };
  25. // // // //
  26. ЗадатьСтруктуруИзбы = мир =>
  27. {
  28. мир.изба = {
  29. фон: {
  30. родитель: мир.сцена,
  31. тип: "изображение",
  32. x: 0,
  33. y: 0,
  34. texture: "изба",
  35. originX: 0,
  36. originY: 0,
  37. },
  38. полДоКрышки: {
  39. родитель: мир.каркас,
  40. тип: "платформа",
  41. x: 0,
  42. y: 585,
  43. texture: "основа",
  44. originX: 0,
  45. originY: 0,
  46. scaleX: 43,
  47. visible: false,
  48. },
  49. полКрышки: {
  50. родитель: мир.каркас,
  51. тип: "платформа",
  52. x: 300,
  53. y: 585,
  54. texture: "основа",
  55. originX: 0,
  56. originY: 0,
  57. scaleX: 30,
  58. visible: false,
  59. },
  60. полПослеКрышки: {
  61. родитель: мир.каркас,
  62. тип: "платформа",
  63. x: 510,
  64. y: 585,
  65. texture: "основа",
  66. originX: 0,
  67. originY: 0,
  68. scaleX: 200,
  69. visible: false,
  70. },
  71. леваяСтена: {
  72. родитель: мир.каркас,
  73. тип: "платформа",
  74. x: 0,
  75. y: 200,
  76. texture: "основа",
  77. originX: 0,
  78. originY: 0,
  79. scaleY: 50,
  80. visible: false,
  81. },
  82. праваяСтена: {
  83. родитель: мир.каркас,
  84. тип: "платформа",
  85. x: 2000,
  86. y: 200,
  87. texture: "основа",
  88. originX: 0,
  89. originY: 0,
  90. scaleY: 50,
  91. visible: false,
  92. },
  93. };
  94. };
  95. // // // //
  96. СоздатьИзбуПоСтруктуре = мир =>
  97. {
  98. var структура = мир.изба;
  99. var сцена = мир.сцена;
  100. for (var имя in структура)
  101. {
  102. var узел = null;
  103. var описание = структура[имя];
  104. var свойства = {};
  105. Object.assign(свойства, описание);
  106. delete свойства["тип"];
  107. delete свойства["x"];
  108. delete свойства["y"];
  109. delete свойства["texture"];
  110. // Создаём узел.
  111. if (описание.тип == "изображение")
  112. {
  113. узел = описание.родитель.add.image(описание.x, описание.y, описание.texture);
  114. }
  115. else if (описание.тип == "платформа")
  116. {
  117. узел = описание.родитель.create(описание.x, описание.y, описание.texture);
  118. }
  119. else if (описание.тип == "спрайт")
  120. {
  121. }
  122. узел.name = имя;
  123. // Выставляем оставшиеся невыставленными свойства.
  124. for (var свойство in свойства)
  125. {
  126. var значение = свойства[свойство];
  127. узел[свойство] = значение;
  128. }
  129. // Необходимо после смены originX/Y.
  130. узел.updateDisplayOrigin();
  131. // Необходимо для статических физических объектов.
  132. if ("refreshBody" in узел)
  133. {
  134. узел.refreshBody();
  135. }
  136. console.debug(имя, описание, узел);
  137. }
  138. };
  139. // // // //
  140. СоздатьИзбу = мир =>
  141. {
  142. мир.сцена.sound.play("звук-избы", { loop: true });
  143. мир.разбитоеОкно = мир.сцена.add.image(1660, 183, "окно-разбито");
  144. мир.разбитоеОкно.setOrigin(0, 0).setScale(0.75, 0.75);
  145. мир.разбитоеОкно.setVisible(false);
  146. мир.выломанноеОкно = мир.сцена.add.image(1660, 183, "окно-выломано");
  147. мир.выломанноеОкно.setOrigin(0, 0).setScale(0.75, 0.75);
  148. мир.выломанноеОкно.setVisible(false);
  149. };
  150. // // // //
  151. СоздатьПлатформы = мир =>
  152. {
  153. var п = [
  154. {
  155. x: 583,
  156. y: 473,
  157. ширина: 65,
  158. },
  159. // Полка 1.
  160. {
  161. x: 666,
  162. y: 335,
  163. ширина: 3,
  164. },
  165. // Полка молока.
  166. {
  167. x: 771,
  168. y: 335,
  169. ширина: 3,
  170. },
  171. // Полка 3.
  172. {
  173. x: 862,
  174. y: 335,
  175. ширина: 3,
  176. },
  177. // Полка самовара.
  178. {
  179. x: 995,
  180. y: 355,
  181. ширина: 4,
  182. },
  183. {
  184. x: 620,
  185. y: 245,
  186. ширина: 35,
  187. },
  188. {
  189. x: 950,
  190. y: 180,
  191. ширина: 12,
  192. },
  193. // Стол.
  194. {
  195. x: 1270,
  196. y: 427,
  197. ширина: 70,
  198. },
  199. // Окно.
  200. {
  201. x: 1690,
  202. y: 375,
  203. ширина: 20,
  204. },
  205. ];
  206. for (var номер in п)
  207. {
  208. var часть = п[номер];
  209. var элемент = мир.платформы.create(часть.x, часть.y, "основа").setOrigin(0, 0);
  210. элемент.setScale(часть.ширина, 1).refreshBody();
  211. элемент.setVisible(false);
  212. }
  213. };
  214. // // // //
  215. ПозволитьПлатформамПропускатьПрыжки = мир =>
  216. {
  217. мир.платформы.children.iterate(function(платформа) {
  218. платформа.body.checkCollision.down = false;
  219. платформа.body.checkCollision.left = false;
  220. платформа.body.checkCollision.right = false;
  221. });
  222. };
  223. // // // //
  224. СоздатьВещи = мир =>
  225. {
  226. var молоко = мир.сцена.physics.add.sprite(785, 240, "молоко");
  227. молоко.setScale(0.4, 0.4).refreshBody();
  228. молоко.depth = 5;
  229. мир.вещи.add(молоко);
  230. var самовар = мир.сцена.physics.add.sprite(1003, 200, "самовар");
  231. самовар.setScale(0.25, 0.25).refreshBody();
  232. самовар.depth = 5;
  233. мир.вещи.add(самовар);
  234. };
  235. // // // //
  236. СоздатьПауков = мир =>
  237. {
  238. мир.настройкиПауков = [
  239. {
  240. x: 620,
  241. y: 345,
  242. скорость: 50,
  243. низ: 550,
  244. верх: 270,
  245. },
  246. {
  247. x: 785,
  248. y: 375,
  249. скорость: 80,
  250. низ: 400,
  251. верх: 270,
  252. },
  253. {
  254. x: 930,
  255. y: 500,
  256. скорость: 70,
  257. низ: 550,
  258. верх: 270,
  259. },
  260. {
  261. x: 1003,
  262. y: 250,
  263. скорость: 40,
  264. низ: 400,
  265. верх: 200,
  266. },
  267. ];
  268. мир.пауки = [];
  269. мир.нитиПауков = [];
  270. for (var номер in мир.настройкиПауков)
  271. {
  272. var настройки = мир.настройкиПауков[номер];
  273. var паук = мир.враги.create(настройки.x, настройки.y, "паук");
  274. паук.body.setVelocityY(настройки.скорость);
  275. паук.depth = 10;
  276. мир.пауки.push(паук);
  277. var нить = мир.сцена.add.image(настройки.x - 1, настройки.верх - 25, "линия").setOrigin(0, 0);
  278. нить.depth = паук.depth;
  279. мир.нитиПауков.push(нить);
  280. }
  281. };
  282. // // // //
  283. АнимироватьПауков = мир =>
  284. {
  285. for (var номер in мир.пауки)
  286. {
  287. var паук = мир.пауки[номер];
  288. var нить = мир.нитиПауков[номер];
  289. var настройки = мир.настройкиПауков[номер];
  290. нить.displayHeight = паук.y - нить.y - 5;
  291. if (паук.y > настройки.низ)
  292. {
  293. паук.setVelocityY(-настройки.скорость);
  294. } else if (паук.y < настройки.верх)
  295. {
  296. паук.setVelocityY(настройки.скорость);
  297. }
  298. }
  299. };
  300. // // // //
  301. СоздатьМышей = мир =>
  302. {
  303. мир.настройкиМышей= [
  304. {
  305. x: 350,
  306. y: 575,
  307. скорость: 290,
  308. },
  309. {
  310. x: 740,
  311. y: 575,
  312. скорость: 375,
  313. },
  314. ];
  315. мир.мыши = [];
  316. for (var номер in мир.настройкиМышей)
  317. {
  318. var настройки = мир.настройкиМышей[номер];
  319. var мышь = мир.враги.create(настройки.x, настройки.y, "мышь");
  320. мышь.body.setVelocityX(настройки.скорость);
  321. мышь.depth = 10;
  322. мышь.flipX = true;
  323. мир.мыши.push(мышь);
  324. }
  325. };
  326. // // // //
  327. АнимироватьМышей = мир =>
  328. {
  329. for (var номер in мир.мыши)
  330. {
  331. var мышь= мир.мыши[номер];
  332. var скорость = мир.настройкиМышей[номер].скорость;
  333. if (мышь.x > 1950)
  334. {
  335. мышь.setVelocityX(-скорость);
  336. мышь.flipX = false;
  337. } else if (мышь.x < 50)
  338. {
  339. мышь.setVelocityX(скорость);
  340. мышь.flipX = true;
  341. }
  342. }
  343. };
  344. // // // //
  345. СоздатьСтрелы = мир =>
  346. {
  347. мир.пфСтрел = мир.сцена.physics.add.staticGroup();
  348. var куча = мир.пфСтрел.create(1270, 405, "основа").setOrigin(0, 0);
  349. куча.setScale(25, 2).refreshBody();
  350. куча.body.checkCollision.down = false;
  351. куча.setVisible(false);
  352. мир.пфЛук = мир.пфСтрел.create(1280, 200, "основа").setOrigin(0, 0);
  353. мир.пфЛук.body.checkCollision.down = false;
  354. мир.пфЛук.setVisible(false);
  355. var пуск = мир.пфСтрел.create(1270, 160, "основа").setOrigin(0, 0);
  356. пуск.setVisible(false);
  357. мир.пфОкно = мир.пфСтрел.create(1830, 200, "основа").setOrigin(0, 0);
  358. мир.пфОкно.setScale(1, 20).refreshBody();
  359. мир.пфОкно.setVisible(false);
  360. // Определение прыжка по стрелам.
  361. мир.сцена.physics.add.collider(мир.колобок, куча, function(a, b) {
  362. if (мир.колобок.body.touching.down) {
  363. мир.состояниеКолобка.прыжокПоСтрелам = true;
  364. console.debug("прыжок по стрелам");
  365. }
  366. });
  367. // Определение пуска стрелы.
  368. var стПуск = мир.сцена.physics.add.collider(мир.колобок, пуск);
  369. стПуск.collideCallback = function(a, b) {
  370. if (мир.стрелаЗаряжена && !мир.пускСтрелы)
  371. {
  372. мир.пускСтрелы = true;
  373. мир.уведомить("пуск стрелы");
  374. console.debug("пуск стрелы");
  375. }
  376. };
  377. стПуск.overlapOnly = true;
  378. };
  379. // // // //
  380. СоздатьСтрелу = мир =>
  381. {
  382. мир.стрелаЗаряжена = false;
  383. мир.пускСтрелы = false;
  384. мир.стрела = мир.сцена.physics.add.sprite(1250, 397, "стрела").setOrigin(0, 0);
  385. мир.стрела.setScale(0.5, 0.5).refreshBody();
  386. мир.стрела.depth = 5;
  387. мир.сцена.physics.add.collider(мир.стрела, мир.каркас);
  388. мир.сцена.physics.add.collider(мир.стрела, мир.платформы);
  389. // Определение заряда стрелы.
  390. var стЛук = мир.сцена.physics.add.collider(мир.стрела, мир.пфЛук);
  391. стЛук.collideCallback = function заряд(a, b) {
  392. if (мир.стрела.body.touching.down && !мир.стрелаЗаряжена)
  393. {
  394. мир.стрелаЗаряжена = true;
  395. мир.уведомить("стрела заряжена");
  396. console.debug("стрела заряжена");
  397. }
  398. };
  399. // Определение столкновения с окном.
  400. var стОкно = мир.сцена.physics.add.collider(мир.стрела, мир.пфОкно);
  401. стОкно.collideCallback = function(a, b) {
  402. if (мир.стрелаЗаряжена && мир.пускСтрелы)
  403. {
  404. мир.стрелаЗаряжена = false;
  405. мир.пускСтрелы = false;
  406. мир.уведомить("удар стрелы об окно");
  407. console.debug("удар стрелы об окно");
  408. }
  409. };
  410. console.debug("стрела.x", мир.стрела.x);
  411. };
  412. // // // //
  413. ОтследитьПрыжокПоСтрелам = мир =>
  414. {
  415. мир.состояниеКолобка.прыжокПоСтрелам = null;
  416. };
  417. // // // //
  418. ПроверитьНаличиеПрыжкаПоСтрелам = мир =>
  419. {
  420. if (!мир.состояниеКолобка.прыжокПоСтрелам)
  421. {
  422. return;
  423. }
  424. мир.уведомить("прыжок по платформе стрел");
  425. };
  426. // // // //
  427. ПодкидыватьСтрелуКЛуку = мир =>
  428. {
  429. if (!мир.стрела.body.touching.down || мир.стрелаЗаряжена)
  430. {
  431. return;
  432. }
  433. var скорость = мир.состояниеКолобка.скоростьПадения * 0.9;
  434. мир.стрела.setVelocityY(-скорость);
  435. };
  436. // // // //
  437. ВоспроизвестиЗвукЗарядкиСтрелы = мир =>
  438. {
  439. мир.сцена.sound.play("звук-зарядки");
  440. };
  441. // // // //
  442. ВоспроизвестиЗвукПускаСтрелы = мир =>
  443. {
  444. мир.сцена.sound.play("пуск-стрелы");
  445. };
  446. // // // //
  447. ПуститьСтрелу = мир =>
  448. {
  449. мир.стрела.setVelocityX(1200);
  450. };
  451. // // // //
  452. ВоспроизвестиЗвукУдараСтрелыОбОкно = мир =>
  453. {
  454. мир.сцена.sound.play("удар-стрелы");
  455. };
  456. // // // //
  457. ОтобразитьРазбитоеОкно = мир =>
  458. {
  459. мир.разбитоеОкно.setVisible(true);
  460. };
  461. // // // //
  462. ОтобразитьВыломанноеОкно = мир =>
  463. {
  464. мир.разбитоеОкно.setVisible(false);
  465. мир.выломанноеОкно.setVisible(true);
  466. };
  467. // // // //
  468. УведомитьСразуПослеУдара = мир =>
  469. {
  470. setTimeout(
  471. function() {
  472. мир.уведомить("сразу после удара");
  473. },
  474. 1
  475. );
  476. };
  477. // // // //
  478. ПодсчитатьУдарыСтрелыОбОкно = мир =>
  479. {
  480. if (!мир.ударовСтрелыОбОкно)
  481. {
  482. мир.ударовСтрелыОбОкно = 1;
  483. мир.уведомить("первый удар стрелы об окно");
  484. }
  485. else if (мир.ударовСтрелыОбОкно == 1)
  486. {
  487. мир.ударовСтрелыОбОкно = 2;
  488. мир.уведомить("второй удар стрелы об окно");
  489. }
  490. };
  491. // // // //
  492. ВоспроизвестиЗвукВыломанногоОкна = мир =>
  493. {
  494. мир.сцена.sound.play("выломали-окно");
  495. };
  496. /*
  497. *
  498. * Последовательность
  499. *
  500. */
  501. мир.разобрать(`
  502. загрузить ресурсы сцены
  503. загрузить ресурсы избы
  504. создать сцену
  505. задать структуру избы
  506. создать избу по структуре
  507. создать избу
  508. создать платформы
  509. позволить платформам пропускать прыжки
  510. создать вещи
  511. создать пауков
  512. создать мышей
  513. создать стрелы
  514. создать стрелу
  515. обновить сцену
  516. анимировать пауков
  517. анимировать мышей
  518. колобок начал прыжок
  519. отследить прыжок по стрелам
  520. колобок закончил прыжок
  521. проверить наличие прыжка по стрелам
  522. прыжок по платформе стрел
  523. подкидывать стрелу к луку
  524. стрела заряжена
  525. воспроизвести звук зарядки стрелы
  526. пуск стрелы
  527. воспроизвести звук пуска стрелы
  528. пустить стрелу
  529. удар стрелы об окно
  530. воспроизвести звук удара стрелы об окно
  531. уведомить сразу после удара
  532. подсчитать удары стрелы об окно
  533. первый удар стрелы об окно
  534. отобразить разбитое окно
  535. второй удар стрелы об окно
  536. отобразить выломанное окно
  537. воспроизвести звук выломанного окна
  538. сразу после удара
  539. создать стрелу
  540. `);