Compare commits

...

117 Commits

Author SHA1 Message Date
bdd825bde2 переворачивать мышь 2021-08-26 16:39:38 +03:00
a1ec3fe69d сваливаться в подпол от мыши 2021-08-26 16:25:20 +03:00
d0c08457a5 двигать мышь 2021-08-26 16:08:29 +03:00
d6a154cc80 стены и подпол 2021-08-26 15:50:05 +03:00
255daba5ae ронять 2021-08-25 15:11:35 +03:00
da70e54452 отключать мигание через 5с 2021-08-25 14:37:13 +03:00
d8a1d7b7bb infinite blinking 2021-08-24 15:18:49 +03:00
8d31c83080 jump 2021-08-24 14:51:01 +03:00
1a7bda4ffd управлять телом 2021-08-24 14:31:58 +03:00
b7fd306363 составное 2021-08-20 17:49:27 +03:00
9843675335 исправление 2021-08-20 17:21:57 +03:00
859c6f3f06 синхра игрока составного 2021-08-19 17:00:12 +03:00
6c8ecdf0dc новое слежение 2021-08-19 16:41:34 +03:00
e5cc0f1a65 невидимое составное тело 2021-08-18 15:24:53 +03:00
c1da3973ce состав 2021-08-18 15:07:49 +03:00
e8fe7e59f6 тела json api 2021-08-16 15:14:16 +03:00
08e8c37052 -рт 2021-08-16 15:09:45 +03:00
e65485a054 изо + апи 2021-08-16 14:56:51 +03:00
677b222aca заменить изображение 2021-08-16 14:50:06 +03:00
80c9891004 изо1 2021-08-16 14:44:40 +03:00
8d61cfbf64 some 2021-08-13 15:23:19 +03:00
7dacf10d64 160->170 2021-08-13 14:29:27 +03:00
86daf65ab1 пример с частями 2021-08-13 14:17:16 +03:00
21a892188c сенсор игрока рабтает 2021-08-12 15:17:14 +03:00
fde0a9ed9d some 2021-08-12 14:55:37 +03:00
5dbf805d83 два ручных тела 2021-08-12 14:38:30 +03:00
a25bd81dbc ручное тело 2021-08-12 14:32:54 +03:00
dc25add211 not yet compound enough 2021-08-11 15:29:50 +03:00
b6be9658a5 constraint + sensor 2021-08-11 15:01:46 +03:00
975f8a16bb видимый кирпич 2021-08-11 14:27:48 +03:00
45d6318a33 движение 2021-08-10 15:50:27 +03:00
22846b7a46 json-js 2021-08-10 15:05:11 +03:00
ced225cf11 move 2021-08-10 14:58:08 +03:00
b2efb401ff move spider 2021-08-06 15:14:16 +03:00
0faad3eb3b бесконечная фоновая музыка 2021-08-06 14:29:42 +03:00
246c5efa2e звуки 2021-08-06 14:20:33 +03:00
67b096d583 переработать пуск 2021-08-05 14:54:43 +03:00
2cb0ec93a5 воспроизводить звуки 2021-08-05 14:37:12 +03:00
e89371487f ресурсы звуков. json звуков 2021-08-04 15:32:44 +03:00
1ca6848df3 заставка 2021-08-04 15:18:53 +03:00
f5a18c1ab0 sync 2021-08-03 14:31:35 +03:00
9d50408129 - 2021-07-30 17:28:32 +03:00
56e0eba53a отладка аудио 2021-07-29 15:40:44 +03:00
7eb5195fb3 сигнал приземления стрелы на лук 2021-07-29 15:18:16 +03:00
6f5e85d20f -actions 2021-07-28 15:39:11 +03:00
cbecb7198d исключить повтор 2021-07-28 15:37:59 +03:00
d815d923f9 -действия 2021-07-28 15:11:07 +03:00
af43346e33 пример 2021-07-28 14:51:54 +03:00
c173f0f6ae почти стрела 2021-07-27 15:43:29 +03:00
088b978343 почти лук 2021-07-23 16:48:10 +03:00
f934a4f86c delta<1 2021-07-23 15:17:31 +03:00
e83250e402 отдельно 2021-07-23 15:03:32 +03:00
dc40a64bd3 group 2021-07-23 14:51:57 +03:00
dda5429cf4 группа 2021-07-22 18:08:11 +03:00
0385e709e7 колобок видим 2021-07-22 17:49:49 +03:00
675a4babd7 подкидывать стрелу 2021-07-22 17:45:48 +03:00
9b3a5d5e55 действия игрока 2021-07-21 14:53:55 +03:00
0b5431698b подкидывать бесконечно 2021-07-21 14:34:14 +03:00
777bca030d -dbg 2021-07-21 14:26:35 +03:00
99129cc494 зеркало 2021-07-21 14:26:16 +03:00
c2ec518585 столкновения по-привычному 2021-07-21 13:53:45 +03:00
db1a47f1a9 действия вызывают действия 2021-07-19 15:14:14 +03:00
a4528580fb вызов действия на столкновение 2021-07-19 15:11:32 +03:00
4c316afe91 переместить надобъектное дальше 2021-07-19 14:57:52 +03:00
47ebe996f6 ввод 2021-07-19 14:53:49 +03:00
bf6d8a06cd выводить столкновения ожидаемых 2021-07-19 14:44:59 +03:00
67f342be08 имена 2021-07-16 15:18:10 +03:00
ba76bdbd7d collision 2021-07-16 15:07:38 +03:00
83ce75d2ac начало сенсора 2021-07-15 18:26:18 +03:00
71076d20c0 прыжок 2021-07-15 18:14:45 +03:00
54163c7af4 some 2021-07-14 16:22:37 +03:00
d72023067d перед прыжком 2021-07-14 16:02:29 +03:00
76a8f2963b полки 2021-07-14 14:50:38 +03:00
c76e2e777e подоконник 2021-07-13 15:08:46 +03:00
a095f0687f камера ок 2021-07-13 15:01:38 +03:00
4847c4355e следить изо 2021-07-13 14:46:03 +03:00
abeb6dd036 в словари 2021-07-13 14:29:24 +03:00
61d1a208c2 работает 2021-07-13 14:10:16 +03:00
9857f7ff06 неразборчиво 2021-07-12 15:07:20 +03:00
8986ba14ab dl 2021-07-12 14:25:01 +03:00
e69b1071ab переименовать 2021-07-12 14:24:49 +03:00
eb51faa1b9 убрать отладку игрока 2021-07-12 14:09:29 +03:00
234087b53f такое себе 2021-07-09 15:09:17 +03:00
d6a8106802 всем скорость 2021-07-09 15:01:22 +03:00
ff87f2216b compound 2021-07-09 14:53:38 +03:00
e3228caf50 элемент1/тело1 2021-07-09 14:34:09 +03:00
6b4ebb05e2 до невключения в мир 2021-07-08 10:46:37 +03:00
834cf4d957 ограничитель 2021-07-08 10:31:46 +03:00
a122340552 перед 2021-07-08 09:40:52 +03:00
34ddba866d tmp 2021-07-07 15:00:47 +03:00
243f37c99e лучше прыгать с вещей 2021-07-07 14:35:56 +03:00
8bdc3df7c3 самовар 2021-07-06 19:21:37 +03:00
d14ee5e93b отладка 2021-07-06 15:32:58 +03:00
b50338f272 jumpthrough 2021-07-06 15:31:22 +03:00
51784650e1 задать маску колобка = 1 для столкновения, как было 2021-07-06 15:01:30 +03:00
6d64bfd7cb норм 2021-07-06 14:58:04 +03:00
53edfed756 короче 2021-07-06 14:52:23 +03:00
8ff1a6cbff есть вложенность 2021-07-06 14:49:41 +03:00
932dcc410a a bit of digging 2021-07-05 15:43:58 +03:00
cb89c09cea x/y слева/сверху 2021-07-05 15:18:20 +03:00
3e1357df7d запись примера 2021-06-28 15:02:02 +03:00
f24784c383 свойства физ 2021-06-27 15:07:24 +03:00
20d379dce8 центрировать json 2021-06-26 20:42:21 +03:00
e1c5a43bf8 камера 2021-06-26 15:22:16 +03:00
43fa2e1f93 корень 2021-06-25 17:53:27 +03:00
0eca32f3c1 изо 2021-06-25 17:38:54 +03:00
e2a4e597d6 soso 2021-06-24 16:58:46 +03:00
72638b114a заготовка игрока 2021-06-24 15:32:13 +03:00
652e08f745 no sleep 2021-06-24 14:47:00 +03:00
5fd3a95890 частичное движение 2021-06-24 00:59:03 +03:00
4e37d55650 исключить повторы клавиш 2021-06-23 18:57:15 +03:00
1cd31b49f5 учёт действия клавиш 2021-06-23 14:44:25 +03:00
f292b37207 ввод 2021-06-23 12:29:06 +03:00
096468aa49 wrong 2021-06-23 11:42:29 +03:00
f19ce56969 почти движение 2021-06-23 11:34:02 +03:00
0c0ae8265b задано 2021-06-22 14:17:56 +03:00
bc93363aac начало клавиш 2021-06-21 18:25:56 +03:00
41 changed files with 1945 additions and 92 deletions

View File

@@ -1,11 +0,0 @@
/*
мир.клавиши = {
};
*/
window.addEventListener("keydown", function(o) {
console.debug("keydown", o);
});
window.addEventListener("keyup", function(o) {
console.debug("keyup", o);
});

View File

@@ -1,10 +0,0 @@
мир.обновить = function()
{
мир.физика.обновить();
мир.объекты.обновить();
requestAnimationFrame(мир.обновить);
};
// Запустить.
мир.физика.создать();
мир.обновить();

View File

@@ -1,23 +0,0 @@
мир.разобрать({
заголовок: "К 0.10.0",
объекты: {
пол: {
x: 1000,
y: 300,
ширина: 2000,
вид: {
background: "url(р/отладка/основа.jpg) repeat-x",
},
},
колобок: {
x: 400,
y: 150,
ширина: 60,
высота: 60,
статика: false,
вид: {
background: "url(р/колобок/колобок_неподвижен.png) no-repeat scroll 50% 0% / contain",
},
},
},
});

View File

@@ -52,3 +52,35 @@
} }
} }
}; };
мир.задать = function(словарь, полныйКлюч, значение) {
var путь = полныйКлюч.split(".");
var пройти = путь.length - 1;
var вложенность = словарь;
for (var номер = 0; номер < пройти; ++номер)
{
var ключ = путь[номер];
if (!(ключ in вложенность))
{
вложенность[ключ] = {};
вложенность = вложенность[ключ];
}
}
// Значение в конце вложенности.
var ключ = путь[пройти];
вложенность[ключ] = значение;
};
мир.синхронизироватьЭлементТело = function(элемент, тело) {
if (тело.isSleeping)
{
return false;
}
let x = тело.position.x - элемент.offsetWidth / 2;
let y = тело.position.y - элемент.offsetHeight / 2;
let угол = тело.angle;
элемент.style.transform = `translate(${x}px, ${y}px) rotate(${угол}rad)`;
return true;
};

View File

@@ -2,6 +2,9 @@
движок: null, движок: null,
настройки: { настройки: {
enableSleeping: true, enableSleeping: true,
gravity: {
y: 2,
},
}, },
создать: function() { создать: function() {
мир.физика.движок = Matter.Engine.create(мир.физика.настройки); мир.физика.движок = Matter.Engine.create(мир.физика.настройки);
@@ -10,4 +13,3 @@
Matter.Engine.update(мир.физика.движок); Matter.Engine.update(мир.физика.движок);
}, },
}; };

View File

@@ -0,0 +1,97 @@
function Изображения(корень)
{
this.создать = function()
{
this.умолчание = {
x: 0,
y: 0,
ширина: 100,
высота: 100,
угол: 0,
};
this.задано = {};
this.элементы = {};
};
this.обработатьКлюч = function(ключ, путь, значение)
{
var имя = путь[1];
var свойство = путь.slice(2).join(".");
this.обновитьЭлемент(имя, свойство, значение);
};
this.создатьИлиПолучитьЭлемент = function(имя)
{
var эл = this.элементы[имя];
if (эл)
{
return эл;
}
var ум = this.умолчание;
эл = document.createElement("div");
эл.id = `изображения-${имя}`;
эл.style.position = "absolute";
эл.style.display = "block";
// Свойства по умолчанию.
эл.style.width = `${ум.ширина}px`;
эл.style.height = `${ум.высота}px`;
эл.style.transform = `translate(${ум.x}px, ${ум.y}px) rotate(${ум.угол}rad)`;
this.элементы[имя] = эл;
корень.appendChild(эл);
return эл;
};
this.обновитьЭлемент = function(имя, свойство, значение)
{
if (!this.задано[имя])
{
this.задано[имя] = {};
}
this.задано[имя][свойство] = значение;
var за = this.задано[имя];
var эл = this.создатьИлиПолучитьЭлемент(имя);
if (свойство == "ширина")
{
эл.style.width = `${за.ширина}px`;
}
else if (свойство == "высота")
{
эл.style.height = `${за.высота}px`;
}
else if (
(свойство == "x") ||
(свойство == "y") ||
(свойство == "угол") ||
(свойство == "вид.transform")
) {
var ум = this.умолчание;
var x = за.x ? за.x : ум.x;
var y = за.y ? за.y : ум.y;
var угол = за.угол ? за.угол : ум.угол;
this.обновитьРасположение(имя, x, y, угол);
}
else if (свойство.startsWith("вид"))
{
var параметр = свойство.substring(4);
эл.style.setProperty(параметр, значение);
}
};
this.обновитьРасположение = function(имя, x, y, угол)
{
var за = this.задано[имя];
var эл = this.элементы[имя];
var transform = `translate(${x}px, ${y}px) rotate(${угол}deg) `;
if (за["вид.transform"])
{
transform += за["вид.transform"];
}
эл.style.transform = transform;
};
// Конструктор.
this.создать();
}

132
150.тела.js Normal file
View File

@@ -0,0 +1,132 @@
function Тела(физмир)
{
this.создать = function()
{
this.умолчание = {
x: 0,
y: 0,
ширина: 40,
высота: 20,
угол: 0,
часть: false,
физика: {
isStatic: true,
},
};
this.задано = {};
this.тела = {};
this.имена = {};
};
this.обработатьКлюч = function(ключ, путь, значение)
{
var имя = путь[1];
var свойство = путь.slice(2).join(".");
if (!this.задано[имя])
{
this.задано[имя] = {};
}
this.задано[имя][свойство] = значение;
this.пересоздатьТело(имя);
};
this.пересоздатьТело = function(имя) {
// Удаляем старое тело.
if (имя in this.тела)
{
var тело = this.тела[имя];
delete this.имена[тело.id];
// Всегда удаляем из мира:
// * тело не часть;
// * тело было не частью, а потом стало частью.
Matter.Composite.remove(физмир, тело);
}
var за = this.задано[имя];
var ум = this.умолчание;
var x = (за.x != null) ? за.x : ум.x;
var y = (за.y != null) ? за.y : ум.y;
var ширина = за.ширина ? за.ширина : ум.ширина;
var высота = за.высота ? за.высота : ум.высота;
// Переводим x,y из левого верхнего угла в центр.
/**/console.debug("Тела.пересоздатьТ-1 имя:", имя, "x/y/ширина/высота:", x, y, ширина, высота);
x = x + ширина / 2.0;
y = y + высота / 2.0;
/**///console.debug("Тела.пересоздатьТ-2 имя:", имя, "x/y/ширина/высота:", x, y, ширина, высота);
// Параметры тела.
var параметры = {};
Object.assign(параметры, ум.физика);
for (var путь in за)
{
if (путь.startsWith("физика"))
{
var свойство = путь.slice(7);
мир.задать(параметры, свойство, за[путь]);
}
}
var тело = null;
// Создаём новое составное тело.
if (за["части.0"])
{
параметры["parts"] = this.телаЧастей(this.именаЧастей(за));
тело = Matter.Body.create(параметры);
}
// Создаём новое несоставное тело.
else
{
тело = Matter.Bodies.rectangle(x, y, ширина, высота, параметры);
}
this.тела[имя] = тело;
this.имена[тело.id] = имя;
// Добавляем в физический мир, если не часть другого составного мира.
var часть = за.часть ? за.часть : ум.часть;
if (!часть)
{
Matter.Composite.add(физмир, тело);
}
};
this.именаЧастей = function(за)
{
var имена = [];
for (var ключ in за)
{
if (ключ.startsWith("части"))
{
имена.push(за[ключ]);
}
}
return имена;
};
this.телаЧастей = function(имена)
{
var тела = [];
for (var н in имена)
{
var имя = имена[н];
var тело = this.тела[имя];
тела.push(тело);
}
return тела;
};
this.отладить = function()
{
console.debug("Тела.отладить. НАЧАЛО");
for (var имя in this.тела)
{
var тело = this.тела[имя];
console.debug("тело имя/id/позиция:", имя, тело.id, тело.position);
}
console.debug("Тела.отладить. КОНЕЦ");
};
// Конструктор.
this.создать();
}

View File

@@ -1,16 +1,18 @@
мир.объекты = { мир.объекты = {
умолчание: { умолчание: {
x: 100, x: 0,
y: 100, y: 0,
ширина: 40, ширина: 40,
высота: 20, высота: 20,
статика: true, физика: {
isStatic: true,
},
}, },
задано: {}, задано: {},
тела: {}, тела: {},
имена: {},
элементы: {}, элементы: {},
свойстваТела: ["x", "y", "ширина", "высота", "статика"], свойстваТела: ["x", "y", "ширина", "высота", "физика"],
обновить: обновитьОбъекты,
}; };
@@ -26,43 +28,51 @@
var имя = путь[1]; var имя = путь[1];
var свойство = путь[2]; var свойство = путь[2];
сохранитьЗаданноеЗначение(имя, свойство, значение); if (!(имя in мир.объекты.задано))
пересоздатьТело(имя, свойство, значение); {
обновитьЭлемент(имя, свойство, значение); мир.объекты.задано[имя] = {};
обновитьВидЭлемента(путь, имя, свойство, значение); }
var свойствоПуть = путь.slice(2).join(".");
мир.объекты.задано[имя][свойствоПуть] = значение;
мир.объекты.пересоздатьТело(имя, свойство);
мир.объекты.обновитьЭлемент(имя, свойство, значение);
мир.объекты.обновитьВидЭлемента(путь, имя, свойство, значение);
}); });
// // // // // // // //
function обновитьОбъекты() мир.объекты.обновить = function()
{ {
for (var имя in мир.объекты.тела) for (var имя in мир.объекты.тела)
{ {
var тело = мир.объекты.тела[имя]; var тело = мир.объекты.тела[имя];
if (тело.isSleeping) var элемент = мир.объекты.элементы[имя];
if (!тело || !элемент)
{ {
continue; continue;
} }
var элемент = мир.объекты.элементы[имя]; var засинхрили = мир.синхронизироватьЭлементТело(элемент, тело);
let x = тело.position.x - элемент.offsetWidth / 2;
let y = тело.position.y - элемент.offsetHeight / 2;
let угол = тело.angle;
элемент.style.transform = `translate(${x}px, ${y}px) rotate(${угол}rad)`;
}
}
function сохранитьЗаданноеЗначение(имя, свойство, значение) // Учесть значения transform из JSON-JS.
{ if (засинхрили)
if (!(имя in мир.объекты.задано))
{ {
мир.объекты.задано[имя] = {}; var transform = мир.объекты.задано[имя]["вид.transform"];
if (transform)
{
элемент.style.transform += transform;
} }
мир.объекты.задано[имя][свойство] = значение; }
} }
};
function пересоздатьТело(имя, свойство, значение)
// // // //
мир.объекты.пересоздатьТело = function(имя, свойство)
{ {
if (!мир.объекты.свойстваТела.includes(свойство)) if (!мир.объекты.свойстваТела.includes(свойство))
{ {
@@ -74,25 +84,41 @@ function пересоздатьТело(имя, свойство, значени
{ {
var тело = мир.объекты.тела[имя]; var тело = мир.объекты.тела[имя];
Matter.Composite.remove(мир.физика.движок.world, тело); Matter.Composite.remove(мир.физика.движок.world, тело);
delete мир.объекты.имена[тело.id];
} }
// Пересоздать физическое тело. // Пересоздать физическое тело.
var за = мир.объекты.задано[имя]; var за = мир.объекты.задано[имя];
var ум = мир.объекты.умолчание; var ум = мир.объекты.умолчание;
var x = за["x"] ? за["x"] : ум["x"]; var x = за.x != null ? за.x : ум.x;
var y = за["y"] ? за["y"] : ум["y"]; var y = за.y != null ? за.y : ум.y;
var ширина = за["ширина"] ? за["ширина"] : ум["ширина"]; var ширина = за.ширина ? за.ширина : ум.ширина;
var высота = за["высота"] ? за["высота"] : ум["высота"]; var высота = за.высота ? за.высота : ум.высота;
var свойства = { // Переводим x,y из левого-верхнего угла в центр.
isStatic: ("статика" in за) ? за.статика : ум.статика, x = x + ширина / 2.0;
}; y = y + высота / 2.0;
var физика = {};
Object.assign(физика, ум.физика);
for (var путь in за)
{
if (путь.startsWith("физика"))
{
var свойство = путь.slice(7);
мир.задать(физика, свойство, за[путь]);
}
}
var тело = Matter.Bodies.rectangle(x, y, ширина, высота, свойства); var тело = Matter.Bodies.rectangle(x, y, ширина, высота, физика);
Matter.Composite.add(мир.физика.движок.world, тело); Matter.Composite.add(мир.физика.движок.world, тело);
мир.объекты.тела[имя] = тело; мир.объекты.тела[имя] = тело;
} мир.объекты.имена[тело.id] = имя;
};
function обновитьЭлемент(имя, свойство, значение)
// // // //
мир.объекты.обновитьЭлемент = function(имя, свойство, значение)
{ {
var за = мир.объекты.задано[имя]; var за = мир.объекты.задано[имя];
var ум = мир.объекты.умолчание; var ум = мир.объекты.умолчание;
@@ -104,7 +130,7 @@ function обновитьЭлемент(имя, свойство, значени
элемент.style.position = "absolute"; элемент.style.position = "absolute";
элемент.style.display = "block"; элемент.style.display = "block";
элемент.style.transformOrigin = "center"; элемент.style.transformOrigin = "center";
document.body.appendChild(элемент); document.getElementById("корень").appendChild(элемент);
мир.объекты.элементы[имя] = элемент; мир.объекты.элементы[имя] = элемент;
// Свойства по умолчанию. // Свойства по умолчанию.
элемент.style.width = `${ум.ширина}px`; элемент.style.width = `${ум.ширина}px`;
@@ -125,7 +151,11 @@ function обновитьЭлемент(имя, свойство, значени
} }
} }
function обновитьВидЭлемента(путь, имя, свойство, значение)
// // // //
мир.объекты.обновитьВидЭлемента = function(путь, имя, свойство, значение)
{ {
if (свойство != "вид") if (свойство != "вид")
{ {
@@ -135,5 +165,4 @@ function обновитьВидЭлемента(путь, имя, свойств
var элемент = мир.объекты.элементы[имя]; var элемент = мир.объекты.элементы[имя];
var параметр = путь[3]; var параметр = путь[3];
элемент.style.setProperty(параметр, значение); элемент.style.setProperty(параметр, значение);
console.debug(имя, свойство, параметр, значение);
} }

29
180.ввод.js Normal file
View File

@@ -0,0 +1,29 @@
мир.ввод = {
клавиши: {},
};
// // // //
window.addEventListener("keydown", function(o) {
мир.ввод.обработатьКлавишу(o.key, true);
});
window.addEventListener("keyup", function(o) {
мир.ввод.обработатьКлавишу(o.key, false);
});
// // // //
мир.ввод.обработатьКлавишу = function(клавиша, нажата)
{
// Исключаем повторы.
if (мир.ввод.клавиши[клавиша] == нажата)
{
return;
}
мир.ввод.клавиши[клавиша] = нажата;
};

97
200.движение.js Normal file
View File

@@ -0,0 +1,97 @@
function Движение(ключники) {
this.создать = function()
{
this.задано = {};
var тут = this;
ключники.push(function(ключ, путь, значение) {
if (!путь[0].startsWith("движение"))
{
return;
}
тут.обработатьКлюч(ключ, путь, значение);
});
};
this.обработатьКлюч = function(ключ, путь, значение)
{
var имя = путь[1];
var свойство = путь.slice(2).join(".");
if (!this.задано[имя])
{
this.задано[имя] = {};
}
this.задано[имя][свойство] = значение;
};
this.обновить = function()
{
for (var имя in this.задано)
{
var значения = this.задано[имя];
for (var свойство in значения)
{
if (свойство.startsWith("объект"))
{
var объект = значения[свойство];
this.передвинуть(объект, значения);
}
}
}
};
this.передвинуть = function(объект, значения)
{
var тело = мир.объекты.тела[объект];
var скоростьX = значения["скорость.0"];
var скоростьY = значения["скорость.1"];
var началоX = значения["x.0"];
var конецX = значения["x.1"];
var началоY = значения["y.0"];
var конецY = значения["y.1"];
if (
!тело ||
(скоростьX == null) ||
(скоростьY == null) ||
(началоX == null) ||
(началоY == null) ||
(конецX == null) ||
(конецY == null)
) {
return;
}
if (!тело.скоростьX)
{
тело.скоростьX = скоростьX;
}
if (!тело.скоростьY)
{
тело.скоростьY = скоростьY;
}
if (тело.position.x < началоX)
{
тело.скоростьX = скоростьX;
}
else if (тело.position.x > конецX)
{
тело.скоростьX = скоростьX * -1;
}
if (тело.position.y < началоY)
{
тело.скоростьY = скоростьY;
}
else if (тело.position.y > конецY)
{
тело.скоростьY = скоростьY * -1 * мир.физика.движок.gravity.y;
}
Matter.Sleeping.set(тело, false);
Matter.Body.setVelocity(тело, { x: тело.скоростьX, y: тело.скоростьY });
};
// Конструктор.
this.создать();
}

20
300.события.js Normal file
View File

@@ -0,0 +1,20 @@
мир.события = {
обработчики: [],
подписать: function(обработчик) {
мир.события.обработчики.push(обработчик);
},
отписать: function(обработчик) {
var номер = мир.события.обработчики.indexOf(обработчик);
if (номер != -1)
{
мир.события.обработчики.splice(номер, 1);
}
},
уведомить: function(событие) {
for (var номер in мир.события.обработчики)
{
var обработчик = мир.события.обработчики[номер];
обработчик.обработатьСобытие(событие);
}
},
};

124
320.игрок.js Normal file
View File

@@ -0,0 +1,124 @@
мир.игрок = {
задано: {},
прыжок: {
статус: 0,
время: new Date(),
скоростьОтсутствия: 0.0001,
},
приземление: {
скорость: 0,
},
тело: null,
};
// // // //
мир.ключники.push(function(ключ, путь, значение){
if (!ключ.startsWith("игрок"))
{
return;
}
var свойство = путь.slice(1).join(".");
мир.игрок.задано[свойство] = значение;
});
// // // //
мир.игрок.обновить = function() {
var тело = мир.объекты.тела[мир.игрок.задано.объект];
if (!тело)
{
тело = мир.тела.тела[мир.игрок.задано.тело];
}
мир.игрок.тело = тело;
if (!мир.игрок.тело)
{
return;
}
мир.игрок.переместить();
мир.игрок.отслеживатьПрыжкиПриземления();
};
// // // //
мир.игрок.переместить = function()
{
var к = [
мир.игрок.задано["клавиши.0"],
мир.игрок.задано["клавиши.1"],
];
var влево = (мир.ввод.клавиши[к[0]] == true);
var вправо = (мир.ввод.клавиши[к[1]] == true);
var скоростьГ = мир.игрок.задано["скорость.0"];
var скоростьX = 0;
var скоростьВ = мир.игрок.задано["скорость.1"];
var скоростьY = (мир.игрок.прыжок.статус == 1) ? -скоростьВ : мир.игрок.тело.velocity.y;
if (влево)
{
скоростьX = -скоростьГ;
}
else if (вправо)
{
скоростьX = скоростьГ;
}
Matter.Sleeping.set(мир.игрок.тело, false);
Matter.Body.setVelocity(мир.игрок.тело, { x: скоростьX, y: скоростьY });
};
// // // /
мир.игрок.отслеживатьПрыжкиПриземления = function()
{
if (мир.игрок.прыжок.статус == 1)
{
мир.игрок.прыжок.статус = 2;
мир.события.уведомить("игрок в прыжке");
}
var нетДвижения = (Math.abs(мир.игрок.тело.velocity.y) < мир.игрок.прыжок.скоростьОтсутствия);
var клавиша = мир.игрок.задано["клавиши.2"];
var вверх = (мир.ввод.клавиши[клавиша] == true);
if (
мир.игрок.прыжок.статус == 0 &&
вверх &&
нетДвижения
) {
мир.игрок.прыжок.статус = 1;
мир.игрок.приземление.скорость = 0;
мир.события.уведомить("игрок начал прыжок");
}
if (мир.игрок.прыжок.статус != 2)
{
return;
}
var скорость = мир.игрок.тело.velocity.y;
if (скорость > мир.игрок.приземление.скорость)
{
мир.игрок.приземление.скорость = скорость;
}
var сейчас = new Date();
var прошло = сейчас - мир.игрок.прыжок.время;
if (
(прошло > 20) &&
нетДвижения
) {
мир.игрок.прыжок.время = сейчас;
мир.игрок.прыжок.статус = 0;
мир.события.уведомить("игрок приземлился");
}
};

114
350.слежение.js Normal file
View File

@@ -0,0 +1,114 @@
function Слежение(корень, изображения, тела, объекты)
{
this.создать = function()
{
this.умолчание = {
смещение: [0, 0],
скорость: 1,
};
this.задано = {};
};
this.обработатьКлюч = function(ключ, путь, значение)
{
var имя = путь[1];
var свойство = путь.slice(2).join(".");
if (!this.задано[имя])
{
this.задано[имя] = {};
}
this.задано[имя][свойство] = значение;
};
this.обновить = function()
{
for (var имя in this.задано)
{
var за = this.задано[имя];
if (имя == "камера")
{
this.расположитьЭлемент(корень, за, this.расположениеКамеры);
}
else
{
/**///console.debug("слежение.обновить эл", имя);
var изо = изображения.элементы[за["изображение"]];
this.расположитьЭлемент(изо, за);
}
}
};
this.расположитьЭлемент = function(элемент, за, формула)
{
var тело = null;
if (за["объект"])
{
тело = объекты.тела[за["объект"]];
}
else if (за["тело"])
{
тело = тела.тела[за["тело"]];
}
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;
/**///console.debug("x0/y0:", x0, y0, "x1/y1:", x1, y1);
// Преобразование целевой позиции.
// Сейчас лишь для камеры.
if (формула)
{
var итог = формула(x1, y1);
x1 = итог[0];
y1 = итог[1];
}
// Устанавливаемая плавно позиция.
var x = this.lerp(x0, x1, скорость);
var y = this.lerp(y0, y1, скорость);
элемент.dataset.слежениеX = x;
элемент.dataset.слежениеY = y;
элемент.style.transform = `translate(${x}px, ${y}px)`;
};
this.расположениеКамеры = function(x, y)
{
return [
window.innerWidth / 2 - x,
window.innerHeight / 2 - y,
];
};
this.lerp = function(v0, v1, t) {
// Убираем мельтешение.
var delta = Math.abs(v0 - v1);
if (delta < 1) {
return v0;
}
return v0 * (1 - t) + v1 * t;
};
// Конструктор.
this.создать();
};

View File

@@ -0,0 +1,63 @@
мир.маскиПрыжков = {
задано: {},
};
// // // //
мир.ключники.push(function(ключ, путь, значение){
if (!путь[0].startsWith("маскиПрыжков"))
{
return;
}
var имя = путь[1];
var свойство = путь.slice(2).join(".");
if (!мир.маскиПрыжков.задано[имя])
{
мир.маскиПрыжков.задано[имя] = {};
}
мир.маскиПрыжков.задано[имя][свойство] = значение;
});
// // // //
мир.маскиПрыжков.обновить = function()
{
var за = мир.маскиПрыжков.задано;
for (var имя in за)
{
var з = за[имя];
var объект = з["объект"];
var имяТела = з["тело"];
var скорость = з["скорость"];
var маскаДо = з["маски.0"];
var маскаПосле = з["маски.1"];
if ((!объект && !имяТела) || (скорость == null) || (маскаДо == null) || (маскаПосле == null))
{
continue;
}
var тело = null;
if (объект)
{
тело = мир.объекты.тела[объект];
}
else if (имяТела)
{
тело = мир.тела.тела[имяТела];
}
if (!тело)
{
continue;
}
var маска = (тело.velocity.y < скорость) ? маскаДо : маскаПосле;
тело.collisionFilter.mask = маска;
}
};

72
380.звуки.js Normal file
View File

@@ -0,0 +1,72 @@
function Звуки(ключники, события) {
this.создать = function() {
this.задано = {};
this.аудио = {};
события.подписать(this);
var тут = this;
ключники.push(function(ключ, путь, значение) {
тут.обработатьКлюч(ключ, путь, значение);
});
};
this.обработатьКлюч = function(ключ, путь, значение) {
if (!путь[0].startsWith("звуки"))
{
return;
}
var имя = путь[1];
var свойство = путь.slice(2).join(".");
if (!this.задано[имя])
{
this.задано[имя] = {};
}
this.задано[имя][свойство] = значение;
};
this.обработатьСобытие = function(событие) {
for (var имя in this.задано)
{
var значения = this.задано[имя];
if (!значения.файл)
{
continue;
}
for (var свойство in значения)
{
if (свойство.startsWith("события"))
{
var значение = значения[свойство];
if (событие == значение)
{
this.воспроизвести(значения.файл, значения.повторять);
return;
}
}
}
}
};
this.воспроизвести = function(файл, повторять)
{
if (!this.аудио[файл])
{
this.аудио[файл] = new Audio(файл);
}
var звук = this.аудио[файл];
звук.pause();
звук.currentTime = 0;
звук.play();
if (повторять)
{
звук.onended = function() {
звук.play();
}
}
};
// Конструктор.
this.создать();
}

View File

@@ -0,0 +1,73 @@
мир.столкновения = {
задано: {},
};
// // // //
мир.ключники.push(function(ключ, путь, значение){
if (!путь[0].startsWith("столкновения"))
{
return;
}
var имя = путь[1];
var свойство = путь.slice(2).join(".");
if (!мир.столкновения.задано[имя])
{
мир.столкновения.задано[имя] = {};
}
мир.столкновения.задано[имя][свойство] = значение;
});
// // // //
мир.столкновения.создать = function()
{
Matter.Events.on(мир.физика.движок, "collisionActive", мир.столкновения.обработать);
};
// // // //
мир.столкновения.обработать = function(событие)
{
var за = мир.столкновения.задано;
for (var имя in за)
{
var ст = за[имя];
var имя1 = ст["объекты.0"];
var имя2 = ст["объекты.1"];
var имя2тело = ст["тела.0"];
if (!имя1 || (!имя2 && !имя2тело) || !ст.событие)
{
continue;
}
var пары = событие.pairs;
for (var номер in пары)
{
var пара = пары[номер];
var п1 = мир.объекты.имена[пара.bodyA.id];
var п2 = мир.объекты.имена[пара.bodyB.id];
var п2тело = мир.тела.имена[пара.bodyB.id];
if (!п2)
{
п2 = п2тело;
}
if (
!((имя1 == п1) && (имя2 == п2)) &&
!((имя1 == п2) && (имя2 == п1))
) {
continue;
}
мир.события.уведомить(ст.событие);
}
}
};

View File

@@ -0,0 +1,39 @@
function Ограничитель() {
this.создать = function()
{
this.ограничитель = null;
};
this.обновить = function()
{
if (this.ограничитель || !мир.игрок.тело)
{
return;
}
this.ограничитель = true;
this.создатьОграничитель();
};
this.создатьОграничитель = function()
{
var ф2 = {
isSensor: true,
isStatic: false,
inertia: Infinity,
density: 0.0000001,
};
var тело2 = Matter.Bodies.rectangle(1170, 350, 40, 40, ф2);
var x = мир.игрок.тело.position.x;
var y = мир.игрок.тело.position.y - 50;
Matter.Body.setPosition(тело2, { x: x, y: y });
//Matter.Body.setParts(мир.игрок.тело, [тело2]);
console.debug("создан compound");
//мир.игрок.тело.collisionFilter.mask = 1|2;
};
// Конструктор.
this.создать();
}

View File

@@ -0,0 +1,72 @@
function РучноеТело() {
this.настроить = function()
{
if (this.настроено)
{
return;
}
this.настроено = true;
// 1.
this.тело1 = Matter.Bodies.rectangle(125, 300, 40, 40, { isSensor: true });
this.элемент1 = document.createElement("div");
document.getElementById("корень").appendChild(this.элемент1);
this.элемент1.style.position = "absolute";
this.элемент1.style.display = "block";
this.элемент1.style.transformOrigin = "center";
this.элемент1.style.width = `40px`;
this.элемент1.style.height = `40px`;
this.элемент1.style.setProperty("background", "url(р/отладка/основа.jpg)");
this.элемент1.style.setProperty("z-index", "100");
// 2.
this.тело2 = Matter.Bodies.rectangle(55, 300, 40, 40, { inertia: Infinity });
this.элемент2 = document.createElement("div");
document.getElementById("корень").appendChild(this.элемент2);
this.элемент2.style.position = "absolute";
this.элемент2.style.display = "block";
this.элемент2.style.transformOrigin = "center";
this.элемент2.style.width = `40px`;
this.элемент2.style.height = `40px`;
this.элемент2.style.setProperty("background", "url(р/отладка/основа.jpg)");
this.элемент2.style.setProperty("z-index", "100");
/*
Matter.Composite.add(мир.физика.движок.world, this.тело1);
Matter.Composite.add(мир.физика.движок.world, this.тело2);
мир.объекты.тела["рт"] = this.тело2;
this.тело = this.тело2;
*/
// Compound.
this.тело = Matter.Body.create({
parts: [this.тело1, this.тело2],
inertia: Infinity,
});
Matter.Composite.add(мир.физика.движок.world, this.тело);
мир.объекты.тела["рт"] = this.тело;
мир.объекты.тела["рт1"] = this.тело1;
мир.объекты.имена[this.тело1.id] = "рт1";
мир.объекты.тела["рт2"] = this.тело2;
мир.объекты.имена[this.тело2.id] = "рт2";
};
this.обновить = function()
{
this.настроить();
if (!this.тело)
{
return;
}
мир.синхронизироватьЭлементТело(this.элемент1, this.тело1);
мир.синхронизироватьЭлементТело(this.элемент2, this.тело2);
};
this.отладить = function()
{
console.debug("РТ.отладить. позиции тело/тело1/тело2:", this.тело.position, this.тело1.position, this.тело2.position);
};
}

56
700.пуск.js Normal file
View File

@@ -0,0 +1,56 @@
function Пуск()
{
this.запустить = function()
{
var корень = document.getElementById("корень");
мир.физика.создать();
мир.изображения = new Изображения(корень);
мир.тела = new Тела(мир.физика.движок.world);
мир.слежение = new Слежение(корень, мир.изображения, мир.тела, мир.объекты);
мир.столкновения.создать();
мир.звуки = new Звуки(мир.ключники, мир.события);
мир.движение = new Движение(мир.ключники);
/**///мир.рт = new РучноеТело();
this.настроитьОбработкуКлючей();
this.обновить();
};
this.настроитьОбработкуКлючей = function()
{
мир.ключники.push(function(ключ, путь, значение) {
if (путь[0] == "изображения")
{
мир.изображения.обработатьКлюч(ключ, путь, значение);
}
else if (путь[0] == "тела")
{
мир.тела.обработатьКлюч(ключ, путь, значение);
}
else if (путь[0] == "слежение")
{
мир.слежение.обработатьКлюч(ключ, путь, значение);
}
});
};
this.обновить = function()
{
мир.физика.обновить();
мир.объекты.обновить();
мир.игрок.обновить();
мир.слежение.обновить();
мир.маскиПрыжков.обновить();
мир.движение.обновить();
var тут = this;
requestAnimationFrame(function() {
тут.обновить();
});
/**///мир.рт.обновить();
};
}
мир.пуск = new Пуск();

783
800.пример.json.js Normal file
View File

@@ -0,0 +1,783 @@
// // // //
// Основа избы
// // // //
мир.разобрать({
заголовок: "Колобку здесь быть",
изображения: {
дом: {
ширина: 2000,
высота: 600,
вид: {
background: "url(р/сцены/изба.jpg)",
},
},
},
объекты: {
полСлева: {
x: 0,
y: 580,
ширина: 355,
вид: {
background: "url(р/отладка/основа.jpg)",
display: "none",
},
},
/*
полКрышки: {
x: 357,
y: 580,
ширина: 135,
вид: {
background: "url(р/отладка/основа.jpg)",
display: "none",
},
},
*/
полСправа: {
x: 495,
y: 580,
ширина: 1505,
вид: {
background: "url(р/отладка/основа.jpg)",
display: "none",
},
},
стол: {
x: 1253,
y: 420,
ширина: 610,
вид: {
background: "url(р/отладка/основа.jpg)",
display: "none",
},
физика: {
collisionFilter: {
category: 2,
},
},
},
подоконник: {
x: 1673,
y: 375,
ширина: 200,
вид: {
background: "url(р/отладка/основа.jpg)",
display: "none",
},
физика: {
angle: -0.0698,
collisionFilter: {
category: 2,
},
},
},
},
звуки: {
изба: {
события: ["вошли в избу"],
файл: "р/звуки/387922__setuniman__scheming-1o95.mp3",
повторять: true,
останов: ["покинули избу"],
},
},
});
// // // //
// Игрок
// // // //
мир.разобрать({
изображения: {
колобок: {
ширина: 70,
высота: 70,
вид: {
background: "url(р/колобок/колобок_неподвижен.png)",
//"z-index": 10,
},
},
изоСенсорИгрока: {
ширина: 70,
высота: 70,
вид: {
background: "url(р/отладка/основа.jpg)",
},
},
изоПодошваИгрока: {
ширина: 40,
высота: 20,
вид: {
background: "url(р/отладка/основа.jpg)",
},
},
},
тела: {
подошваИгрока: {
x: 100,
y: 450,
ширина: 40,
высота: 20,
часть: true,
физика: {
isStatic: false,
inertia: Infinity,
},
},
сенсорИгрока: {
x: 100,
y: 400,
ширина: 70,
высота: 70,
часть: true,
физика: {
isSensor: true,
isStatic: false,
},
},
игрок: {
части: ["подошваИгрока", "сенсорИгрока"],
физика: {
isStatic: false,
inertia: Infinity,
},
},
},
объекты: {
/*
кирпич: {
x: 100,
y: 350,
высота: 20,
ширина: 40,
вид: {
background: "url(р/отладка/основа.jpg)",
//display: "none",
},
физика: {
isStatic: false,
inertia: Infinity,
},
},
*/
},
игрок: {
//объект: "кирпич",
тело: "игрок",
скорость: [5, 12.5],
клавиши: ["ArrowLeft", "ArrowRight", "ArrowUp"],
},
слежение: {
колобок: {
//объект: "кирпич",
тело: "игрок",
изображение: "колобок",
смещение: [-35, -35],
скорость: 1,
},
камера: {
//объект: "кирпич",
тело: "игрок",
скорость: 0.1,
},
/*
сенсорИгрока: {
тело: "сенсорИгрока",
изображение: "изоСенсорИгрока",
смещение: [-35, -35],
},
*/
/*
подошваИгрока: {
тело: "подошваИгрока",
изображение: "изоПодошваИгрока",
смещение: [-20, -10],
},
*/
},
маскиПрыжков: {
игрок: {
//объект: "кирпич",
тело: "игрок",
скорость: -1,
маски: [1, 1|2],
},
},
звуки: {
прыжокИгрока: {
события: ["игрок начал прыжок"],
файл: "р/звуки/331381__qubodup__public-domain-jump-sound.wav",
},
},
});
// // // //
// Платформы и объекты печи
// // // //
мир.разобрать({
объекты: {
фундаментПечи: {
x: 570,
y: 470,
ширина: 550,
вид: {
background: "url(р/отладка/основа.jpg)",
display: "none",
},
физика: {
collisionFilter: {
category: 2,
},
},
},
полка1: {
x: 660,
y: 335,
ширина: 40,
высота: 10,
вид: {
background: "url(р/отладка/основа.jpg)",
display: "none",
},
физика: {
collisionFilter: {
category: 2,
},
},
},
полка2: {
x: 767,
y: 335,
ширина: 40,
высота: 10,
вид: {
background: "url(р/отладка/основа.jpg)",
display: "none",
},
физика: {
collisionFilter: {
category: 2,
},
},
},
полка3: {
x: 855,
y: 335,
ширина: 40,
высота: 10,
вид: {
background: "url(р/отладка/основа.jpg)",
display: "none",
},
физика: {
collisionFilter: {
category: 2,
},
},
},
полкаСамовара: {
x: 975,
y: 355,
ширина: 70,
высота: 10,
вид: {
background: "url(р/отладка/основа.jpg)",
display: "none",
},
физика: {
collisionFilter: {
category: 2,
},
},
},
лежанкаПечки: {
x: 600,
y: 242,
ширина: 330,
высота: 10,
вид: {
background: "url(р/отладка/основа.jpg)",
display: "none",
},
физика: {
collisionFilter: {
category: 2,
},
},
},
основаниеТрубыПечки: {
x: 937,
y: 175,
ширина: 130,
высота: 10,
вид: {
background: "url(р/отладка/основа.jpg)",
display: "none",
},
физика: {
collisionFilter: {
category: 2,
},
},
},
самовар: {
x: 650,
y: 300,
ширина: 70,
высота: 120,
вид: {
background: "url(р/вещи/самовар.png) no-repeat scroll 0% 0% / contain",
},
физика: {
isStatic: false,
//inertia: Infinity,
},
},
},
});
// // // //
// Подкидывание стрелы
// // // //
мир.разобрать({
объекты: {
сенсор: {
x: 1280,
y: 400,
ширина: 120,
вид: {
background: "url(р/отладка/основа.jpg)",
display: "none",
},
физика: {
isStatic: true,
isSensor: true,
},
},
стрела: {
x: 1230,
y: 350,
высота: 30,
ширина: 200,
вид: {
display: "inline-block",
background: "url(р/вещи/стрела.png) no-repeat scroll 0% 0% / contain",
transform: "scaleX(-1)",
},
физика: {
isStatic: false,
inertia: Infinity,
collisionFilter: {
category: 4,
},
},
},
лук: {
x: 1250,
y: 200,
ширина: 100,
вид: {
background: "url(р/отладка/основа.jpg)",
display: "none",
},
физика: {
isStatic: true,
collisionFilter: {
category: 4,
},
},
},
},
столкновения: {
стрелаНачало: {
объекты: ["сенсор"],
тела: ["игрок"],
событие: "сенсор стрелы",
},
стрелаКонец: {
объекты: ["стрела", "лук"],
событие: "стрела и лук",
},
},
маскиПрыжков: {
стрела: {
объект: "стрела",
скорость: -1,
маски: [0, 2|4]
},
},
звуки: {
зарядкаЛука: {
события: ["закинули стрелу"],
файл: "р/звуки/543927__eminyildirim__pistol-gun-cocking.wav",
},
},
});
function ПодкидываниеСтрелы() {
this.создать = function() {
this.времяСтрелы = null;
this.времяПриземления = null;
this.подкинули = false;
this.закинули = false;
this.завершить = null;
мир.события.подписать(this);
};
this.обработатьСобытие = function(событие) {
if (событие == "сенсор стрелы")
{
this.времяСтрелы = мир.физика.движок.timing.timestamp;
this.подкинуть();
}
else if (событие == "игрок приземлился")
{
this.времяПриземления = мир.физика.движок.timing.timestamp;
this.подкинуть();
}
else if (событие == "игрок начал прыжок")
{
this.времяСтрелы = null;
this.времяПриземления = null;
this.подкинули = false;
}
else if (
(событие == "стрела и лук") &&
this.закинули &&
this.завершить
) {
мир.события.уведомить("закинули стрелу");
мир.события.отписать(this);
this.завершить();
}
};
this.подкинуть = function() {
if (
this.подкинули ||
!this.времяСтрелы ||
!this.времяПриземления ||
Math.abs(this.времяСтрелы - this.времяПриземления) > 0.00001 ||
Math.abs(мир.объекты.тела.стрела.velocity.y) > 0.00001
) {
return;
}
this.подкинули = true;
Matter.Body.setVelocity(
мир.объекты.тела.стрела,
{ x: 0, y: -мир.игрок.приземление.скорость * 1.2 }
);
if (мир.игрок.приземление.скорость > 16)
{
this.закинули = true;
}
};
// Конструктор.
this.создать();
}
мир.подкидываниеСтрелы = new ПодкидываниеСтрелы();
мир.подкидываниеСтрелы.завершить = function() {
мир.подкидываниеСтрелы = null;
};
// Запустить звук избы
мир.события.уведомить("вошли в избу");
// // // //
// Пауки и мыши
// // // //
мир.разобрать({
объекты: {
паук1: {
x: 680,
y: 300,
ширина: 30,
вид: {
background: "url(р/животные/паук.png) no-repeat scroll 0% 0% / contain",
},
физика: {
isStatic: false,
isSensor: true,
},
},
мышь1: {
x: 500,
y: 555,
высота: 70,
ширина: 90,
вид: {
background: "url(р/животные/мышь.png) no-repeat scroll 0% 0% / contain",
},
физика: {
isStatic: false,
isSensor: true,
},
},
},
столкновения: {
игрокПаук1: {
объекты: ["паук1"],
тела: ["игрок"],
событие: грокПаук1",
},
игрокМышь1: {
объекты: ["мышь1"],
тела: ["игрок"],
событие: грокМышь1",
},
леваяСтенаМышь1: {
объекты: ["мышь1", "стенаЛевая"],
событие: еваяСтенаМышь1",
},
праваяСтенаМышь1: {
объекты: ["мышь1", "стенаПравая"],
событие: "праваяСтенаМышь1",
},
},
движение: {
паук1: {
объекты: ["паук1"],
скорость: [0.7, 1],
x: [610, 1080],
y: [350, 450],
},
мышь1: {
объекты: ["мышь1"],
скорость: [8, 1.0],
x: [0, 2000],
y: [590, 590],
},
},
});
// // // //
// Повреждение игрока
// // // //
function ПовреждениеИгрока(события, колобок, имяТела)
{
this.создать = function()
{
события.подписать(this);
this.создатьМигание();
this.запомнитьМаску();
this.повреждение = null;
};
this.создатьМигание = function()
{
var вид = document.createElement('style')
вид.innerText = `
.мигание
{
animation: мигатель 0.5s linear infinite;
}
@keyframes мигатель
{
50%
{
opacity: 0;
}
}
`;
document.head.appendChild(вид)
};
this.обработатьСобытие = function(событие)
{
if (событие == грокПаук1")
{
this.повредить(1);
}
else if (событие == грокМышь1")
{
this.повредить(10);
}
};
this.запомнитьМаску = function()
{
var за = мир.маскиПрыжков.задано;
for (var имя in за)
{
var з = за[имя];
if (з.тело == имяТела)
{
this.имя = имя;
this.маски = [з["маски.0"], з["маски.1"]];
return;
}
}
};
this.выставитьМаскиПовреждения = function(значение)
{
var з = мир.маскиПрыжков.задано[this.имя];
з["маски.0"] = значение;
з["маски.1"] = значение;
};
this.вернутьПервоначальныеМаски = function()
{
var з = мир.маскиПрыжков.задано[this.имя];
з["маски.0"] = this.маски[0];
з["маски.1"] = this.маски[1];
};
this.повредить = function(значение)
{
if (!this.повреждение)
{
колобок.classList.add("мигание");
}
this.выставитьМаскиПовреждения(значение);
this.повреждение = new Date();
var тут = this;
setTimeout(
function() { тут.возможноПрекратить() },
5000
);
};
this.возможноПрекратить = function()
{
if (!this.повреждение)
{
return;
}
var сейчас = new Date();
var прошло = сейчас - this.повреждение;
if (прошло > 4990)
{
колобок.classList.remove("мигание")
this.вернутьПервоначальныеМаски();
this.повреждение = null;
}
};
// Конструктор.
this.создать();
}
мир.повреждениеИгрока = new ПовреждениеИгрока(
мир.события,
мир.изображения.элементы.колобок,
"игрок"
);
function ПереворачиватьМышь(события, имяМыши)
{
this.создать = function()
{
события.подписать(this);
};
this.обработатьСобытие = function(событие)
{
if (событие == еваяСтенаМышь1")
{
/**/console.debug("соб. леваяСМ1");
мир.разобрать({
объекты: {
мышь1: {
вид: {
transform: "scaleX(-1)",
},
},
},
});
}
else if (событие == "праваяСтенаМышь1")
{
/**/console.debug("соб. праваяСМ1");
мир.разобрать({
объекты: {
мышь1: {
вид: {
transform: "scaleX(1)",
},
},
},
});
}
};
// Конструктор.
this.создать();
}
мир.переворачиватьМышь = new ПереворачиватьМышь(
мир.события,
"мышь1"
);
// // // //
// Подпол и стены
// // // //
мир.разобрать({
объекты: {
полПодпола: {
x: 0,
y: 980,
ширина: 2000,
высота: 50,
вид: {
background: "url(р/отладка/основа.jpg)",
//display: "none",
},
физика: {
collisionFilter: {
category: 10,
},
},
},
стенаЛевая: {
x: -40,
y: 0,
высота: 1000,
вид: {
background: "url(р/отладка/основа.jpg)",
display: "none",
},
},
стенаПравая: {
x: 2000,
y: 0,
высота: 1000,
вид: {
background: "url(р/отладка/основа.jpg)",
display: "none",
},
},
},
});

View File

@@ -9,22 +9,79 @@
margin: 0; margin: 0;
padding: 0; padding: 0;
overflow: hidden; overflow: hidden;
background: #fbfbfb;
} }
body { body {
height: 100vh; height: 100vh;
width: 100vw; width: 100vw;
}
#заставка {
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
background: #ffffff;
z-index: 100;
}
#заставка > img {
position: absolute;
top: 50%;
left: 50%;
margin-left: -320px;
margin-top: -240px;
}
#корень {
position: relative;
}
#отладка {
position: absolute;
right: 2em;
bottom: 2em;
} }
</style> </style>
</head> </head>
<body> <body>
<script src="00100.мир.js"></script>
<script src="00110.заголовок.js"></script> <script>
<script src="00120.физика.js"></script> function загрузитьСкрипт(адрес)
<script src="00130.объекты.js"></script> {
<script src="00140.клавиши.js"></script> var скрипт = document.createElement('script');
<script src="01000.пуск.js"></script> скрипт.src = адрес;
<script src="01300.пример.json.js"></script> document.head.appendChild(скрипт);
<script src="02000.обновление.js"></script> }
function запустить()
{
document.getElementById("заставка").style.display = "none";
мир.пуск.запустить();
загрузитьСкрипт("800.пример.json.js");
загрузитьСкрипт("900.обновление.js");
}
</script>
<div id="заставка" onclick="запустить()">
<img src="р/сцены/заставка.jpg">
</div>
<div id="корень"></div>
<div id="отладка"></div>
<script src="100.мир.js"></script>
<script src="105.заголовок.js"></script>
<script src="120.физика.js"></script>
<script src="130.изображения.js"></script>
<script src="150.тела.js"></script>
<script src="170.объекты.js"></script>
<script src="180.ввод.js"></script>
<script src="200.движение.js"></script>
<script src="300.события.js"></script>
<script src="320.игрок.js"></script>
<script src="350.слежение.js"></script>
<script src="360.маскиПрыжков.js"></script>
<script src="380.звуки.js"></script>
<script src="400.столкновения.js"></script>
<script src="666.ограничитель.js"></script>
<script src="667.ручноетело.js"></script>
<script src="700.пуск.js"></script>
</body> </body>
</html> </html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 161 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

Binary file not shown.

3
р/звуки/README.md Normal file
View File

@@ -0,0 +1,3 @@
* https://freesound.org/people/qubodup/sounds/331381/
* https://freesound.org/people/Setuniman/sounds/387922/
* https://freesound.org/people/EminYILDIRIM/sounds/543927/

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

BIN
р/сцены/изба.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 KiB

BIN
р/сцены/изба.xcf Normal file

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

View File

@@ -37,6 +37,9 @@ console.debug("fileName:", fileName);
case "jpg": case "jpg":
contentType = "image/jpg"; contentType = "image/jpg";
break; break;
case "wav":
contentType = "image/vnd.wave";
break;
} }
fs.readFile(fileName, function(err, content) { fs.readFile(fileName, function(err, content) {
if (err) if (err)