Задать вопрос
@Erik_Galiev09

Ломание 3D объекта через клик?

Создал 3D игру, нужен код, который удалял бы платформу.

Код.
// Мировые константы

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("Чтобы продолжить нажмите кнопку 'ОК'");
	
}
  • Вопрос задан
  • 83 просмотра
Подписаться 1 Средний 5 комментариев
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы