HollowBond/Public/ecma/Controls/DebugControls.ecma.js

161 lines
5.5 KiB
JavaScript

"use strict";
const DebugControls = (function(){
const DebugControls = function(hollow_bond){
const self = this,
euler = new THREE.Euler(0, 0, 0, "YXZ"),
keys = {
forward : false,
backward : false,
left : false,
right : false,
up : false,
down : false
};
let is_pointer_locked = false;
this.setup = inspector => {
const canvas = inspector.renderer.domElement;
canvas.addEventListener("click", () => canvas.requestPointerLock());
document.addEventListener("pointerlockchange", () => {
is_pointer_locked = (document.pointerLockElement === canvas);
});
document.addEventListener("mousemove", evt => {
if(!is_pointer_locked) return;
euler.setFromQuaternion(inspector.camera.quaternion);
euler.y -= evt.movementX * 0.002;
euler.x -= evt.movementY * 0.002;
euler.x = Math.max(-Math.PI / 2, Math.min(Math.PI / 2, euler.x));
inspector.camera.quaternion.setFromEuler(euler);
});
window.addEventListener("keydown", evt => {
// Teclas de movimiento
switch(evt.code){
case "KeyW":
case "ArrowUp":
keys.forward = true;
break;
case "KeyS":
case "ArrowDown":
keys.backward = true;
break;
case "KeyA":
case "ArrowLeft":
keys.left = true;
break;
case "KeyD":
case "ArrowRight":
keys.right = true;
break;
case "Space":
keys.up = true;
break;
case "ShiftLeft":
case "ShiftRight":
case "KeyC":
keys.down = true;
break;
// Cambio de estrato con Q y E
case "KeyE":
inspector.set_floor(inspector.current_floor + 1);
break;
case "KeyQ":
inspector.set_floor(inspector.current_floor - 1);
break;
// Rango de capas con las teclas numéricas 1 a 5
case "Digit0":
inspector.vertical_layers_range = 0;
inspector.update_layer_visibility();
inspector.update_hud();
break;
case "Digit1":
inspector.vertical_layers_range = 1;
inspector.update_layer_visibility();
inspector.update_hud();
break;
case "Digit2":
inspector.vertical_layers_range = 2;
inspector.update_layer_visibility();
inspector.update_hud();
break;
case "Digit3":
inspector.vertical_layers_range = 3;
inspector.update_layer_visibility();
inspector.update_hud();
break;
case "Digit4":
inspector.vertical_layers_range = 4;
inspector.update_layer_visibility();
inspector.update_hud();
break;
};
});
window.addEventListener("keyup", evt => {
switch(evt.code){
case "KeyW":
case "ArrowUp":
keys.forward = false;
break;
case "KeyS":
case "ArrowDown":
keys.backward = false;
break;
case "KeyA":
case "ArrowLeft":
keys.left = false;
break;
case "KeyD":
case "ArrowRight":
keys.right = false;
break;
case "Space":
keys.up = false;
break;
case "ShiftLeft":
case "ShiftRight":
case "KeyC":
keys.down = false;
break;
};
});
};
this.update_movement = (inspector, delta) => {
if(!is_pointer_locked)
return;
const movement = new THREE.Vector3();
if(keys.forward)
movement.z --;
if(keys.backward)
movement.z ++;
if(keys.left)
movement.x --;
if(keys.right)
movement.x ++;
if(movement.lengthSq() > 0){
movement.normalize();
movement.applyQuaternion(inspector.camera.quaternion);
};
if(keys.up)
movement.y ++;
if(keys.down)
movement.y --;
inspector.camera.position.addScaledVector(movement, 25 * delta);
};
};
return DebugControls;
})();