слежение
This commit is contained in:
91
3.3/проигрыватель/160.Слежение.js
Normal file
91
3.3/проигрыватель/160.Слежение.js
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
function Слежение(события, изображения, тела)
|
||||||
|
{
|
||||||
|
this.создать = function()
|
||||||
|
{
|
||||||
|
this.умолчание = {
|
||||||
|
смещение: [0, 0],
|
||||||
|
скорость: 1,
|
||||||
|
};
|
||||||
|
this.задано = {};
|
||||||
|
события.подписать(this);
|
||||||
|
};
|
||||||
|
|
||||||
|
this.обновить = function()
|
||||||
|
{
|
||||||
|
for (var имя in this.задано)
|
||||||
|
{
|
||||||
|
var за = this.задано[имя];
|
||||||
|
var изо = изображения.элементы[за.изображение];
|
||||||
|
this.расположитьЭлемент(изо, за);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
this.обработатьКлюч = function(ключ, путь, значение)
|
||||||
|
{
|
||||||
|
if (путь[0] != "слежение")
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var имя = путь[1];
|
||||||
|
var свойство = путь.slice(2).join(".");
|
||||||
|
if (!this.задано[имя])
|
||||||
|
{
|
||||||
|
this.задано[имя] = {};
|
||||||
|
}
|
||||||
|
this.задано[имя][свойство] = значение;
|
||||||
|
};
|
||||||
|
|
||||||
|
this.расположитьЭлемент = function(элемент, за)
|
||||||
|
{
|
||||||
|
var тело = тела.тела[за.тело];
|
||||||
|
if (!тело)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var ум = this.умолчание;
|
||||||
|
|
||||||
|
// Параметры.
|
||||||
|
var скорость = за.скорость ? за.скорость : ум.скорость;
|
||||||
|
var смещениеX = за["смещение.0"] ? за["смещение.0"] : ум.смещение[0];
|
||||||
|
var смещениеY = за["смещение.1"] ? за["смещение.1"] : ум.смещение[1];
|
||||||
|
|
||||||
|
// Текущая позиция.
|
||||||
|
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;
|
||||||
|
|
||||||
|
// Устанавливаемая плавно позиция.
|
||||||
|
var x = this.lerp(x0, x1, скорость);
|
||||||
|
var y = this.lerp(y0, y1, скорость);
|
||||||
|
|
||||||
|
элемент.dataset.слежениеX = x;
|
||||||
|
элемент.dataset.слежениеY = y;
|
||||||
|
элемент.style.left = `${x}px`;
|
||||||
|
элемент.style.top = `${y}px`;
|
||||||
|
};
|
||||||
|
|
||||||
|
this.lerp = function(v0, v1, t) {
|
||||||
|
// Убираем мельтешение.
|
||||||
|
var delta = Math.abs(v0 - v1);
|
||||||
|
if (delta < 1) {
|
||||||
|
return v0;
|
||||||
|
}
|
||||||
|
return v0 * (1 - t) + v1 * t;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Конструктор.
|
||||||
|
this.создать();
|
||||||
|
};
|
||||||
@@ -6,12 +6,16 @@ function Игра()
|
|||||||
мир.события = new События();
|
мир.события = new События();
|
||||||
мир.состояние = new Состояние();
|
мир.состояние = new Состояние();
|
||||||
мир.состояние.обработчик = (к, п, з) => { this.обработатьКлюч(к, п, з) };
|
мир.состояние.обработчик = (к, п, з) => { this.обработатьКлюч(к, п, з) };
|
||||||
|
мир.физика = new Физика();
|
||||||
|
мир.изображения = new Изображения(корень),
|
||||||
|
мир.тела = new Тела(мир.события, мир.физика.движок.world);
|
||||||
|
мир.слежение = new Слежение(мир.события, мир.изображения, мир.тела);
|
||||||
this.ключники = [
|
this.ключники = [
|
||||||
new Заголовок(),
|
new Заголовок(),
|
||||||
new Изображения(корень),
|
мир.изображения,
|
||||||
|
мир.тела,
|
||||||
|
мир.слежение,
|
||||||
];
|
];
|
||||||
мир.физика = new Физика();
|
|
||||||
мир.тела = new Тела(мир.события, мир.физика.движок.world);
|
|
||||||
|
|
||||||
var z64 = мир.параметрыЗапуска()["z64"];
|
var z64 = мир.параметрыЗапуска()["z64"];
|
||||||
this.исполнитьКод(z64);
|
this.исполнитьКод(z64);
|
||||||
@@ -31,6 +35,7 @@ function Игра()
|
|||||||
this.обновить = function()
|
this.обновить = function()
|
||||||
{
|
{
|
||||||
мир.физика.обновить();
|
мир.физика.обновить();
|
||||||
|
мир.слежение.обновить();
|
||||||
|
|
||||||
var тут = this;
|
var тут = this;
|
||||||
requestAnimationFrame(function() {
|
requestAnimationFrame(function() {
|
||||||
|
|||||||
@@ -6,6 +6,9 @@
|
|||||||
<script src="../общее/pako/pako.min.js"></script>
|
<script src="../общее/pako/pako.min.js"></script>
|
||||||
<script src="matter-js/matter.min.js"></script>
|
<script src="matter-js/matter.min.js"></script>
|
||||||
<style>
|
<style>
|
||||||
|
body {
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
#корень
|
#корень
|
||||||
{
|
{
|
||||||
position: relative;
|
position: relative;
|
||||||
@@ -24,6 +27,7 @@
|
|||||||
<script src="100.Изображения.js"></script>
|
<script src="100.Изображения.js"></script>
|
||||||
<script src="120.Физика.js"></script>
|
<script src="120.Физика.js"></script>
|
||||||
<script src="140.Тела.js"></script>
|
<script src="140.Тела.js"></script>
|
||||||
|
<script src="160.Слежение.js"></script>
|
||||||
<script src="700.Игра.js"></script>
|
<script src="700.Игра.js"></script>
|
||||||
<script>
|
<script>
|
||||||
var игра = new Игра();
|
var игра = new Игра();
|
||||||
|
|||||||
Reference in New Issue
Block a user