Files
mjs/240.слежения.js

161 lines
4.4 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

мир.слежения = {
умолчание: {
смещение: [0, 0],
скорость: 1,
},
задано: {},
обновить: обновитьСлежения,
};
// // // //
мир.ключники.push(function(ключ, путь, значение){
if (!путь[0].startsWith("слежения"))
{
return;
}
var имя = путь[1];
var свойство = путь.slice(2).join(".");
if (!мир.слежения.задано[имя])
{
мир.слежения.задано[имя] = {};
}
мир.слежения.задано[имя][свойство] = значение;
console.debug("слежения.задано имя/свойство", имя, свойство);
});
// // // //
function обновитьСлежения()
{
var за = мир.слежения.задано;
var ум = мир.слежения.умолчание;
if (!ум)
{
return;
}
for (var имя in за)
{
var эл = null;
if (имя == "камера")
{
эл = document.getElementById("корень");
}
else
{
эл = элементСлежения(за[имя]);
}
var тело = null;
var имяТела = за[имя]["объект"];
if (имяТела)
{
тело = мир.объекты.тела[имяТела];
}
обновитьЭлемент(эл, тело, за[имя], ум);
}
}
// // // //
function элементСлежения(задано)
{
var id = null;
var изображение = задано["изображение"];
if (изображение)
{
id = мир.изображения.элементы[изображение].id;
}
return document.getElementById(id);
}
// // // //
function обновитьЭлемент(элемент, тело, задано, умолчание)
{
if (!элемент || !тело)
{
return;
}
console.debug("обновитьЭлемент", элемент, тело, задано, умолчание);
var скорость = задано.скорость ? задано.скорость : умолчание.скорость;
var смещениеX = задано.смещение ? задано.смещение[0] : умолание.смещение[0];
var смещениеY = задано.смещение ? задано.смещение[1] : умолание.смещение[1];
// Сейчас.
var x0 = 0;
if (элемент.style.left.endsWith("px"))
{
x0 = элемент.style.left.slice(0, -2);
}
var y0 = 0;
if (элемент.style.top.endsWith("px"))
{
y0 = элемент.style.top.slice(0, -2);
}
// Цель.
//var x1 = window.innerWidth / 2 - тело.position.x;
//var y1 = window.innerHeight / 2 - тело.position.y;
var x1 = тело.position.x + смещениеX;
var y1 = тело.position.y + смещениеY;
// Плавно.
function lerp(v0, v1, t) {
return v0 * (1 - t) + v1 * t;
}
var x = lerp(x0, x1, скорость);
var y = lerp(y0, y1, скорость);
корень.style.left = `${x}px`;
корень.style.top = `${y}px`;
}
// // // //
function обновитьКамеру()
{
var объект = мир.камера.задано.объект;
var центрировать = мир.камера.задано.центрировать;
var тело = мир.объекты.тела[объект];
if (!тело || !центрировать)
{
return;
}
var корень = document.getElementById("корень");
// Сейчас.
var x0 = 0;
if (корень.style.left.endsWith("px"))
{
x0 = корень.style.left.slice(0, -2);
}
var y0 = 0;
if (корень.style.top.endsWith("px"))
{
y0 = корень.style.top.slice(0, -2);
}
// Цель.
var x1 = window.innerWidth / 2 - тело.position.x;
var y1 = window.innerHeight / 2 - тело.position.y;
// Плавно.
function lerp(v0, v1, t) {
return v0 * (1 - t) + v1 * t;
}
var x = lerp(x0, x1, центрировать);
var y = lerp(y0, y1, центрировать);
корень.style.left = `${x}px`;
корень.style.top = `${y}px`;
}