Files
mjs/320.слежение.js

129 lines
3.5 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 (!мир.слежение.задано[имя])
{
мир.слежение.задано[имя] = {};
}
мир.слежение.задано[имя][свойство] = значение;
});
// // // //
мир.слежение.обновить = function()
{
var за = мир.слежение.задано;
var ум = мир.слежение.умолчание;
for (var имя in за)
{
var тело = null;
var имяТела = за[имя]["объект"];
if (имяТела)
{
тело = мир.объекты.тела[имяТела];
}
var эл = null;
var формула = null;
if (имя == "камера")
{
эл = document.getElementById("корень");
формула = function(x, y)
{
return [
window.innerWidth / 2 - x,
window.innerHeight / 2 - y,
];
};
}
else
{
эл = мир.слежение.элемент(за[имя]);
}
мир.слежение.обновитьЭлемент(эл, тело, за[имя], ум, формула);
}
};
// // // //
мир.слежение.элемент = function(задано)
{
var id = null;
var изображение = задано["изображение"];
if (изображение)
{
id = мир.изображения.элементы[изображение].id;
}
return document.getElementById(id);
};
// // // //
мир.слежение.обновитьЭлемент = function(элемент, тело, задано, умолчание, формула)
{
if (!элемент || !тело)
{
return;
}
var скорость = задано.скорость ? задано.скорость : умолчание.скорость;
var смещениеX = задано["смещение.0"] ? задано["смещение.0"] : умолчание.смещение[0];
var смещениеY = задано["смещение.1"] ? задано["смещение.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 = тело.position.x + смещениеX;
var y1 = тело.position.y + смещениеY;
// Более точная настройка.
// Сейчас лишь для камеры.
if (формула)
{
var итог = формула(x1, y1);
x1 = итог[0];
y1 = итог[1];
}
// Плавно.
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`;
};