Estoy trabajando en un controlador básico de cámara en primera persona en p5.JS, y estoy usando la función de movimiento dentro de una instrucción if (usa keyIsDown ) y todavía mueve la cámara cuando no se presiona la tecla (quiero decir como está abajo por un segundo y luego ya no se presiona).
También intenté usar while () pero eso lo bloquea.
let d; let cam; let x, y, z; let img; let floor_texture; //place holder image floor_texture = 'https://miro.medium.com/max/1400/1*WI5Zw1eKEKNmRX3zreeUHw.png'; function preload() { img = loadImage(floor_texture); } function setup() { createCanvas(windowWidth, windowHeight, WEBGL); x = 0; y = 0; z = 0; cam = createCamera(); } function draw() { d = dist background(255); cam.pan(-movedX * 0.005); cam.tilt(movedY * 0.005); fill('white'); sphere(25); fill('red'); texture(img); translate(0, 350, 0) box(5000, 500, 5000) if (keyIsPressed && keyCode === 69) { requestPointerLock(); } cam.move(x, y, z); if (keyIsDown(87)) { z -= 0.1; } } <script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.4.1/p5.js"></script>Es porque no establece una nueva z cada vez keyIsDown(87) , sino que cam.move con z como argumento.
Entonces algo como:
z = 0; cam.move(x,y,z); //here z = 0, so it doesn't move. z -= 0.1; cam.move(x,y,z); //here z = -0.1, so it moves, even if keyIsDown isn't true anymore. Cada vez keyIsDown(87) es true , solo aumenta la velocidad a la que move la cam .
Si desea establecer la posición z de esa manera, tendrá que encontrar una manera de establecer la posición de la cámara, en lugar de moverla.
O podrías hacer algo como:
draw() { ... if (keyIsDown(87)) { dz = -0.1; } else { dz = 0; } cam.move(dx,dy,dz) ... }Un nombre más preciso para x , y y z sería velocityX , velocityY y velocityZ . Esto se debe a que está agregando -0.1 a z cada cuadro si se presiona un botón. Luego se agrega z a la posición de la cámara. Entonces, en este caso, deberíamos restablecer z a 0 después de mover la cámara.
if (keyIsDown(87)) { z -= 0.1; } cam.move(x, y, z); z = 0;En este caso, está restando de z (su velocidad) en cada tic mientras se presiona la tecla 87 ( W ).
Actualmente, este valor nunca se restablece cuando suelta la tecla.
Si desea que el usuario tenga una velocidad constante mientras mantiene presionada la tecla, pase un valor constante cuando se presione la tecla (y 0 en caso contrario) en lugar de z cuando llame a cam.move .
Si desea que el usuario acelere cuando mantiene presionada la tecla (como lo hace actualmente), deberá agregar una forma de devolverlo a una velocidad z de 0 cuando no se presiona la tecla.