|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- function Слежение(состояние, изображения, тела)
- {
- this.создать = function()
- {
- this.умолчание = {
- смещение: [0, 0],
- скорость: 1,
- предел: 0,
- };
- this.задано = {};
- };
-
- this.обновить = function()
- {
- for (var имя in this.задано)
- {
- this.расположитьИзображение(имя);
- }
- };
-
- this.обработатьКлюч = function(ключ, путь, значение)
- {
- if (путь[0] != "слежение")
- {
- return;
- }
-
- var имя = путь[1];
- var свойство = путь.slice(2).join(".");
- if (!this.задано[имя])
- {
- this.задано[имя] = {};
- }
- this.задано[имя][свойство] = значение;
- };
-
- this.расположитьИзображение = function(имя)
- {
- let за = this.задано[имя];
- let тело = тела.тела[за.тело];
- let элемент = изображения.элементы[за.изображение];
- if (!тело || !элемент)
- {
- return;
- }
-
- let ум = this.умолчание;
-
- // Параметры.
- var скорость = за.скорость ? за.скорость : ум.скорость;
- var смещениеX = за["смещение.0"] ? за["смещение.0"] : ум.смещение[0];
- var смещениеY = за["смещение.1"] ? за["смещение.1"] : ум.смещение[1];
- var предел = за.предел ? за.предел : ум.предел;
-
- // Текущая позиция.
- var x0 = 0;
- if (элемент.dataset.слежениеX)
- {
- x0 = элемент.dataset.слежениеX;
- }
- var y0 = 0;
- if (элемент.dataset.слежениеY)
- {
- y0 = элемент.dataset.слежениеY;
- }
-
- // Целевая позиция.
- var x1 = тело.position.x + смещениеX;
- var y1 = тело.position.y + смещениеY;
- // Radians -> Degrees.
- var угол = тело.angle * 180 / Math.PI;
-
- // Устанавливаемая плавно позиция.
- var x = this.lerp(x0, x1, скорость, предел);
- var y = this.lerp(y0, y1, скорость, предел);
-
- // Ничего не делаем, если разница ничтожна.
- let ничтожно = 0.00001;
- if (
- элемент.dataset.слежениеX != null &&
- элемент.dataset.слежениеY != null &&
- элемент.dataset.слежениеУгол != null &&
- Math.abs(элемент.dataset.слежениеX - x) < ничтожно &&
- Math.abs(элемент.dataset.слежениеY - y) < ничтожно &&
- Math.abs(элемент.dataset.слежениеУгол - угол) < ничтожно
- ) {
- return;
- }
-
- // Иначе применяем новые значения.
- элемент.dataset.слежениеX = x;
- элемент.dataset.слежениеY = y;
- элемент.dataset.слежениеУгол = угол;
- var описание = {
- пр: [x, y],
- угол: угол,
- };
- состояние.разобратьЛишьНовое({
- изображения: {
- [за.изображение]: описание,
- },
- });
- };
-
- this.lerp = function(v0, v1, t, предел) {
- // Убираем мельтешение в случае наличия предела.
- if (предел)
- {
- var delta = Math.abs(v0 - v1);
- if (delta < предел) {
- return v0;
- }
- }
- return v0 * (1 - t) + v1 * t;
- };
-
- // Конструктор.
- this.создать();
- };
|