diff --git a/4.1/игра.html b/4.1/игра.html index 3eaef90..041cb7f 100644 --- a/4.1/игра.html +++ b/4.1/игра.html @@ -34,6 +34,7 @@ + diff --git a/4.1/игра/080.Анимации.js b/4.1/игра/080.Анимации.js index 153aab8..2529ee5 100644 --- a/4.1/игра/080.Анимации.js +++ b/4.1/игра/080.Анимации.js @@ -8,14 +8,11 @@ function Анимации(события) this.запустить = function(имя, элемент) { - let ключ = `${элемент.id}-${имя}`; + /**/console.debug("ИГР Анимации.запустить", имя, элемент, this.анимации); // Останавливаем прошлый экземпляр этой анимации на том же элементе. - if (ключ in this.анимации) - { - this.анимации[ключ].остановить(); - delete this.анимации[ключ]; - } + this.остановить(имя, элемент); // Запускаем новый экземпляр анимации на том же элементе. + let ключ = `${элемент.id}`;//-${имя}`; this.анимации[ключ] = new Анимация(элемент, this.задано[имя]); } @@ -37,6 +34,17 @@ function Анимации(события) события.уведомить(`анимации/${имя}`); }; + this.остановить = function(имя, элемент) + { + let ключ = `${элемент.id}`;//-${имя}`; + if (ключ in this.анимации) + { + this.анимации[ключ].остановить(); + delete this.анимации[ключ]; + } + /**/console.debug("ИГР Анимации.остановить", имя, элемент, this.анимации); + } + // Конструктор. this.создать(); }; diff --git a/4.1/игра/190.Состояния.js b/4.1/игра/190.Состояния.js index c67a53f..9e9ca1c 100644 --- a/4.1/игра/190.Состояния.js +++ b/4.1/игра/190.Состояния.js @@ -1,4 +1,4 @@ -function Состояния() +function Состояния(состояние) { this.создать = function() { @@ -7,17 +7,8 @@ function Состояния() this.применить = function(имя) { - /* - let ключ = `${элемент.id}-${имя}`; - // Останавливаем прошлый экземпляр этой анимации на том же элементе. - if (ключ in this.анимации) - { - this.анимации[ключ].остановить(); - delete this.анимации[ключ]; - } - // Запускаем новый экземпляр анимации на том же элементе. - this.анимации[ключ] = new Анимация(элемент, this.задано[имя]); - */ + console.debug("ИГР Состояния.применить", имя, this.задано[имя]); + состояние.разобратьВыпрямленный(this.задано[имя]); } this.обработатьКлюч = function(ключ, путь, значение) diff --git a/4.1/игра/200.Сцена.js b/4.1/игра/200.Сцена.js index 727bc18..99de01b 100644 --- a/4.1/игра/200.Сцена.js +++ b/4.1/игра/200.Сцена.js @@ -1,12 +1,10 @@ -function Сцена(состояние, события, тела, адресИгры) +function Сцена(состояние, состояниЯ, события, тела, адресИгры) { this.создать = function() { - this.умолчание = { - скорость: [1, 1], - }; this.задано = {}; this.сцены = null; + this.состояниеИгрока = null; события.подписать(this); }; @@ -38,6 +36,38 @@ function Сцена(состояние, события, тела, адресИг запрос.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.переместитьИгрока(); @@ -60,19 +90,17 @@ function Сцена(состояние, события, тела, адресИг this.обработатьНажатиеМышиУказатьИНажать = function(x, y, указатель) { - var тип = this.задано["тип"]; - var игрок = this.задано["игрок"]; - var цель = this.задано["цель"]; - if (!тип || !игрок || !цель || тип != "указать и нажать") + let цель = this.задано["цель"]; + if (!this.типИгрыУказатьИНажать() || !цель) { return; } - - var тело = тела.тела[цель]; + let тело = тела.тела[цель]; if (!тело) { return; } + var пр = [ тело.bounds.min.x, тело.bounds.min.y, @@ -112,15 +140,15 @@ function Сцена(состояние, события, тела, адресИг this.переместитьИгрока = function() { - let тип = this.задано["тип"]; - let игрок = this.задано["игрок"]; let цель = this.задано["цель"]; - let скоростьX = this.задано["скорость.0"]; - if (!тип || !игрок || !цель || !скоростьX || тип != "указать и нажать") + let объект = this.задано["игрок.объект"]; + let скоростьX = this.задано["игрок.скорость.0"]; + if (!this.типИгрыУказатьИНажать() || !цель || !объект || !скоростьX) { return; } + let игрок = `объекты-${объект}`; let телоЦели = тела.тела[цель]; let телоИгрока = тела.тела[игрок]; if (!телоЦели || !телоИгрока) @@ -132,13 +160,15 @@ function Сцена(состояние, события, тела, адресИг let цельX = телоЦели.position.x; let ширина = телоЦели.bounds.max.x - телоЦели.bounds.min.x; let расстояние = цельX - игрокX; + let направление = расстояние > 0 ? 1 : -1; if (Math.abs(расстояние) < ширина / 2) { + this.задатьСостояниеИгрока(false, направление); return; } - let направление = расстояние > 0 ? 1 : -1; - + + this.задатьСостояниеИгрока(true, направление); Matter.Sleeping.set(телоИгрока, false); Matter.Body.setVelocity(телоИгрока, { x: скоростьX * направление, y: 0 }); }; @@ -149,6 +179,12 @@ function Сцена(состояние, события, тела, адресИг eval(код); }; + this.типИгрыУказатьИНажать = function() + { + var тип = this.задано["тип"]; + return тип && тип == "указать и нажать"; + }; + // Конструктор. this.создать(); }; diff --git a/4.1/игра/700.Игра.js b/4.1/игра/700.Игра.js index cb598d1..46eedee 100644 --- a/4.1/игра/700.Игра.js +++ b/4.1/игра/700.Игра.js @@ -19,9 +19,9 @@ function Игра() мир.тела = new Тела(мир.события, мир.физика, мир.физдвижок.world); мир.слежение = new Слежение(мир.состояние, мир.изображения, мир.тела); мир.объекты = new Объекты(мир.состояние, мир.события); - мир.состояниЯ = new Состояния(); + мир.состояниЯ = new Состояния(мир.состояние); let адресИгры = window.location.pathname + "/../игра.html?z64="; - мир.сцена = new Сцена(мир.состояние, мир.события, мир.тела, адресИгры); + мир.сцена = new Сцена(мир.состояние, мир.состояниЯ, мир.события, мир.тела, адресИгры); мир.мышь = new Мышь(мир.события); мир.столкновения = new Столкновения(мир.события, мир.тела, мир.физдвижок); мир.подсказки = new Подсказки();