按下按键时 keyIsDown 函数是否会运行,即使按键没有被按下?

4
我正在使用p5.JS制作基本的第一人称相机控制器,我在if语句内部使用move函数(使用 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>

3个回答

3

这是因为在每次按下 keyIsDown(87) 时,您没有设置一个新的z,而是用z作为参数移动了 cam.move

所以像这样做:

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时,它只会增加cam移动的速度。
如果您想像那样设置z位置,您需要找到一种方法来设置相机位置,而不是移动它。
或者您可以尝试像这样做:
draw() {
...



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

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

2
< p > xyz的更准确名称应该是velocityXvelocityYvelocityZ。这是因为如果按下一个按钮,每帧都会将-0.1添加到z。然后将z添加到相机的位置。所以在这种情况下,在移动相机后,我们应该将z重置为0。 < / p>
if (keyIsDown(87)) {
  z -= 0.1;
}
cam.move(x, y, z);
z = 0;

1
在这种情况下,当按下键盘上的87W)键时,您会在每次刻度中从z(您的速度)中减去。
目前,当您释放按键时,此值永远不会重置。
如果您希望用户在按住键时保持恒定的速度,请在调用cam.move 时传递一个常量值(否则为0),而不是z
如果您希望用户在按住键时加速(就像现在一样),则必须添加一种方法,在不按键时将其返回到z0的速度。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接