From c495326dffed1481f86cfa5922be18ffa87113c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B8=D1=85=D0=B0=D0=B8=D0=BB=20=D0=9A=D0=B0=D0=BF?= =?UTF-8?q?=D0=B5=D0=BB=D1=8C=D0=BA=D0=BE?= Date: Sat, 22 May 2021 12:38:50 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BF=D0=B0=D0=B4=D0=B5=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 001.мир.js | 190 +++++++++++++++++++++++++++++++++++++++++++++++ 011.phaser.js | 96 ++++++++++++++++++++++++ 499.пуск.js | 1 + index.html | 32 ++++++++ основа.jpg | Bin 0 -> 1241 bytes 5 files changed, 319 insertions(+) create mode 100644 001.мир.js create mode 100644 011.phaser.js create mode 100644 499.пуск.js create mode 100644 index.html create mode 100644 основа.jpg diff --git a/001.мир.js b/001.мир.js new file mode 100644 index 0000000..8711b98 --- /dev/null +++ b/001.мир.js @@ -0,0 +1,190 @@ +/* + * + * Реализация шаблона "издатель-подписчик" + * + */ + +function Уведомитель() +{ + function Подписка(id, отклик, уведомитель) + { + this.id = id; + this.отклик = отклик; + this.уведомитель = уведомитель; + }; + + this.уведомить = function() + { + // Попутно собираем подписки без отклика. + var безотклика = []; + for (var номер in this.подписки) + { + var подписка = this.подписки[номер]; + if (подписка.отклик) + { + подписка.отклик(); + } + else + { + безотклика.push(подписка); + } + } + + // И удаляем их. + if (безотклика.length) + { + this._удалитьПодпискиБезОтклика(безотклика); + } + }; + + this.подписать = function(отклик) + { + var id = this._сгенерироватьUUID(); + var подписка = new Подписка(id, отклик, this); + this.подписки.push(подписка); + return подписка; + }; + + this.отписать = function(подписка) + { + подписка.отклик = null; + }; + + this._удалитьПодпискиБезОтклика = function(удалить) + { + var подписка = удалить.shift() + while (подписка) + { + var индекс = this.подписки.indexOf(подписка); + if (индекс !== -1) + { + this.подписки.splice(индекс, 1); + } + var подписка = удалить.shift() + } + }; + + this._сгенерироватьUUID = function() + { + // https://stackoverflow.com/a/2117523 + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace( + /[xy]/g, + function(c) + { + var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8); + return v.toString(16); + } + ); + }; + + // Конструктор. + this.подписки = []; +} + +/* + * + * Связь событий и реакций в виде последовательности (череды) + * + */ + +function Мир() +{ + // Разобрать события и реакции, выраженные в тексте. + this.разобрать = function(череда) + { + var соответствия = this._событияРеакции(череда); + for (var событие in соответствия) + { + if (!(событие in this.события)) + { + this.события[событие] = new Уведомитель(); + } + var реакции = соответствия[событие]; + for (var номер in реакции) + { + const реакция = реакции[номер]; + const название = this._имяФункцииИзРеакции(реакция); + const функция = eval(название); + var тут = this; + this.события[событие].подписать(function(){ + функция(тут); + }); + } + } + }; + + // Уведомить о событии при его наличии. + this.уведомить = function(событие) + { + if (событие in this.события) + { + this.события[событие].уведомить(); + } + }; + + // Разобрать текст с событиями и реакциями, вернуть словарь их соответствия. + this._событияРеакции = function(текст) + { + var соответствие = {}; + + var элементы = текст.split("\n"); + var имяСобытия = null; + for (var номер in элементы) + { + var элемент = элементы[номер]; + // Пропускаем комментарии. + if (элемент.charAt(0) == "#") + { + continue; + } + var имя = элемент.trim(); + // Пропускаем пустые строки. + if (!имя.length) + { + continue; + } + // Событие. + if (имя == элемент) + { + if (!(имя in соответствие)) + { + имяСобытия = имя; + соответствие[имя] = []; + } + } + // Реакция. + else + { + соответствие[имяСобытия].push(имя); + } + } + + return соответствие; + }; + + // Преобразовать имя реакции в название функции. + this._имяФункцииИзРеакции = function(реакция) + { + var имя = ""; + + var части = реакция.split(" "); + for (var номер in части) + { + var часть = части[номер]; + имя += часть.charAt(0).toUpperCase() + часть.slice(1); + } + + return имя; + }; + + // Конструктор. + this.события = {}; +} + +/* + * + * Создание глобального мира. + * + */ + +мир = new Мир(); diff --git a/011.phaser.js b/011.phaser.js new file mode 100644 index 0000000..009ab54 --- /dev/null +++ b/011.phaser.js @@ -0,0 +1,96 @@ + +/* + * + * Реакции + * + */ + + +НастроитьИгру = мир => +{ + мир.настройки = { + type: Phaser.AUTO, + width: 800, + height: 600, + backgroundColor: 0xfbfbfb, + scale: { + width: 800, + height: 600, + parent: document.getElementById("родитель"), + mode: Phaser.Scale.ENVELOP, + autoCenter: Phaser.Scale.CENTER_BOTH, + }, + physics: { + default: "matter", + matter: { + gravity: { + y: 0.01, + }, + debug: { + showBody: true, + showStaticBody: true, + }, + }, + }, + scene: { + preload: function() { + мир.сцена = this; + мир.уведомить("загрузить ресурсы сцены"); + + мир.сцена.load.image("основа", "основа.jpg"); + + }, + create: function() { + мир.сцена = this; + мир.уведомить("создать сцену"); + + + мир.img = мир.сцена.matter.add.image(100, 300, "основа"); + мир.img.setScale(20, 3); + + + }, + update: function() { + мир.сцена = this; + мир.уведомить("обновить сцену"); + + //console.debug(мир.img.y); + }, + }, + }; +}; + + +// // // // + + +ЗапуститьИгру = мир => +{ + мир.игра = new Phaser.Game(мир.настройки); +}; + + +// // // // + + +ЗадатьГромкость = мир => +{ + мир.сцена.sound.volume = 0.15; +}; + + +/* + * + * Последовательность + * + */ + + +мир.разобрать(` +пуск + настроить игру + запустить игру +создать сцену + задать громкость +`); + diff --git a/499.пуск.js b/499.пуск.js new file mode 100644 index 0000000..df758ae --- /dev/null +++ b/499.пуск.js @@ -0,0 +1 @@ +мир.уведомить("пуск"); diff --git a/index.html b/index.html new file mode 100644 index 0000000..53fce00 --- /dev/null +++ b/index.html @@ -0,0 +1,32 @@ + + + + + J 0.1.0 + + + + +
+ + + + + diff --git a/основа.jpg b/основа.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5c957816d7a0a4f3c68edb9efb663a2821aed37e GIT binary patch literal 1241 zcmb7DOK1~O6g}@vCP|Y?I@3;K6~QS)-B=KRxQjNL8fh`a7Frc*GD(|2lZHu3Q3N-F zOA88qHnzHOjpmVRVciuR%`0%7FChNNc|k$`@)jz${umW>=j$;fsWi z%-5?D-yv+;#cZDNW5W9!YLM`%%;y^Ti^S6|<^*9nqnQNl%_MA1x8Ph0wu?@gIERQ6 z%a<$U&&L}$FYy(L%QJJ-n;UY6TA?y_mYy-Xc47!Aj35mQIn1Gi8PqXA&kAK~$k6&= z2mKCLpC(m~R3+G?IDuJ|k#+Tu?|?WI&Dqwb4jyn*OdAB$4?=v~4ft*X>kC5sToPja z0ie7Go>!Xs*+t;!cgim`bFuqC_ch?@ax<5^4LrLJ^sQC1PS&lX(49|B0bd^hp$VY( z6%aVzm>aFhbv%3njMA)zUjldU0ehy&`$C6(`$_O;Zd-CT<|p1E0flpUQh4Z8{i^Em zr~#kP>(>IB77PS~p>U5L3LD{IP>q;hJqpU zzeBu$;RhWGGr$d|7)&g~Y<&1~5F6o@S@~oA9pWuCg@NmePT%h6RboZ;#spi4s!2RQ zshP@``lXZ6&dJXd#^OwxbRzIg!gig^T1pV)-ov+6HVS#;{6=vyxmQ~0?Q2mt@&3!3 Z8*qEpcWqHx_NM=