提问人:daniel vor 提问时间:11/13/2023 最后编辑:VLAZdaniel vor 更新时间:11/14/2023 访问量:50
如何在 W A S D 上进行字符控制?
how to do character control on w a s d?
问:
我制作了鼠标控件,但是,当我使用 onkeydown 而不是 onmousedown 时,角色会移动几毫秒并停止,当松开按钮时,角色会进入空闲动画。 我该如何解决?
这是我向右和向左移动的代码:
const rightHandler = () => {
heroImg.style.transform = "scale(1,1)";
direction = "right";
spritePosition = spritePosition + 1;
imgBlockPosition = imgBlockPosition + 1;
if (spritePosition > 7) {
spritePosition = 0;
}
heroImg.style.left = `-${spritePosition * 64}px`;
heroImg.style.top = '-64px';
imgBlock.style.left = `${imgBlockPosition * 7}px`;
}
const leftHandler = () => {
heroImg.style.transform = "scale(-1,1)";
direction = "left";
spritePosition = spritePosition - 1;
imgBlockPosition = imgBlockPosition - 1;
if (spritePosition < 7) {
spritePosition = 13;
}
heroImg.style.left = `-${spritePosition * 64}px`;
heroImg.style.top = '-64px';
imgBlock.style.left = `${imgBlockPosition * 7}px`;
}
这是 onmousedown 和 onmouseup 的代码:
let onMouseDown = (event) => {
clearInterval(timer);
x = event.screenX;
timer = setInterval(() => {
if (x > halfWidth) {
direction = "right";
rightHandler();
}
else {
direction = "left";
leftHandler();
}
}, 100);
}
let onMouseUp = (event) => {
clearInterval(timer);
idleAnimation();
}
但是当我使用此代码时:
let onKeyDown = (event) => {
clearInterval(timer);
var keyCode = event.keyCode;
timer = setInterval(() => {
if (keyCode == 39) {
direction = "right";
rightHandler();
}
else if (keyCode == 37) {
direction = "left";
leftHandler();
}
}, 100);
}
let onKeyUp = () => {
clearInterval(timer);
idleAnimation();
}
我的角色在几秒钟后停止移动。 我需要更改什么?
答:
0赞
Rickard Elimää
11/13/2023
#1
如果按住该键,将不断触发,清除间隔,然后设置间隔,在运行之前清除它,设置新的间隔,等等。onpress
使用布尔值来跟踪某个键是否被按下。如果按下它,请调用另一个递归调用自己的方法。
此外,如果要制作动画,请不要使用,因为每次屏幕更新之间可能会发生多次计算,这会导致动画卡顿。请改用 requestAnimationFrame。setInterval
下面是一个示例,说明它可能是什么样子的:
var keyPressed = -1;
const DIRECTIONS = {
39: {direction: 1, name: "rightArrow"},
37: {direction: -1, name: "leftArrow"}
}
let onKeyDown = (event) => {
if (keyPressed == event.keyCode) { return }
let keyCode = event.keyCode;
if (DIRECTIONS[keyCode]) {
move(DIRECTIONS[keyCode], keyCode);
}
}
const move = (direction, keyCode) => {
console.log(direction);
if (keyCode == keyPressed) {
requestAnimationFrame(() => move(direction, keycode));
}
}
let onKeyUp = (event) => {
keyPressed = -1;
}
document.addEventListener('keydown', onKeyDown);
document.addEventListener('keyup', onKeyUp);
Click on this area, then hit left or right arrows.
评论
0赞
Kokodoko
11/13/2023
有一个小错误,如果您按下多个键但松开一个键,另一个键也将计为释放。而且由于只有一个条件可以成立,因此不能按 W,D 沿对角线移动。
0赞
Rickard Elimää
11/13/2023
@Kokodoko 是的,但这也在 OP 的代码中,所以我不想做任何没有要求的花哨的事情。
上一个:冲突的“if”语句
评论