ввиду изменения направления анимации нужна всё-таки версия 6.0

This commit is contained in:
2022-05-17 18:52:47 +03:00
parent 4132af6c06
commit dd0ae6d2b5
33 changed files with 3 additions and 3 deletions

View File

@@ -0,0 +1,58 @@
function grПодсказки()
{
this.создать = function()
{
this.задано = {};
};
this.задатьПодсказку = function(имя)
{
let за = this.задано[имя];
if (!за.элемент || !за.текст)
{
return;
}
let элемент = document.getElementById(за.элемент);
if (!элемент)
{
return;
}
элемент.setAttribute("uk-tooltip", `pos: right; title: ${за.текст}`);
};
this.обработатьКлюч = function(ключ, путь, значение)
{
if (!ключ.startsWith("gr.подсказки"))
{
return;
}
let имя = путь[2];
let свойство = путь.slice(3).join(".");
if (!this.задано[имя])
{
this.задано[имя] = {};
}
this.задано[имя][свойство] = значение;
this.задатьПодсказку(имя);
};
this.подсказкаДляЭлемента = function(элемент)
{
for (var имя in this.задано)
{
let подсказка = this.задано[имя];
if (подсказка.элемент == элемент)
{
return имя;
}
}
return null;
};
// Конструктор.
this.создать();
};

View File

@@ -0,0 +1,104 @@
function grМеню(события, подсказки, реплики)
{
this.создать = function()
{
события.подписать(this);
this.установитьМеню();
this.улавливатьВыбор();
};
this.обработатьСобытие = function(событие)
{
let мышь = "мышь/нажатие/";
let сами = "меню/";
if (событие.startsWith(мышь))
{
let значения = событие.substring(мышь.length).split("/");
let элемент = значения[2];
let имя = подсказки.подсказкаДляЭлемента(элемент);
if (имя && имя in реплики.задано)
{
this.отобразитьМеню(имя);
}
}
else if (событие.startsWith(сами))
{
UIkit.modal("#меню").hide();
}
};
this.отобразитьМеню = function(имя)
{
this.активнаяПодсказка = имя;
let подсказка = подсказки.задано[имя];
document.getElementById("меню-заголовок").innerHTML = подсказка.текст;
UIkit.modal("#меню").show();
};
this.улавливатьВыбор = function()
{
var тут = this;
let глаз = document.getElementById("меню-кнопка-глаз");
глаз.addEventListener(
"click",
function() {
события.уведомить(`меню/глаз/${тут.активнаяПодсказка}`);
}
);
let рука = document.getElementById("меню-кнопка-рука");
рука.addEventListener(
"click",
function() {
события.уведомить(`меню/рука/${тут.активнаяПодсказка}`);
}
);
let рот = document.getElementById("меню-кнопка-рот");
рот.addEventListener(
"click",
function() {
события.уведомить(`меню/рот/${тут.активнаяПодсказка}`);
}
);
let нога = document.getElementById("меню-кнопка-нога");
нога.addEventListener(
"click",
function() {
события.уведомить(`меню/нога/${тут.активнаяПодсказка}`);
}
);
};
this.установитьМеню = function()
{
let html = `
<div id="меню" uk-modal>
<div class="uk-modal-dialog uk-modal-body">
<button class="uk-modal-close-default" type="button" uk-close></button>
<h2 id="меню-заголовок" class="uk-modal-title">Заголовок</h2>
<div class="uk-child-width-1-4 uk-text-center" uk-grid>
<div>
<div id="меню-кнопка-глаз" class="uk-card uk-card-small uk-card-hover uk-card-default uk-card-body">👁️</div>
</div>
<div>
<div id="меню-кнопка-рука" class="uk-card uk-card-small uk-card-hover uk-card-default uk-card-body">🤚</div>
</div>
<div>
<div id="меню-кнопка-рот" class="uk-card uk-card-small uk-card-hover uk-card-default uk-card-body">🗣</div>
</div>
<div>
<div id="меню-кнопка-нога" class="uk-card uk-card-small uk-card-hover uk-card-default uk-card-body">🥾</div>
</div>
</div>
</div>
</div>
`;
document.body.insertAdjacentHTML("beforeend", html);
};
// Конструктор.
this.создать();
};

View File

@@ -0,0 +1,69 @@
function grРеплики(события)
{
this.создать = function()
{
this.задано = {};
события.подписать(this);
};
this.номерРеплики = function(инструмент)
{
if (инструмент == "рука")
{
return 1;
}
else if (инструмент == "рот")
{
return 2;
}
else if (инструмент == "нога")
{
return 3;
}
// "глаз"
return 0;
};
this.обработатьКлюч = function(ключ, путь, значение)
{
if (!ключ.startsWith("gr.реплики"))
{
return;
}
let имя = путь[2];
let свойство = путь.slice(3).join(".");
if (!this.задано[имя])
{
this.задано[имя] = {};
}
this.задано[имя][свойство] = значение;
};
this.обработатьСобытие = function(событие)
{
let меню = "меню/";
if (событие.startsWith(меню))
{
let значения = событие.substring(меню.length).split("/");
let инструмент = значения[0];
let подсказка = значения[1];
this.отобразитьРеплику(инструмент, подсказка);
}
};
this.отобразитьРеплику = function(инструмент, подсказка)
{
let номер = this.номерРеплики(инструмент);
let реплика = this.задано[подсказка][номер];
let частей = реплика.split(/ /);
let длительность = частей.length * 1000;
UIkit.notification({
message: реплика,
timeout: длительность,
});
};
// Конструктор.
this.создать();
};

View File

@@ -0,0 +1,190 @@
function grСцена(состояние, состояниЯ, события, тела, адресИгры)
{
this.создать = function()
{
this.задано = {};
this.сцены = null;
this.состояниеИгрока = null;
события.подписать(this);
};
this.загрузитьСцену = function(имя)
{
let z64 = this.сцены[имя];
window.location = адресИгры + z64;
};
this.загрузитьОглавление = function(адрес)
{
var тут = this;
var запрос = new XMLHttpRequest();
запрос.onreadystatechange = function()
{
if (this.readyState == 4)
{
if (this.status == 200)
{
тут.разобратьОглавление(this.responseText);
}
else
{
console.error("Не удалось загрузить оглавление сцен:", this.status);
}
}
}
запрос.open("GET", адрес);
запрос.send();
};
this.задатьСостояниеИгрока = function(идёт, направление)
{
let стоятьЛ = this.задано["игрок.стоять.0"];
let стоятьП = this.задано["игрок.стоять.1"];
let идтиЛ = this.задано["игрок.идти.0"];
let идтиП = this.задано["игрок.идти.1"];
if (!стоятьЛ || !стоятьП || !идтиЛ || !идтиП)
{
return;
}
var название = идтиЛ;
if (идёт && направление > 0)
{
название = идтиП;
}
else if (!идёт && направление < 0)
{
название = стоятьЛ;
}
else if (!идёт && направление > 0)
{
название = стоятьП;
}
if (this.состояниеИгрока != название)
{
состояниЯ.применить(название);
this.состояниеИгрока = название;
}
};
this.обновить = function()
{
this.переместитьИгрока();
};
this.обработатьКлюч = function(ключ, путь, значение)
{
if (!ключ.startsWith("gr.сцена"))
{
return;
}
var свойство = путь.slice(2).join(".");
this.задано[свойство] = значение;
if (свойство == "оглавление")
{
this.загрузитьОглавление(значение);
}
};
this.обработатьНажатиеМышиУказатьИНажать = function(x, y, указатель)
{
let цель = this.задано["цель"];
if (!this.типИгрыУказатьИНажать() || !цель)
{
return;
}
let тело = тела.тела[цель];
if (!тело)
{
return;
}
var пр = [
тело.bounds.min.x,
тело.bounds.min.y,
тело.bounds.max.x - тело.bounds.min.x,
тело.bounds.max.y - тело.bounds.min.y,
]
let ширина = пр[2];
пр[0] = x - ширина;
состояние.разобрать({
тела: {
[цель]: {
пр: пр,
},
},
});
};
this.обработатьСобытие = function(событие)
{
let мышь = "мышь/нажатие/";
let сцена = "сцена/";
if (событие.startsWith(мышь))
{
let значения = событие.substring(мышь.length).split("/");
let x = Number(значения[0]);
let y = Number(значения[1]);
let указатель = значения[2];
this.обработатьНажатиеМышиУказатьИНажать(x, y, указатель);
}
else if (событие.startsWith(сцена))
{
let название = событие.substring(сцена.length);
this.загрузитьСцену(название);
}
};
this.переместитьИгрока = function()
{
let цель = this.задано["цель"];
let объект = this.задано["игрок.объект"];
let скоростьX = this.задано["игрок.скорость.0"];
if (!this.типИгрыУказатьИНажать() || !цель || !объект || !скоростьX)
{
return;
}
let игрок = `объекты-${объект}`;
let телоЦели = тела.тела[цель];
let телоИгрока = тела.тела[игрок];
if (!телоЦели || !телоИгрока)
{
return;
}
let игрокX = телоИгрока.position.x;
let цельX = телоЦели.position.x;
let ширина = телоЦели.bounds.max.x - телоЦели.bounds.min.x;
let расстояние = цельX - игрокX;
let направление = расстояние > 0 ? 1 : -1;
if (Math.abs(расстояние) < ширина / 2)
{
this.задатьСостояниеИгрока(false, направление);
return;
}
this.задатьСостояниеИгрока(true, направление);
Matter.Sleeping.set(телоИгрока, false);
Matter.Body.setVelocity(телоИгрока, { x: скоростьX * направление, y: 0 });
};
this.разобратьОглавление = function(содержимое)
{
let код = "this.сцены = " + содержимое;
eval(код);
};
this.типИгрыУказатьИНажать = function()
{
var тип = this.задано["тип"];
return тип && тип == "указать и нажать";
};
// Конструктор.
this.создать();
};