keyIsDown 运行 键未按下时?

keyIsDown running when key isn't down?

我正在 p5.JS 中开发基本的第一人称相机控制器,我在 if 语句中使用移动函数(使用 keyIsDown),它仍然会移动相机当键未被按下时(我的意思是按下它一秒钟然后不再按下)。

我也试过使用 while () 但是它崩溃了。

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>

在这种情况下,当按下键 87 (W) 时,您将在每个刻度上从 z(您的速度)中减去。

目前,当您释放按键时,此值永远不会被重置。

如果您希望用户在按住键时保持恒定速度,请在按下键时传递一个常数值(否则为 0),而不是在调用 cam.move 时传递 z

如果您希望用户在按住按键时加速(就像他们目前所做的那样),您必须添加一种方法让他们 return 回到 z of 0未按下按键时的速度。

因为你没有每次keyIsDown(87)都设置一个新的z,而是你cam.movez为参数

所以像这样:

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.

每次keyIsDown(87)true,只是增加了cammove秒的速度。

如果你想像那样设置 z 位置,你必须找到一种方法来设置相机位置,而不是移动它。

或者您可以这样做:

draw() {
...



if (keyIsDown(87)) {
  dz = -0.1;
} else {
  dz = 0;
}

cam.move(dx,dy,dz)
...
}

xyz 更准确的名称是 velocityXvelocityYvelocityZ。这是因为如果按下按钮,您将每帧添加 -0.1zz 然后添加到相机的位置。所以在这种情况下,我们应该在移动相机后将z重置为0

if (keyIsDown(87)) {
  z -= 0.1;
}
cam.move(x, y, z);
z = 0;