падение
This commit is contained in:
190
001.мир.js
Normal file
190
001.мир.js
Normal file
@@ -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 Мир();
|
||||||
96
011.phaser.js
Normal file
96
011.phaser.js
Normal file
@@ -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;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* Последовательность
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
мир.разобрать(`
|
||||||
|
пуск
|
||||||
|
настроить игру
|
||||||
|
запустить игру
|
||||||
|
создать сцену
|
||||||
|
задать громкость
|
||||||
|
`);
|
||||||
|
|
||||||
1
499.пуск.js
Normal file
1
499.пуск.js
Normal file
@@ -0,0 +1 @@
|
|||||||
|
мир.уведомить("пуск");
|
||||||
32
index.html
Normal file
32
index.html
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
|
||||||
|
<title>J 0.1.0</title>
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/phaser@3.54.0/dist/phaser.min.js"></script>
|
||||||
|
<style>
|
||||||
|
html, body {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
height: 100vh;
|
||||||
|
width: 100vw;
|
||||||
|
}
|
||||||
|
|
||||||
|
#родитель
|
||||||
|
{
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="родитель"></div>
|
||||||
|
<script src="001.мир.js"></script>
|
||||||
|
<script src="011.phaser.js"></script>
|
||||||
|
<script src="499.пуск.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
BIN
основа.jpg
Normal file
BIN
основа.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.2 KiB |
Reference in New Issue
Block a user