Skip to content

197. 玩家漫游(六)

Published:

前面我们的改变方向是通过鼠标拖动实现的:

2025-09-21 21.38.37.gif

这样当需要经常改变方向的时候,操作起来比较累。

能不能不用拖动,人物就朝着鼠标的方向走呢?

自然是可以的。

把这段代码去掉就可以:

image.png

之前是按下、拖动、抬起,通过状态判断是否改变方向。

现在只要 mousemove 鼠标移动就改变方向。

试一下:

2025-09-22 11.39.50.gif

但现在有个问题,如果我一直往左边转向,那需要鼠标一直往左划,很容易就划出屏幕了。

如何解决这个问题呢?

能不能实现鼠标无限滑动呢?

可以的。

浏览器支持这个,叫做鼠标锁定模式。

锁定之后鼠标会消失,但你可以无限左滑、右滑,按 ESC 退出这个模式。

我们来试一下:

image.png

document.addEventListener('mousedown', () => {
  document.body.requestPointerLock();
});
if(document.pointerLockElement === document.body) {

页面点击就进入这个模式,通过 requestPointerLock 开启。

然后如果是这个模式下,就通过鼠标移动来改变相机角度、人物角度。

试一下:

2025-09-22 11.48.04.gif

可以看到,点击网页,上面会出现一条提示,当前隐藏光标,按 ESC 退出。

这就是进入了鼠标锁定模式。

这时候就可以鼠标无限左滑、右滑,不用担心超出屏幕了。

这样就不用拖动就可以实现人物跟着光标走。

现在上下的视野范围是无限的:

2025-09-22 11.50.12.gif

而正常的人物视野是有一个范围的,我们限制一下:

image.png

const min = THREE.MathUtils.degToRad(-20);
const max = THREE.MathUtils.degToRad(20);
if(camera.rotation.x > max) {
  camera.rotation.x = max
} 
if(camera.rotation.x < min) {
  camera.rotation.x = min
}

限制在 -20 度到 20 度的范围,用 MathUtils.degToRad 把角度转为弧度。

试一下:

2025-09-22 11.54.11.gif

这样,上下的视野范围就限制住了。

案例代码上传了小册仓库

总结

这节我们学了指针锁定模式,之前是用鼠标拖动来改变方向,但频繁拖动操作起来会比较累。

所以我们改成了人物跟随鼠标移动方向走,但是又容易超出屏幕,所以我们用了鼠标锁定模式。

通过 document.body.requestPointerLock(); 开启这个模式,然后在这个模式下,鼠标是可以无限上下左右滑动的,就可以实现鼠标移动控制人物方向的目的。

判断这个模式用 document.pointerLockElement === document.body,此外如果你想退出这个模式也可以用

按 ESC 就可以退出鼠标锁定模式。

在游戏里,还是用鼠标锁定模式更多一些,这样操作人物更方便。

评论