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.move
以z
为参数
所以像这样:
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
move
秒的速度。
如果你想像那样设置 z
位置,你必须找到一种方法来设置相机位置,而不是移动它。
或者您可以这样做:
draw() {
...
if (keyIsDown(87)) {
dz = -0.1;
} else {
dz = 0;
}
cam.move(dx,dy,dz)
...
}
x
、y
和 z
更准确的名称是 velocityX
、velocityY
和 velocityZ
。这是因为如果按下按钮,您将每帧添加 -0.1
到 z
。 z
然后添加到相机的位置。所以在这种情况下,我们应该在移动相机后将z
重置为0
。
if (keyIsDown(87)) {
z -= 0.1;
}
cam.move(x, y, z);
z = 0;
我正在 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.move
以z
为参数
所以像这样:
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
move
秒的速度。
如果你想像那样设置 z
位置,你必须找到一种方法来设置相机位置,而不是移动它。
或者您可以这样做:
draw() {
...
if (keyIsDown(87)) {
dz = -0.1;
} else {
dz = 0;
}
cam.move(dx,dy,dz)
...
}
x
、y
和 z
更准确的名称是 velocityX
、velocityY
和 velocityZ
。这是因为如果按下按钮,您将每帧添加 -0.1
到 z
。 z
然后添加到相机的位置。所以在这种情况下,我们应该在移动相机后将z
重置为0
。
if (keyIsDown(87)) {
z -= 0.1;
}
cam.move(x, y, z);
z = 0;