commit c495326dffed1481f86cfa5922be18ffa87113c9 Author: Михаил Капелько Date: Sat May 22 12:38:50 2021 +0300 падение 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 0000000..5c95781 Binary files /dev/null and b/основа.jpg differ