@@ -34,6 +34,7 @@ | |||||
<script src="игра/140.Тела.js"></script> | <script src="игра/140.Тела.js"></script> | ||||
<script src="игра/160.Слежение.js"></script> | <script src="игра/160.Слежение.js"></script> | ||||
<script src="игра/180.Объекты.js"></script> | <script src="игра/180.Объекты.js"></script> | ||||
<script src="игра/190.Состояния.js"></script> | |||||
<script src="игра/200.Сцена.js"></script> | <script src="игра/200.Сцена.js"></script> | ||||
<script src="игра/220.Мышь.js"></script> | <script src="игра/220.Мышь.js"></script> | ||||
<script src="игра/240.Столкновения.js"></script> | <script src="игра/240.Столкновения.js"></script> | ||||
@@ -8,14 +8,11 @@ function Анимации(события) | |||||
this.запустить = function(имя, элемент) | this.запустить = function(имя, элемент) | ||||
{ | { | ||||
let ключ = `${элемент.id}-${имя}`; | |||||
/**/console.debug("ИГР Анимации.запустить", имя, элемент, this.анимации); | |||||
// Останавливаем прошлый экземпляр этой анимации на том же элементе. | // Останавливаем прошлый экземпляр этой анимации на том же элементе. | ||||
if (ключ in this.анимации) | |||||
{ | |||||
this.анимации[ключ].остановить(); | |||||
delete this.анимации[ключ]; | |||||
} | |||||
this.остановить(имя, элемент); | |||||
// Запускаем новый экземпляр анимации на том же элементе. | // Запускаем новый экземпляр анимации на том же элементе. | ||||
let ключ = `${элемент.id}`;//-${имя}`; | |||||
this.анимации[ключ] = new Анимация(элемент, this.задано[имя]); | this.анимации[ключ] = new Анимация(элемент, this.задано[имя]); | ||||
} | } | ||||
@@ -37,6 +34,17 @@ function Анимации(события) | |||||
события.уведомить(`анимации/${имя}`); | события.уведомить(`анимации/${имя}`); | ||||
}; | }; | ||||
this.остановить = function(имя, элемент) | |||||
{ | |||||
let ключ = `${элемент.id}`;//-${имя}`; | |||||
if (ключ in this.анимации) | |||||
{ | |||||
this.анимации[ключ].остановить(); | |||||
delete this.анимации[ключ]; | |||||
} | |||||
/**/console.debug("ИГР Анимации.остановить", имя, элемент, this.анимации); | |||||
} | |||||
// Конструктор. | // Конструктор. | ||||
this.создать(); | this.создать(); | ||||
}; | }; |
@@ -1,4 +1,4 @@ | |||||
function Состояния() | |||||
function Состояния(состояние) | |||||
{ | { | ||||
this.создать = function() | this.создать = function() | ||||
{ | { | ||||
@@ -7,17 +7,8 @@ function Состояния() | |||||
this.применить = function(имя) | this.применить = function(имя) | ||||
{ | { | ||||
/* | |||||
let ключ = `${элемент.id}-${имя}`; | |||||
// Останавливаем прошлый экземпляр этой анимации на том же элементе. | |||||
if (ключ in this.анимации) | |||||
{ | |||||
this.анимации[ключ].остановить(); | |||||
delete this.анимации[ключ]; | |||||
} | |||||
// Запускаем новый экземпляр анимации на том же элементе. | |||||
this.анимации[ключ] = new Анимация(элемент, this.задано[имя]); | |||||
*/ | |||||
console.debug("ИГР Состояния.применить", имя, this.задано[имя]); | |||||
состояние.разобратьВыпрямленный(this.задано[имя]); | |||||
} | } | ||||
this.обработатьКлюч = function(ключ, путь, значение) | this.обработатьКлюч = function(ключ, путь, значение) | ||||
@@ -1,12 +1,10 @@ | |||||
function Сцена(состояние, события, тела, адресИгры) | |||||
function Сцена(состояние, состояниЯ, события, тела, адресИгры) | |||||
{ | { | ||||
this.создать = function() | this.создать = function() | ||||
{ | { | ||||
this.умолчание = { | |||||
скорость: [1, 1], | |||||
}; | |||||
this.задано = {}; | this.задано = {}; | ||||
this.сцены = null; | this.сцены = null; | ||||
this.состояниеИгрока = null; | |||||
события.подписать(this); | события.подписать(this); | ||||
}; | }; | ||||
@@ -38,6 +36,38 @@ function Сцена(состояние, события, тела, адресИг | |||||
запрос.send(); | запрос.send(); | ||||
}; | }; | ||||
this.задатьСостояниеИгрока = function(идёт, направление) | |||||
{ | |||||
let стоятьЛ = this.задано["игрок.стоять.0"]; | |||||
let стоятьП = this.задано["игрок.стоять.1"]; | |||||
let идтиЛ = this.задано["игрок.идти.0"]; | |||||
let идтиП = this.задано["игрок.идти.1"]; | |||||
if (!стоятьЛ || !стоятьП || !идтиЛ || !идтиП) | |||||
{ | |||||
return; | |||||
} | |||||
var название = идтиЛ; | |||||
if (идёт && направление > 0) | |||||
{ | |||||
название = идтиП; | |||||
} | |||||
else if (!идёт && направление < 0) | |||||
{ | |||||
название = стоятьЛ; | |||||
} | |||||
else if (!идёт && направление > 0) | |||||
{ | |||||
название = стоятьП; | |||||
} | |||||
if (this.состояниеИгрока != название) | |||||
{ | |||||
состояниЯ.применить(название); | |||||
this.состояниеИгрока = название; | |||||
} | |||||
}; | |||||
this.обновить = function() | this.обновить = function() | ||||
{ | { | ||||
this.переместитьИгрока(); | this.переместитьИгрока(); | ||||
@@ -60,19 +90,17 @@ function Сцена(состояние, события, тела, адресИг | |||||
this.обработатьНажатиеМышиУказатьИНажать = function(x, y, указатель) | this.обработатьНажатиеМышиУказатьИНажать = function(x, y, указатель) | ||||
{ | { | ||||
var тип = this.задано["тип"]; | |||||
var игрок = this.задано["игрок"]; | |||||
var цель = this.задано["цель"]; | |||||
if (!тип || !игрок || !цель || тип != "указать и нажать") | |||||
let цель = this.задано["цель"]; | |||||
if (!this.типИгрыУказатьИНажать() || !цель) | |||||
{ | { | ||||
return; | return; | ||||
} | } | ||||
var тело = тела.тела[цель]; | |||||
let тело = тела.тела[цель]; | |||||
if (!тело) | if (!тело) | ||||
{ | { | ||||
return; | return; | ||||
} | } | ||||
var пр = [ | var пр = [ | ||||
тело.bounds.min.x, | тело.bounds.min.x, | ||||
тело.bounds.min.y, | тело.bounds.min.y, | ||||
@@ -112,15 +140,15 @@ function Сцена(состояние, события, тела, адресИг | |||||
this.переместитьИгрока = function() | this.переместитьИгрока = function() | ||||
{ | { | ||||
let тип = this.задано["тип"]; | |||||
let игрок = this.задано["игрок"]; | |||||
let цель = this.задано["цель"]; | let цель = this.задано["цель"]; | ||||
let скоростьX = this.задано["скорость.0"]; | |||||
if (!тип || !игрок || !цель || !скоростьX || тип != "указать и нажать") | |||||
let объект = this.задано["игрок.объект"]; | |||||
let скоростьX = this.задано["игрок.скорость.0"]; | |||||
if (!this.типИгрыУказатьИНажать() || !цель || !объект || !скоростьX) | |||||
{ | { | ||||
return; | return; | ||||
} | } | ||||
let игрок = `объекты-${объект}`; | |||||
let телоЦели = тела.тела[цель]; | let телоЦели = тела.тела[цель]; | ||||
let телоИгрока = тела.тела[игрок]; | let телоИгрока = тела.тела[игрок]; | ||||
if (!телоЦели || !телоИгрока) | if (!телоЦели || !телоИгрока) | ||||
@@ -132,13 +160,15 @@ function Сцена(состояние, события, тела, адресИг | |||||
let цельX = телоЦели.position.x; | let цельX = телоЦели.position.x; | ||||
let ширина = телоЦели.bounds.max.x - телоЦели.bounds.min.x; | let ширина = телоЦели.bounds.max.x - телоЦели.bounds.min.x; | ||||
let расстояние = цельX - игрокX; | let расстояние = цельX - игрокX; | ||||
let направление = расстояние > 0 ? 1 : -1; | |||||
if (Math.abs(расстояние) < ширина / 2) | if (Math.abs(расстояние) < ширина / 2) | ||||
{ | { | ||||
this.задатьСостояниеИгрока(false, направление); | |||||
return; | return; | ||||
} | } | ||||
let направление = расстояние > 0 ? 1 : -1; | |||||
this.задатьСостояниеИгрока(true, направление); | |||||
Matter.Sleeping.set(телоИгрока, false); | Matter.Sleeping.set(телоИгрока, false); | ||||
Matter.Body.setVelocity(телоИгрока, { x: скоростьX * направление, y: 0 }); | Matter.Body.setVelocity(телоИгрока, { x: скоростьX * направление, y: 0 }); | ||||
}; | }; | ||||
@@ -149,6 +179,12 @@ function Сцена(состояние, события, тела, адресИг | |||||
eval(код); | eval(код); | ||||
}; | }; | ||||
this.типИгрыУказатьИНажать = function() | |||||
{ | |||||
var тип = this.задано["тип"]; | |||||
return тип && тип == "указать и нажать"; | |||||
}; | |||||
// Конструктор. | // Конструктор. | ||||
this.создать(); | this.создать(); | ||||
}; | }; |
@@ -19,9 +19,9 @@ function Игра() | |||||
мир.тела = new Тела(мир.события, мир.физика, мир.физдвижок.world); | мир.тела = new Тела(мир.события, мир.физика, мир.физдвижок.world); | ||||
мир.слежение = new Слежение(мир.состояние, мир.изображения, мир.тела); | мир.слежение = new Слежение(мир.состояние, мир.изображения, мир.тела); | ||||
мир.объекты = new Объекты(мир.состояние, мир.события); | мир.объекты = new Объекты(мир.состояние, мир.события); | ||||
мир.состояниЯ = new Состояния(); | |||||
мир.состояниЯ = new Состояния(мир.состояние); | |||||
let адресИгры = window.location.pathname + "/../игра.html?z64="; | let адресИгры = window.location.pathname + "/../игра.html?z64="; | ||||
мир.сцена = new Сцена(мир.состояние, мир.события, мир.тела, адресИгры); | |||||
мир.сцена = new Сцена(мир.состояние, мир.состояниЯ, мир.события, мир.тела, адресИгры); | |||||
мир.мышь = new Мышь(мир.события); | мир.мышь = new Мышь(мир.события); | ||||
мир.столкновения = new Столкновения(мир.события, мир.тела, мир.физдвижок); | мир.столкновения = new Столкновения(мир.события, мир.тела, мир.физдвижок); | ||||
мир.подсказки = new Подсказки(); | мир.подсказки = new Подсказки(); | ||||