Проверить Matter.js
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.

784 lines
21KB

  1. // // // //
  2. // Основа избы
  3. // // // //
  4. мир.разобрать({
  5. заголовок: "Колобку здесь быть",
  6. изображения: {
  7. дом: {
  8. ширина: 2000,
  9. высота: 600,
  10. вид: {
  11. background: "url(р/сцены/изба.jpg)",
  12. },
  13. },
  14. },
  15. объекты: {
  16. полСлева: {
  17. x: 0,
  18. y: 580,
  19. ширина: 355,
  20. вид: {
  21. background: "url(р/отладка/основа.jpg)",
  22. display: "none",
  23. },
  24. },
  25. /*
  26. полКрышки: {
  27. x: 357,
  28. y: 580,
  29. ширина: 135,
  30. вид: {
  31. background: "url(р/отладка/основа.jpg)",
  32. display: "none",
  33. },
  34. },
  35. */
  36. полСправа: {
  37. x: 495,
  38. y: 580,
  39. ширина: 1505,
  40. вид: {
  41. background: "url(р/отладка/основа.jpg)",
  42. display: "none",
  43. },
  44. },
  45. стол: {
  46. x: 1253,
  47. y: 420,
  48. ширина: 610,
  49. вид: {
  50. background: "url(р/отладка/основа.jpg)",
  51. display: "none",
  52. },
  53. физика: {
  54. collisionFilter: {
  55. category: 2,
  56. },
  57. },
  58. },
  59. подоконник: {
  60. x: 1673,
  61. y: 375,
  62. ширина: 200,
  63. вид: {
  64. background: "url(р/отладка/основа.jpg)",
  65. display: "none",
  66. },
  67. физика: {
  68. angle: -0.0698,
  69. collisionFilter: {
  70. category: 2,
  71. },
  72. },
  73. },
  74. },
  75. звуки: {
  76. изба: {
  77. события: ["вошли в избу"],
  78. файл: "р/звуки/387922__setuniman__scheming-1o95.mp3",
  79. повторять: true,
  80. останов: ["покинули избу"],
  81. },
  82. },
  83. });
  84. // // // //
  85. // Игрок
  86. // // // //
  87. мир.разобрать({
  88. изображения: {
  89. колобок: {
  90. ширина: 70,
  91. высота: 70,
  92. вид: {
  93. background: "url(р/колобок/колобок_неподвижен.png)",
  94. //"z-index": 10,
  95. },
  96. },
  97. изоСенсорИгрока: {
  98. ширина: 70,
  99. высота: 70,
  100. вид: {
  101. background: "url(р/отладка/основа.jpg)",
  102. },
  103. },
  104. изоПодошваИгрока: {
  105. ширина: 40,
  106. высота: 20,
  107. вид: {
  108. background: "url(р/отладка/основа.jpg)",
  109. },
  110. },
  111. },
  112. тела: {
  113. подошваИгрока: {
  114. x: 100,
  115. y: 450,
  116. ширина: 40,
  117. высота: 20,
  118. часть: true,
  119. физика: {
  120. isStatic: false,
  121. inertia: Infinity,
  122. },
  123. },
  124. сенсорИгрока: {
  125. x: 100,
  126. y: 400,
  127. ширина: 70,
  128. высота: 70,
  129. часть: true,
  130. физика: {
  131. isSensor: true,
  132. isStatic: false,
  133. },
  134. },
  135. игрок: {
  136. части: ["подошваИгрока", "сенсорИгрока"],
  137. физика: {
  138. isStatic: false,
  139. inertia: Infinity,
  140. },
  141. },
  142. },
  143. объекты: {
  144. /*
  145. кирпич: {
  146. x: 100,
  147. y: 350,
  148. высота: 20,
  149. ширина: 40,
  150. вид: {
  151. background: "url(р/отладка/основа.jpg)",
  152. //display: "none",
  153. },
  154. физика: {
  155. isStatic: false,
  156. inertia: Infinity,
  157. },
  158. },
  159. */
  160. },
  161. игрок: {
  162. //объект: "кирпич",
  163. тело: "игрок",
  164. скорость: [5, 12.5],
  165. клавиши: ["ArrowLeft", "ArrowRight", "ArrowUp"],
  166. },
  167. слежение: {
  168. колобок: {
  169. //объект: "кирпич",
  170. тело: "игрок",
  171. изображение: "колобок",
  172. смещение: [-35, -35],
  173. скорость: 1,
  174. },
  175. камера: {
  176. //объект: "кирпич",
  177. тело: "игрок",
  178. скорость: 0.1,
  179. },
  180. /*
  181. сенсорИгрока: {
  182. тело: "сенсорИгрока",
  183. изображение: "изоСенсорИгрока",
  184. смещение: [-35, -35],
  185. },
  186. */
  187. /*
  188. подошваИгрока: {
  189. тело: "подошваИгрока",
  190. изображение: "изоПодошваИгрока",
  191. смещение: [-20, -10],
  192. },
  193. */
  194. },
  195. маскиПрыжков: {
  196. игрок: {
  197. //объект: "кирпич",
  198. тело: "игрок",
  199. скорость: -1,
  200. маски: [1, 1|2],
  201. },
  202. },
  203. звуки: {
  204. прыжокИгрока: {
  205. события: ["игрок начал прыжок"],
  206. файл: "р/звуки/331381__qubodup__public-domain-jump-sound.wav",
  207. },
  208. },
  209. });
  210. // // // //
  211. // Платформы и объекты печи
  212. // // // //
  213. мир.разобрать({
  214. объекты: {
  215. фундаментПечи: {
  216. x: 570,
  217. y: 470,
  218. ширина: 550,
  219. вид: {
  220. background: "url(р/отладка/основа.jpg)",
  221. display: "none",
  222. },
  223. физика: {
  224. collisionFilter: {
  225. category: 2,
  226. },
  227. },
  228. },
  229. полка1: {
  230. x: 660,
  231. y: 335,
  232. ширина: 40,
  233. высота: 10,
  234. вид: {
  235. background: "url(р/отладка/основа.jpg)",
  236. display: "none",
  237. },
  238. физика: {
  239. collisionFilter: {
  240. category: 2,
  241. },
  242. },
  243. },
  244. полка2: {
  245. x: 767,
  246. y: 335,
  247. ширина: 40,
  248. высота: 10,
  249. вид: {
  250. background: "url(р/отладка/основа.jpg)",
  251. display: "none",
  252. },
  253. физика: {
  254. collisionFilter: {
  255. category: 2,
  256. },
  257. },
  258. },
  259. полка3: {
  260. x: 855,
  261. y: 335,
  262. ширина: 40,
  263. высота: 10,
  264. вид: {
  265. background: "url(р/отладка/основа.jpg)",
  266. display: "none",
  267. },
  268. физика: {
  269. collisionFilter: {
  270. category: 2,
  271. },
  272. },
  273. },
  274. полкаСамовара: {
  275. x: 975,
  276. y: 355,
  277. ширина: 70,
  278. высота: 10,
  279. вид: {
  280. background: "url(р/отладка/основа.jpg)",
  281. display: "none",
  282. },
  283. физика: {
  284. collisionFilter: {
  285. category: 2,
  286. },
  287. },
  288. },
  289. лежанкаПечки: {
  290. x: 600,
  291. y: 242,
  292. ширина: 330,
  293. высота: 10,
  294. вид: {
  295. background: "url(р/отладка/основа.jpg)",
  296. display: "none",
  297. },
  298. физика: {
  299. collisionFilter: {
  300. category: 2,
  301. },
  302. },
  303. },
  304. основаниеТрубыПечки: {
  305. x: 937,
  306. y: 175,
  307. ширина: 130,
  308. высота: 10,
  309. вид: {
  310. background: "url(р/отладка/основа.jpg)",
  311. display: "none",
  312. },
  313. физика: {
  314. collisionFilter: {
  315. category: 2,
  316. },
  317. },
  318. },
  319. самовар: {
  320. x: 650,
  321. y: 300,
  322. ширина: 70,
  323. высота: 120,
  324. вид: {
  325. background: "url(р/вещи/самовар.png) no-repeat scroll 0% 0% / contain",
  326. },
  327. физика: {
  328. isStatic: false,
  329. //inertia: Infinity,
  330. },
  331. },
  332. },
  333. });
  334. // // // //
  335. // Подкидывание стрелы
  336. // // // //
  337. мир.разобрать({
  338. объекты: {
  339. сенсор: {
  340. x: 1280,
  341. y: 400,
  342. ширина: 120,
  343. вид: {
  344. background: "url(р/отладка/основа.jpg)",
  345. display: "none",
  346. },
  347. физика: {
  348. isStatic: true,
  349. isSensor: true,
  350. },
  351. },
  352. стрела: {
  353. x: 1230,
  354. y: 350,
  355. высота: 30,
  356. ширина: 200,
  357. вид: {
  358. display: "inline-block",
  359. background: "url(р/вещи/стрела.png) no-repeat scroll 0% 0% / contain",
  360. transform: "scaleX(-1)",
  361. },
  362. физика: {
  363. isStatic: false,
  364. inertia: Infinity,
  365. collisionFilter: {
  366. category: 4,
  367. },
  368. },
  369. },
  370. лук: {
  371. x: 1250,
  372. y: 200,
  373. ширина: 100,
  374. вид: {
  375. background: "url(р/отладка/основа.jpg)",
  376. display: "none",
  377. },
  378. физика: {
  379. isStatic: true,
  380. collisionFilter: {
  381. category: 4,
  382. },
  383. },
  384. },
  385. },
  386. столкновения: {
  387. стрелаНачало: {
  388. объекты: ["сенсор"],
  389. тела: ["игрок"],
  390. событие: "сенсор стрелы",
  391. },
  392. стрелаКонец: {
  393. объекты: ["стрела", "лук"],
  394. событие: "стрела и лук",
  395. },
  396. },
  397. маскиПрыжков: {
  398. стрела: {
  399. объект: "стрела",
  400. скорость: -1,
  401. маски: [0, 2|4]
  402. },
  403. },
  404. звуки: {
  405. зарядкаЛука: {
  406. события: ["закинули стрелу"],
  407. файл: "р/звуки/543927__eminyildirim__pistol-gun-cocking.wav",
  408. },
  409. },
  410. });
  411. function ПодкидываниеСтрелы() {
  412. this.создать = function() {
  413. this.времяСтрелы = null;
  414. this.времяПриземления = null;
  415. this.подкинули = false;
  416. this.закинули = false;
  417. this.завершить = null;
  418. мир.события.подписать(this);
  419. };
  420. this.обработатьСобытие = function(событие) {
  421. if (событие == "сенсор стрелы")
  422. {
  423. this.времяСтрелы = мир.физика.движок.timing.timestamp;
  424. this.подкинуть();
  425. }
  426. else if (событие == "игрок приземлился")
  427. {
  428. this.времяПриземления = мир.физика.движок.timing.timestamp;
  429. this.подкинуть();
  430. }
  431. else if (событие == "игрок начал прыжок")
  432. {
  433. this.времяСтрелы = null;
  434. this.времяПриземления = null;
  435. this.подкинули = false;
  436. }
  437. else if (
  438. (событие == "стрела и лук") &&
  439. this.закинули &&
  440. this.завершить
  441. ) {
  442. мир.события.уведомить("закинули стрелу");
  443. мир.события.отписать(this);
  444. this.завершить();
  445. }
  446. };
  447. this.подкинуть = function() {
  448. if (
  449. this.подкинули ||
  450. !this.времяСтрелы ||
  451. !this.времяПриземления ||
  452. Math.abs(this.времяСтрелы - this.времяПриземления) > 0.00001 ||
  453. Math.abs(мир.объекты.тела.стрела.velocity.y) > 0.00001
  454. ) {
  455. return;
  456. }
  457. this.подкинули = true;
  458. Matter.Body.setVelocity(
  459. мир.объекты.тела.стрела,
  460. { x: 0, y: -мир.игрок.приземление.скорость * 1.2 }
  461. );
  462. if (мир.игрок.приземление.скорость > 16)
  463. {
  464. this.закинули = true;
  465. }
  466. };
  467. // Конструктор.
  468. this.создать();
  469. }
  470. мир.подкидываниеСтрелы = new ПодкидываниеСтрелы();
  471. мир.подкидываниеСтрелы.завершить = function() {
  472. мир.подкидываниеСтрелы = null;
  473. };
  474. // Запустить звук избы
  475. мир.события.уведомить("вошли в избу");
  476. // // // //
  477. // Пауки и мыши
  478. // // // //
  479. мир.разобрать({
  480. объекты: {
  481. паук1: {
  482. x: 680,
  483. y: 300,
  484. ширина: 30,
  485. вид: {
  486. background: "url(р/животные/паук.png) no-repeat scroll 0% 0% / contain",
  487. },
  488. физика: {
  489. isStatic: false,
  490. isSensor: true,
  491. },
  492. },
  493. мышь1: {
  494. x: 500,
  495. y: 555,
  496. высота: 70,
  497. ширина: 90,
  498. вид: {
  499. background: "url(р/животные/мышь.png) no-repeat scroll 0% 0% / contain",
  500. },
  501. физика: {
  502. isStatic: false,
  503. isSensor: true,
  504. },
  505. },
  506. },
  507. столкновения: {
  508. игрокПаук1: {
  509. объекты: ["паук1"],
  510. тела: ["игрок"],
  511. событие: "игрокПаук1",
  512. },
  513. игрокМышь1: {
  514. объекты: ["мышь1"],
  515. тела: ["игрок"],
  516. событие: "игрокМышь1",
  517. },
  518. леваяСтенаМышь1: {
  519. объекты: ["мышь1", "стенаЛевая"],
  520. событие: "леваяСтенаМышь1",
  521. },
  522. праваяСтенаМышь1: {
  523. объекты: ["мышь1", "стенаПравая"],
  524. событие: "праваяСтенаМышь1",
  525. },
  526. },
  527. движение: {
  528. паук1: {
  529. объекты: ["паук1"],
  530. скорость: [0.7, 1],
  531. x: [610, 1080],
  532. y: [350, 450],
  533. },
  534. мышь1: {
  535. объекты: ["мышь1"],
  536. скорость: [8, 1.0],
  537. x: [0, 2000],
  538. y: [590, 590],
  539. },
  540. },
  541. });
  542. // // // //
  543. // Повреждение игрока
  544. // // // //
  545. function ПовреждениеИгрока(события, колобок, имяТела)
  546. {
  547. this.создать = function()
  548. {
  549. события.подписать(this);
  550. this.создатьМигание();
  551. this.запомнитьМаску();
  552. this.повреждение = null;
  553. };
  554. this.создатьМигание = function()
  555. {
  556. var вид = document.createElement('style')
  557. вид.innerText = `
  558. .мигание
  559. {
  560. animation: мигатель 0.5s linear infinite;
  561. }
  562. @keyframes мигатель
  563. {
  564. 50%
  565. {
  566. opacity: 0;
  567. }
  568. }
  569. `;
  570. document.head.appendChild(вид)
  571. };
  572. this.обработатьСобытие = function(событие)
  573. {
  574. if (событие == "игрокПаук1")
  575. {
  576. this.повредить(1);
  577. }
  578. else if (событие == "игрокМышь1")
  579. {
  580. this.повредить(10);
  581. }
  582. };
  583. this.запомнитьМаску = function()
  584. {
  585. var за = мир.маскиПрыжков.задано;
  586. for (var имя in за)
  587. {
  588. var з = за[имя];
  589. if (з.тело == имяТела)
  590. {
  591. this.имя = имя;
  592. this.маски = [з["маски.0"], з["маски.1"]];
  593. return;
  594. }
  595. }
  596. };
  597. this.выставитьМаскиПовреждения = function(значение)
  598. {
  599. var з = мир.маскиПрыжков.задано[this.имя];
  600. з["маски.0"] = значение;
  601. з["маски.1"] = значение;
  602. };
  603. this.вернутьПервоначальныеМаски = function()
  604. {
  605. var з = мир.маскиПрыжков.задано[this.имя];
  606. з["маски.0"] = this.маски[0];
  607. з["маски.1"] = this.маски[1];
  608. };
  609. this.повредить = function(значение)
  610. {
  611. if (!this.повреждение)
  612. {
  613. колобок.classList.add("мигание");
  614. }
  615. this.выставитьМаскиПовреждения(значение);
  616. this.повреждение = new Date();
  617. var тут = this;
  618. setTimeout(
  619. function() { тут.возможноПрекратить() },
  620. 5000
  621. );
  622. };
  623. this.возможноПрекратить = function()
  624. {
  625. if (!this.повреждение)
  626. {
  627. return;
  628. }
  629. var сейчас = new Date();
  630. var прошло = сейчас - this.повреждение;
  631. if (прошло > 4990)
  632. {
  633. колобок.classList.remove("мигание")
  634. this.вернутьПервоначальныеМаски();
  635. this.повреждение = null;
  636. }
  637. };
  638. // Конструктор.
  639. this.создать();
  640. }
  641. мир.повреждениеИгрока = new ПовреждениеИгрока(
  642. мир.события,
  643. мир.изображения.элементы.колобок,
  644. "игрок"
  645. );
  646. function ПереворачиватьМышь(события, имяМыши)
  647. {
  648. this.создать = function()
  649. {
  650. события.подписать(this);
  651. };
  652. this.обработатьСобытие = function(событие)
  653. {
  654. if (событие == "леваяСтенаМышь1")
  655. {
  656. /**/console.debug("соб. леваяСМ1");
  657. мир.разобрать({
  658. объекты: {
  659. мышь1: {
  660. вид: {
  661. transform: "scaleX(-1)",
  662. },
  663. },
  664. },
  665. });
  666. }
  667. else if (событие == "праваяСтенаМышь1")
  668. {
  669. /**/console.debug("соб. праваяСМ1");
  670. мир.разобрать({
  671. объекты: {
  672. мышь1: {
  673. вид: {
  674. transform: "scaleX(1)",
  675. },
  676. },
  677. },
  678. });
  679. }
  680. };
  681. // Конструктор.
  682. this.создать();
  683. }
  684. мир.переворачиватьМышь = new ПереворачиватьМышь(
  685. мир.события,
  686. "мышь1"
  687. );
  688. // // // //
  689. // Подпол и стены
  690. // // // //
  691. мир.разобрать({
  692. объекты: {
  693. полПодпола: {
  694. x: 0,
  695. y: 980,
  696. ширина: 2000,
  697. высота: 50,
  698. вид: {
  699. background: "url(р/отладка/основа.jpg)",
  700. //display: "none",
  701. },
  702. физика: {
  703. collisionFilter: {
  704. category: 10,
  705. },
  706. },
  707. },
  708. стенаЛевая: {
  709. x: -40,
  710. y: 0,
  711. высота: 1000,
  712. вид: {
  713. background: "url(р/отладка/основа.jpg)",
  714. display: "none",
  715. },
  716. },
  717. стенаПравая: {
  718. x: 2000,
  719. y: 0,
  720. высота: 1000,
  721. вид: {
  722. background: "url(р/отладка/основа.jpg)",
  723. display: "none",
  724. },
  725. },
  726. },
  727. });