|
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- function Слежение(события, изображения, тела)
- {
- this.создать = function()
- {
- this.умолчание = {
- смещение: [0, 0],
- скорость: 1,
- предел: 0,
- };
- this.задано = {};
- события.подписать(this);
- };
-
- this.обновить = function()
- {
- for (var имя in this.задано)
- {
- var за = this.задано[имя];
- this.расположитьИзображение(за);
- }
- };
-
- this.обработатьКлюч = function(ключ, путь, значение)
- {
- if (путь[0] != "слежение")
- {
- return;
- }
-
- var имя = путь[1];
- var свойство = путь.slice(2).join(".");
- if (!this.задано[имя])
- {
- this.задано[имя] = {};
- }
- this.задано[имя][свойство] = значение;
- };
-
- this.расположитьИзображение = function(за)
- {
- var тело = тела.тела[за.тело];
- if (!тело)
- {
- return;
- }
-
- var элемент = изображения.элементы[за.изображение];
- var ум = 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, скорость, предел);
-
- элемент.dataset.слежениеX = x;
- элемент.dataset.слежениеY = y;
- изображения.обновитьРасположение(за.изображение, 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.создать();
- };
|