// Мировые константы
var pi = 3.141592;
var deg = pi/180;
// Конструктор player
function player(x,y,z,rx,ry) {
this.x = x;
this.y = y;
this.z = z;
this.rx = rx;
this.ry = ry;
this.vx = 3;
this.vy = 5;
this.vz = 3;
}
// Массив прямоугольников
var map = [
[0,0,1000,0,180,0,2000,200,"#F0C0FF"], // стена [0,0,1000,0,180,0,2000,200,"#F0C0FF"] запад
[0,0,-1000,0,0,0,2000,200,"#F0C0FF"], // стена [0,0,-1000,0,0,0,2000,200,"#F0C0FF"] север
[1000,0,0,0,-90,0,2000,200,"#F0C0FF"], // стена [1000,0,0,0,-90,0,2000,200,"#F0C0FF"] восток
[-1000,0,0,0,90,0,2000,200,"#F0C0FF"], // стена [-1000,0,0,0,90,0,2000,200,"#F0C0FF"] юг
[0,0,-300,70,0,0,200,500,"#F000FF"], // розовая подымающая платформа ([0,0,-300,70,0,0,200,500,"#F000FF")
[0,-86,-786,90,0,0,200,500,"#F000FF"], // розовая прямая платформа ([0,-86,-786,90,0,0,200,500,"#F000FF"])
[-500,0,-300,20,0,0,200,500,"#00FF00"], // нижняя зеленая платформа под острым углом (изначальные координаты [-500,0,-300,20,0,0,200,500,"#00FF00"])
[0,-800,0,90,0,0,500,500,"#00FF00"], // база зеленая платформа (изначальные координаты [0,-800,0,90,0,0,500,500,"#00FF00"])
[0,-350,1000,60,0,0,500,1800,"#FFFF00"], // желтый подъем (изначальные координаты были [0,-400,700,60,0,0,500,900,"#FFFF00"])
[0,100,0,90,0,0,2000,2000,"#666666"], // непонятно что
[0,100,0,90,0,0,2000,10010,"#666666"], // пол (изначальные координаты были [0,100,0,90,0,0,2000,2010,"#666666"])
// 5.0
[0,0,-1190,3000,0,0,200,500,"#F000FF"], // розовая подымающая платформа ([0,0,-300,70,0,0,200,500,"#F000FF")
// 0.6-1.0
[0,0,-5000,0,0,0,2000,200,"#F0C0FF"], // стена север для лабиринта
[500,0,825,3000,0,0,200,500,"#F000FF"], // розовая подымающая платформа для тестировочного места
// салатовый домик
[750,100,1260,90,0,0,500,500,"#42f57e"], // пол
[750,-100,1260,90,0,0,500,500,"#42f57e"] // крыша не доделана
];
// Нажата ли клавиша и двигается ли мышь?
var PressBack = 0;
var PressForward = 0;
var PressLeft = 0;
var PressRight = 0;
var PressUp = 0;
var MouseX = 0;
var MouseY = 0;
// Создадим переменные
var lock = false;
var onGround = false;
var container = document.getElementById("container");
var world = document.getElementById("world");
var g = 0.1;
var dx = dy = dz = 0;
// Обработчик изменения состояния захвата курсора
document.addEventListener("pointerlockchange", (event)=>{
lock = !lock;
});
// Обработчик захвата курсора мыши
container.onclick = function(){
if (!lock) container.requestPointerLock();
};
// Обработчик нажатия клавиш
document.addEventListener("keydown", (event) =>{
if (event.key == "a"){
PressLeft = 1;
}
if (event.key == "w"){
PressForward = 1;
}
if (event.key == "d"){
PressRight = 1;
}
if (event.key == "s"){
PressBack = 1;
}
if (event.keyCode == 32){
PressUp = 1;
}
if (event.keyCode2 == "q"){
PressUp2 = 2;
}
});
// Обработчик нажатия клавиш
document.addEventListener("keydown", (event) =>{
if (event.key == "ф"){
PressLeft = 1;
}
if (event.key == "ц"){
PressForward = 1;
}
if (event.key == "в"){
PressRight = 1;
}
if (event.key == "ы"){
PressBack = 1;
}
if (event.keyCode == 32){
PressUp = 1;
}
if (event.keyCode2 == "q"){
PressUp2 = 2;
}
});
// Обработчик отжатия клавиш
document.addEventListener("keyup", (event) =>{
if (event.key == "a"){
PressLeft = 0;
}
if (event.key == "w"){
PressForward = 0;
}
if (event.key == "d"){
PressRight = 0;
}
if (event.key == "s"){
PressBack = 0;
}
if (event.keyCode == 32){
PressUp = 0;
}
if (event.keyCode2 == "q"){
PressUp2 = 0;
}
});
document.addEventListener("keyup", (event) =>{
if (event.key == "ф"){
PressLeft = 0;
}
if (event.key == "ц"){
PressForward = 0;
}
if (event.key == "в"){
PressRight = 0;
}
if (event.key == "ы"){
PressBack = 0;
}
if (event.keyCode == 32){
PressUp = 0;
}
if (event.keyCode2 == "q"){
PressUp2 = 0;
}
});
// Обработчик движения мыши
document.addEventListener("mousemove", (event)=>{
MouseX = event.movementX;
MouseY = event.movementY;
});
// Создаем новый объект
var pawn = new player(0,-900,0,0,0);
function update(){
// Задаем локальные переменные смещения
dx = ((PressRight - PressLeft)*Math.cos(pawn.ry*deg) - (PressForward - PressBack)*Math.sin(pawn.ry*deg))*pawn.vx;
dz = ( -(PressForward - PressBack)*Math.cos(pawn.ry*deg) - (PressRight - PressLeft)*Math.sin(pawn.ry*deg))*pawn.vz;
dy = dy + g;
if (onGround){
dy = 0;
if (PressUp){
dy = - PressUp*pawn.vy;
onGround = false;
}
};
drx = MouseY;
dry = - MouseX;
// Обнулим смещения мыши:
MouseX = MouseY = 0;
// Проверяем коллизию с прямоугольниками
collision();
// Прибавляем смещения к координатам
pawn.x = pawn.x + dx;
pawn.y = pawn.y + dy;
pawn.z = pawn.z + dz;
// Если курсор захвачен, разрешаем вращение
if (lock){
pawn.rx = pawn.rx + drx;
pawn.ry = pawn.ry + dry;
};
// Изменяем координаты мира (для отображения)
world.style.transform =
"translateZ(" + (600 - 0) + "px)" +
"rotateX(" + (-pawn.rx) + "deg)" +
"rotateY(" + (-pawn.ry) + "deg)" +
"translate3d(" + (-pawn.x) + "px," + (-pawn.y) + "px," + (-pawn.z) + "px)";
};
function CreateNewWorld(){
for (let i = 0; i < map.length; i++){
// Создание прямоугольника и придание ему стилей
let newElement = document.createElement("div");
newElement.className = "square";
newElement.id = "square" + i;
newElement.style.width = map[i][6] + "px";
newElement.style.height = map[i][7] + "px";
newElement.style.background = map[i][8];
newElement.style.transform = "translate3d(" +
(600 - map[i][6]/2 + map[i][0]) + "px," +
(400 - map[i][7]/2 + map[i][1]) + "px," +
(map[i][2]) + "px)" +
"rotateX(" + map[i][3] + "deg)" +
"rotateY(" + map[i][4] + "deg)" +
"rotateZ(" + map[i][5] + "deg)";
// Вставка прямоугольника в world
world.append(newElement);
}
}
function collision(){
onGround = false;
for(let i = 0; i < map.length; i++){
// рассчитываем координаты игрока в системе координат прямоугольника
let x0 = (pawn.x - map[i][0]);
let y0 = (pawn.y - map[i][1]);
let z0 = (pawn.z - map[i][2]);
if ((x0**2 + y0**2 + z0**2 + dx**2 + dy**2 + dz**2) < (map[i][6]**2 + map[i][7]**2)){
let x1 = x0 + dx;
let y1 = y0 + dy;
let z1 = z0 + dz;
let point0 = coorTransform(x0,y0,z0,map[i][3],map[i][4],map[i][5]);
let point1 = coorTransform(x1,y1,z1,map[i][3],map[i][4],map[i][5]);
let normal = coorReTransform(0,0,1,map[i][3],map[i][4],map[i][5]);
// Условие коллизии и действия при нем
if (Math.abs(point1[0])<(map[i][6]+98)/2 && Math.abs(point1[1])<(map[i][7]+98)/2 && Math.abs(point1[2]) < 50){
point1[2] = Math.sign(point0[2])*50;
let point2 = coorReTransform(point1[0],point1[1],point1[2],map[i][3],map[i][4],map[i][5]);
let point3 = coorReTransform(point1[0],point1[1],0,map[i][3],map[i][4],map[i][5]);
dx = point2[0] - x0;
dy = point2[1] - y0;
dz = point2[2] - z0;
if (Math.abs(normal[1]) > 0.8){
if (point3[1] > point2[1]) onGround = true;
}
else dy = y1 - y0;
}
}
};
}
function coorTransform(x0,y0,z0,rxc,ryc,rzc){
let x1 = x0;
let y1 = y0*Math.cos(rxc*deg) + z0*Math.sin(rxc*deg);
let z1 = -y0*Math.sin(rxc*deg) + z0*Math.cos(rxc*deg);
let x2 = x1*Math.cos(ryc*deg) - z1*Math.sin(ryc*deg);
let y2 = y1;
let z2 = x1*Math.sin(ryc*deg) + z1*Math.cos(ryc*deg);
let x3 = x2*Math.cos(rzc*deg) + y2*Math.sin(rzc*deg);
let y3 = -x2*Math.sin(rzc*deg) + y2*Math.cos(rzc*deg);
let z3 = z2;
return [x3,y3,z3];
}
function coorReTransform(x3,y3,z3,rxc,ryc,rzc){
let x2 = x3*Math.cos(rzc*deg) - y3*Math.sin(rzc*deg);
let y2 = x3*Math.sin(rzc*deg) + y3*Math.cos(rzc*deg);
let z2 = z3
let x1 = x2*Math.cos(ryc*deg) + z2*Math.sin(ryc*deg);
let y1 = y2;
let z1 = -x2*Math.sin(ryc*deg) + z2*Math.cos(ryc*deg);
let x0 = x1;
let y0 = y1*Math.cos(rxc*deg) - z1*Math.sin(rxc*deg);
let z0 = y1*Math.sin(rxc*deg) + z1*Math.cos(rxc*deg);
return [x0,y0,z0];
}
CreateNewWorld();
TimerGame = setInterval(update,10);
var sun = [0.48,0.8,0.36];
function PressUp3(){
var modifications = 1;
PressUp = 3;
}
function pause1(){
var pausee2oq = 304;
alert("Чтобы продолжить нажмите кнопку 'ОК'");
}