736 lines
20 KiB
JavaScript
736 lines
20 KiB
JavaScript
// // // //
|
||
// Основа избы
|
||
// // // //
|
||
|
||
|
||
мир.разобрать({
|
||
заголовок: "Колобку здесь быть",
|
||
изображения: {
|
||
дом: {
|
||
ширина: 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;
|
||
};
|
||
|
||
|
||
// Запустить звук избы
|
||
мир.события.уведомить("вошли в избу");
|
||
|
||
|
||
|
||
// // // //
|
||
// Отладка событий
|
||
// // // //
|
||
|
||
|
||
function ОтладкаСобытий() {
|
||
this.обработатьСобытие = function(событие) {
|
||
if (событие.startsWith("игрокПаук"))
|
||
{
|
||
//console.debug("событие", событие);
|
||
}
|
||
};
|
||
|
||
// Конструктор.
|
||
мир.события.подписать(this);
|
||
}
|
||
|
||
мир.отладкаСобытий = new ОтладкаСобытий();
|
||
|
||
|
||
|
||
// // // //
|
||
// Пауки и мыши
|
||
// // // //
|
||
|
||
мир.разобрать({
|
||
объекты: {
|
||
паук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"],
|
||
скорость: [0.7, 1],
|
||
x: [610, 1080],
|
||
y: [350, 450],
|
||
},
|
||
мышь1: {
|
||
объекты: ["мышь1"],
|
||
скорость: [8, 1.0],
|
||
x: [500, 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 (событие.startsWith("игрокПаук"))
|
||
{
|
||
this.повредить();
|
||
}
|
||
};
|
||
|
||
this.запомнитьМаску = function()
|
||
{
|
||
var за = мир.маскиПрыжков.задано;
|
||
for (var имя in за)
|
||
{
|
||
var з = за[имя];
|
||
if (з.тело == имяТела)
|
||
{
|
||
this.имя = имя;
|
||
this.маски = [з["маски.0"], з["маски.1"]];
|
||
return;
|
||
}
|
||
}
|
||
};
|
||
|
||
this.выставитьМаскиПовреждения = function()
|
||
{
|
||
var з = мир.маскиПрыжков.задано[this.имя];
|
||
з["маски.0"] = 1;
|
||
з["маски.1"] = 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 ПовреждениеИгрока(
|
||
мир.события,
|
||
мир.изображения.элементы.колобок,
|
||
"игрок"
|
||
);
|
||
|
||
|
||
// // // //
|
||
// Подпол и стены
|
||
// // // //
|
||
|
||
|
||
мир.разобрать({
|
||
объекты: {
|
||
полПодпола: {
|
||
x: 0,
|
||
y: 980,
|
||
ширина: 2000,
|
||
высота: 50,
|
||
вид: {
|
||
background: "url(р/отладка/основа.jpg)",
|
||
//display: "none",
|
||
},
|
||
},
|
||
стенаЛевая: {
|
||
x: -40,
|
||
y: 0,
|
||
высота: 1000,
|
||
вид: {
|
||
background: "url(р/отладка/основа.jpg)",
|
||
display: "none",
|
||
},
|
||
},
|
||
стенаПравая: {
|
||
x: 2000,
|
||
y: 0,
|
||
высота: 1000,
|
||
вид: {
|
||
background: "url(р/отладка/основа.jpg)",
|
||
display: "none",
|
||
},
|
||
},
|
||
},
|
||
});
|