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.создать();
};