在Javascript中处理相机式鼠标移动(启用连续鼠标移动)

时间:2011-07-26 22:08:40

标签: javascript mouse handler webgl

想法:我正在创建一个简单的WebGL脚本(使用mrdoob的精彩three.js),允许用户在对象世界中控制相机。相机应该模拟传统的第一人称射击相机(例如参考Team Fortress 2)。也就是说,相机仅在鼠标移动时移动。

问题:在Javascript中,检测鼠标移动的唯一方法是光标本身是否移动。相比之下,FPS游戏不会显示光标 - 它们只是将相机的移动基于鼠标本身的移动方式。因此,您可以在任何方向上将鼠标移动到鼠标垫上,它始终有效。

在浏览器上,由于相机移动基于光标,因此您无法移动,但到目前为止。当光标到达屏幕边缘时,用户无法再向该方向看(例如,您将鼠标移动到屏幕的左边缘,不能再向左看了。)

解决方案:我想过两个解决方案,但我都不知道如何实现。

  1. 移动鼠标后,javascript会将其重置为屏幕中心。这样,在每次鼠标移动后,玩家可以自由地再次向任何方向移动。问题在于,根据我所做的研究,Javascript无法控制用户鼠标的位置(可以理解,因为它会对恶意网站造成无法比拟的麻烦)。

  2. 或者,鼠标在屏幕周围“包裹”。这意味着,当用户到达屏幕的一个边缘时,鼠标将简单地继续到屏幕的另一侧。 (参见:http://www.digicowsoftware.com/detail?_app=Wraparound)但是,这似乎也不是javascript的固有功能,而只是第三方程序可以解决的问题。

  3. 那么问题是否有意义?如果是这样,有什么方法可以实现上述解决方案,还是有另外一个我错过了?

4 个答案:

答案 0 :(得分:4)

全球社区目前正在制定解决此问题的规范草案。你所说的是“鼠标锁定”。我在这个标准的第一阶段做了一点工作,以帮助列出所需要的东西。请投票支持这些问题,并订阅指定的邮件列表,以便我们所有人尽快纠正此问题。

然而,仍然有一种方法可以实现你的目标(这是我发现的另一种方式):一个控制鼠标的本机插件。

(我正在制作一款游戏,这是一款FPS但由于此限制目前不会发布)

答案 1 :(得分:3)

对于任何仍然有兴趣实现这一目标的人来说,它现在已经可以使用了。

使用:

document.addEventListener('pointerlockchange', changeCallback, false);

参见示例 http://www.html5rocks.com/en/tutorials/pointerlock/intro/

答案 2 :(得分:1)

你对这一切都是正确的。基于标准的网络技术不会像你想要的那样为你捕捉鼠标。

那说:你可以制作(或找到)一个特殊的SWF,它可以收集鼠标移动数据并将其传递给javascript。尽管您可以在鼠标捕获处于活动状态时使用CSS隐藏光标,但它不会限制光标移动。但它可能能够例如即使光标到达屏幕的左边缘,也会继续触发“向左移动鼠标”事件。

当光标在视口之外时,即在浏览器chrome上,任何此类SWF都可能无法捕获移动。

答案 3 :(得分:0)

鉴于在HTML5 / Javascript中显然不可能这样做,这个变体怎么样:将鼠标位置(不是鼠标移动)视为表示转动速度。

因此,如果鼠标距中心左侧超过某个阈值,则摄像机向左转;鼠标离开的距离越远,相机转动的速度就越快。要停止转动,播放器会将鼠标移回中心。

对我而言,这是一个令人讨厌的用户界面,至少在最初阶段,但也许玩家会习惯它。由于我们没有任何完美的解决方案,因此可能值得尝试。您可以通过允许箭头键在许多FPS中的工作方式,在按下时旋转相机来缓解问题。