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

780 lines
22KB

  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. x: 583,
  97. y: 473,
  98. texture: "основа",
  99. originX: 0,
  100. originY: 0,
  101. scaleX: 65,
  102. visible: false,
  103. },
  104. полка1: {
  105. родитель: мир.платформы,
  106. тип: "платформа",
  107. x: 666,
  108. y: 335,
  109. texture: "основа",
  110. originX: 0,
  111. originY: 0,
  112. scaleX: 3,
  113. visible: false,
  114. },
  115. полкаМолока: {
  116. родитель: мир.платформы,
  117. тип: "платформа",
  118. x: 771,
  119. y: 335,
  120. texture: "основа",
  121. originX: 0,
  122. originY: 0,
  123. scaleX: 3,
  124. visible: false,
  125. },
  126. полка3: {
  127. родитель: мир.платформы,
  128. тип: "платформа",
  129. x: 862,
  130. y: 335,
  131. texture: "основа",
  132. originX: 0,
  133. originY: 0,
  134. scaleX: 3,
  135. visible: false,
  136. },
  137. полкаСамовара: {
  138. родитель: мир.платформы,
  139. тип: "платформа",
  140. x: 995,
  141. y: 355,
  142. texture: "основа",
  143. originX: 0,
  144. originY: 0,
  145. scaleX: 4,
  146. visible: false,
  147. },
  148. лежанкаПечи: {
  149. родитель: мир.платформы,
  150. тип: "платформа",
  151. x: 620,
  152. y: 245,
  153. texture: "основа",
  154. originX: 0,
  155. originY: 0,
  156. scaleX: 35,
  157. visible: false,
  158. },
  159. основаТрубыПечи: {
  160. родитель: мир.платформы,
  161. тип: "платформа",
  162. x: 950,
  163. y: 180,
  164. texture: "основа",
  165. originX: 0,
  166. originY: 0,
  167. scaleX: 12,
  168. visible: false,
  169. },
  170. стол: {
  171. родитель: мир.платформы,
  172. тип: "платформа",
  173. x: 1270,
  174. y: 427,
  175. texture: "основа",
  176. originX: 0,
  177. originY: 0,
  178. scaleX: 70,
  179. visible: false,
  180. },
  181. подоконник: {
  182. родитель: мир.платформы,
  183. тип: "платформа",
  184. x: 1690,
  185. y: 375,
  186. texture: "основа",
  187. originX: 0,
  188. originY: 0,
  189. scaleX: 20,
  190. visible: false,
  191. },
  192. разбитоеОкно: {
  193. родитель: мир.сцена,
  194. тип: "изображение",
  195. x: 1660,
  196. y: 183,
  197. texture: "окно-разбито",
  198. originX: 0,
  199. originY: 0,
  200. scaleX: 0.75,
  201. scaleY: 0.75,
  202. visible: false,
  203. },
  204. выломанноеОкно: {
  205. родитель: мир.сцена,
  206. тип: "изображение",
  207. x: 1660,
  208. y: 183,
  209. texture: "окно-выломано",
  210. originX: 0,
  211. originY: 0,
  212. scaleX: 0.75,
  213. scaleY: 0.75,
  214. visible: false,
  215. },
  216. молоко: {
  217. родитель: мир.сцена.physics,
  218. тип: "спрайт",
  219. группы: [мир.вещи],
  220. x: 785,
  221. y: 240,
  222. texture: "молоко",
  223. scaleX: 0.4,
  224. scaleY: 0.4,
  225. depth: 5,
  226. },
  227. самовар: {
  228. родитель: мир.сцена.physics,
  229. тип: "спрайт",
  230. группы: [мир.вещи],
  231. x: 1003,
  232. y: 200,
  233. texture: "самовар",
  234. scaleX: 0.25,
  235. scaleY: 0.25,
  236. depth: 5,
  237. },
  238. паук1: {
  239. родитель: мир.враги,
  240. тип: "платформа",
  241. x: 620,
  242. y: 345,
  243. texture: "паук",
  244. скорость: 50,
  245. низ: 550,
  246. верх: 270,
  247. depth: 10,
  248. },
  249. нить1: {
  250. родитель: мир.сцена,
  251. тип: "изображение",
  252. x: 619,
  253. y: 245,
  254. texture: "линия",
  255. originX: 0,
  256. originY: 0,
  257. depth: 10,
  258. },
  259. паук2: {
  260. родитель: мир.враги,
  261. тип: "платформа",
  262. x: 785,
  263. y: 375,
  264. texture: "паук",
  265. скорость: 70,
  266. низ: 600,
  267. верх: 270,
  268. depth: 10,
  269. },
  270. нить2: {
  271. родитель: мир.сцена,
  272. тип: "изображение",
  273. x: 784,
  274. y: 245,
  275. texture: "линия",
  276. originX: 0,
  277. originY: 0,
  278. depth: 10,
  279. },
  280. паук3: {
  281. родитель: мир.враги,
  282. тип: "платформа",
  283. x: 930,
  284. y: 500,
  285. texture: "паук",
  286. скорость: 70,
  287. низ: 550,
  288. верх: 270,
  289. depth: 10,
  290. },
  291. нить3: {
  292. родитель: мир.сцена,
  293. тип: "изображение",
  294. x: 929,
  295. y: 245,
  296. texture: "линия",
  297. originX: 0,
  298. originY: 0,
  299. depth: 10,
  300. },
  301. паук4: {
  302. родитель: мир.враги,
  303. тип: "платформа",
  304. x: 1003,
  305. y: 250,
  306. texture: "паук",
  307. скорость: 40,
  308. низ: 400,
  309. верх: 200,
  310. depth: 10,
  311. },
  312. нить4: {
  313. родитель: мир.сцена,
  314. тип: "изображение",
  315. x: 1002,
  316. y: 180,
  317. texture: "линия",
  318. originX: 0,
  319. originY: 0,
  320. depth: 10,
  321. },
  322. мышь1: {
  323. родитель: мир.враги,
  324. тип: "платформа",
  325. x: 350,
  326. y: 575,
  327. texture: "мышь",
  328. flipX: true,
  329. depth: 10,
  330. скорость: 290,
  331. },
  332. мышь2: {
  333. родитель: мир.враги,
  334. тип: "платформа",
  335. x: 740,
  336. y: 575,
  337. texture: "мышь",
  338. flipX: true,
  339. depth: 10,
  340. скорость: 375,
  341. },
  342. кучаСтрел: {
  343. родитель: мир.стрелы,
  344. тип: "платформа",
  345. x: 1270,
  346. y: 405,
  347. texture: "основа",
  348. originX: 0,
  349. originY: 0,
  350. scaleX: 25,
  351. scaleY: 2,
  352. visible: false,
  353. },
  354. лук: {
  355. родитель: мир.стрелы,
  356. тип: "платформа",
  357. x: 1280,
  358. y: 200,
  359. texture: "основа",
  360. originX: 0,
  361. originY: 0,
  362. visible: false,
  363. },
  364. пускСтрелы: {
  365. родитель: мир.стрелы,
  366. тип: "платформа",
  367. x: 1270,
  368. y: 160,
  369. texture: "основа",
  370. originX: 0,
  371. originY: 0,
  372. visible: false,
  373. },
  374. границаПолётаСтрелы: {
  375. родитель: мир.стрелы,
  376. тип: "платформа",
  377. x: 1830,
  378. y: 200,
  379. texture: "основа",
  380. originX: 0,
  381. originY: 0,
  382. scaleY: 20,
  383. visible: false,
  384. },
  385. };
  386. };
  387. // // // //
  388. ЗадатьФункциюПоискаУзлаПоИмени = мир =>
  389. {
  390. мир.узелСцены = function(имя) {
  391. return мир.сцена.children.list.find(function(элемент) {
  392. return элемент.name == имя;
  393. });
  394. };
  395. };
  396. // // // //
  397. СоздатьИзбу = мир =>
  398. {
  399. создатьУзлыСценыПоСтруктуре(мир.изба);
  400. мир.сцена.sound.play("звук-избы", { loop: true });
  401. };
  402. // // // //
  403. ПозволитьПлатформамПропускатьПрыжки = мир =>
  404. {
  405. мир.платформы.children.iterate(function(платформа) {
  406. платформа.body.checkCollision.down = false;
  407. платформа.body.checkCollision.left = false;
  408. платформа.body.checkCollision.right = false;
  409. });
  410. };
  411. // // // //
  412. НастроитьПауков = мир =>
  413. {
  414. мир.пауки = [];
  415. мир.нитиПауков = [];
  416. for (var имя in мир.изба)
  417. {
  418. if (имя.startsWith("паук"))
  419. {
  420. var паук = мир.узелСцены(имя);
  421. var имяНити = имя.replace("паук", "нить");
  422. var нить = мир.узелСцены(имяНити);
  423. паук.body.setVelocityY(паук.скорость);
  424. мир.пауки.push(паук);
  425. мир.нитиПауков.push(нить);
  426. }
  427. }
  428. };
  429. // // // //
  430. АнимироватьПауков = мир =>
  431. {
  432. for (var номер in мир.пауки)
  433. {
  434. var паук = мир.пауки[номер];
  435. var нить = мир.нитиПауков[номер];
  436. нить.displayHeight = паук.y - нить.y - 5;
  437. if (паук.y > паук.низ)
  438. {
  439. паук.setVelocityY(-паук.скорость);
  440. } else if (паук.y < паук.верх)
  441. {
  442. паук.setVelocityY(паук.скорость);
  443. }
  444. }
  445. };
  446. // // // //
  447. НастроитьМышей = мир =>
  448. {
  449. мир.мыши = [];
  450. for (var имя in мир.изба)
  451. {
  452. if (имя.startsWith("мышь"))
  453. {
  454. var мышь = мир.узелСцены(имя);
  455. мышь.body.setVelocityX(мышь.скорость);
  456. мир.мыши.push(мышь);
  457. }
  458. }
  459. };
  460. // // // //
  461. АнимироватьМышей = мир =>
  462. {
  463. for (var номер in мир.мыши)
  464. {
  465. var мышь= мир.мыши[номер];
  466. if (мышь.x > 1950)
  467. {
  468. мышь.setVelocityX(-мышь.скорость);
  469. мышь.flipX = false;
  470. } else if (мышь.x < 50)
  471. {
  472. мышь.setVelocityX(мышь.скорость);
  473. мышь.flipX = true;
  474. }
  475. }
  476. };
  477. // // // //
  478. НастроитьСтрелы = мир =>
  479. {
  480. var куча = мир.узелСцены("кучаСтрел");
  481. куча.body.checkCollision.down = false;
  482. var лук = мир.узелСцены("лук");
  483. лук.body.checkCollision.down = false;
  484. var пуск = мир.узелСцены("пускСтрелы");
  485. // Определение прыжка по стрелам.
  486. мир.сцена.physics.add.collider(мир.колобок, куча, function(a, b) {
  487. if (мир.колобок.body.touching.down) {
  488. мир.состояниеКолобка.прыжокПоСтрелам = true;
  489. }
  490. });
  491. // Определение пуска стрелы.
  492. var стПуск = мир.сцена.physics.add.collider(мир.колобок, пуск);
  493. стПуск.collideCallback = function(a, b) {
  494. if (мир.стрелаЗаряжена && !мир.пускСтрелы)
  495. {
  496. мир.пускСтрелы = true;
  497. мир.уведомить("пуск стрелы");
  498. }
  499. };
  500. стПуск.overlapOnly = true;
  501. };
  502. // // // //
  503. СоздатьСтрелу = мир =>
  504. {
  505. мир.стрелаЗаряжена = false;
  506. мир.пускСтрелы = false;
  507. мир.стрела = мир.сцена.physics.add.sprite(1250, 397, "стрела").setOrigin(0, 0);
  508. мир.стрела.setScale(0.5, 0.5).refreshBody();
  509. мир.стрела.depth = 5;
  510. мир.сцена.physics.add.collider(мир.стрела, мир.каркас);
  511. мир.сцена.physics.add.collider(мир.стрела, мир.платформы);
  512. // Определение заряда стрелы.
  513. var лук = мир.узелСцены("лук");
  514. var стЛук = мир.сцена.physics.add.collider(мир.стрела, лук);
  515. стЛук.collideCallback = function(a, b) {
  516. if (мир.стрела.body.touching.down && !мир.стрелаЗаряжена)
  517. {
  518. мир.стрелаЗаряжена = true;
  519. мир.уведомить("стрела заряжена");
  520. }
  521. };
  522. // Определение столкновения с окном.
  523. var граница = мир.узелСцены("границаПолётаСтрелы");
  524. var стОкно = мир.сцена.physics.add.collider(мир.стрела, граница);
  525. стОкно.collideCallback = function(a, b) {
  526. if (мир.стрелаЗаряжена && мир.пускСтрелы)
  527. {
  528. мир.стрелаЗаряжена = false;
  529. мир.пускСтрелы = false;
  530. мир.уведомить("удар стрелы об окно");
  531. }
  532. };
  533. };
  534. // // // //
  535. ОтследитьПрыжокПоСтрелам = мир =>
  536. {
  537. мир.состояниеКолобка.прыжокПоСтрелам = null;
  538. };
  539. // // // //
  540. ПроверитьНаличиеПрыжкаПоСтрелам = мир =>
  541. {
  542. if (!мир.состояниеКолобка.прыжокПоСтрелам)
  543. {
  544. return;
  545. }
  546. мир.уведомить("прыжок по платформе стрел");
  547. };
  548. // // // //
  549. ПодкидыватьСтрелуКЛуку = мир =>
  550. {
  551. if (!мир.стрела.body.touching.down || мир.стрелаЗаряжена)
  552. {
  553. return;
  554. }
  555. var скорость = мир.состояниеКолобка.скоростьПадения * 0.9;
  556. мир.стрела.setVelocityY(-скорость);
  557. };
  558. // // // //
  559. ВоспроизвестиЗвукЗарядкиСтрелы = мир =>
  560. {
  561. мир.сцена.sound.play("звук-зарядки");
  562. };
  563. // // // //
  564. ВоспроизвестиЗвукПускаСтрелы = мир =>
  565. {
  566. мир.сцена.sound.play("пуск-стрелы");
  567. };
  568. // // // //
  569. ПуститьСтрелу = мир =>
  570. {
  571. function randInt(min, max)
  572. {
  573. // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random#getting_a_random_integer_between_two_values
  574. min = Math.ceil(min);
  575. max = Math.floor(max);
  576. return Math.floor(Math.random() * (max - min)) + min;
  577. }
  578. var скорость = randInt(1100, 1300);
  579. мир.стрела.setVelocityX(скорость);
  580. };
  581. // // // //
  582. ВоспроизвестиЗвукУдараСтрелыОбОкно = мир =>
  583. {
  584. мир.сцена.sound.play("удар-стрелы");
  585. };
  586. // // // //
  587. ОтобразитьРазбитоеОкно = мир =>
  588. {
  589. мир.узелСцены("разбитоеОкно").setVisible(true);
  590. };
  591. // // // //
  592. ОтобразитьВыломанноеОкно = мир =>
  593. {
  594. мир.узелСцены("разбитоеОкно").setVisible(false);
  595. мир.узелСцены("выломанноеОкно").setVisible(true);
  596. };
  597. // // // //
  598. УведомитьСразуПослеУдара = мир =>
  599. {
  600. setTimeout(
  601. function() {
  602. мир.уведомить("сразу после удара");
  603. },
  604. 1
  605. );
  606. };
  607. // // // //
  608. ПодсчитатьУдарыСтрелыОбОкно = мир =>
  609. {
  610. if (!мир.ударовСтрелыОбОкно)
  611. {
  612. мир.ударовСтрелыОбОкно = 1;
  613. мир.уведомить("первый удар стрелы об окно");
  614. }
  615. else if (мир.ударовСтрелыОбОкно == 1)
  616. {
  617. мир.ударовСтрелыОбОкно = 2;
  618. мир.уведомить("второй удар стрелы об окно");
  619. }
  620. };
  621. // // // //
  622. ВоспроизвестиЗвукВыломанногоОкна = мир =>
  623. {
  624. мир.сцена.sound.play("выломали-окно");
  625. };
  626. /*
  627. *
  628. * Последовательность
  629. *
  630. */
  631. мир.разобрать(`
  632. загрузить ресурсы сцены
  633. загрузить ресурсы избы
  634. создать сцену
  635. задать структуру избы
  636. задать функцию поиска узла по имени
  637. создать избу
  638. позволить платформам пропускать прыжки
  639. настроить пауков
  640. настроить мышей
  641. настроить стрелы
  642. создать стрелу
  643. обновить сцену
  644. анимировать пауков
  645. анимировать мышей
  646. колобок начал прыжок
  647. отследить прыжок по стрелам
  648. колобок закончил прыжок
  649. проверить наличие прыжка по стрелам
  650. прыжок по платформе стрел
  651. подкидывать стрелу к луку
  652. стрела заряжена
  653. воспроизвести звук зарядки стрелы
  654. пуск стрелы
  655. воспроизвести звук пуска стрелы
  656. пустить стрелу
  657. удар стрелы об окно
  658. воспроизвести звук удара стрелы об окно
  659. уведомить сразу после удара
  660. подсчитать удары стрелы об окно
  661. первый удар стрелы об окно
  662. отобразить разбитое окно
  663. второй удар стрелы об окно
  664. отобразить выломанное окно
  665. воспроизвести звук выломанного окна
  666. сразу после удара
  667. создать стрелу
  668. `);