Pygame - 使用鼠标实现第一人称射击游戏的视角控制

6
我不是在写游戏,而是使用Pygame编写科学渲染器。我希望控制方式与第一人称射击游戏类似,这样用户就能使用一组熟悉的控件进行导航。
我试过编写代码,使其具有像《天际》或《半条命》中“查看”功能的属性,但鼠标无法移动光标 - 它可以让您在无限循环中四处观看。单击没有任何效果。
控制方式的第一次尝试:
(游戏循环内的代码)
delta_y, delta_x = pygame.mouse.get_rel()
rotation_direction.x = float(delta_x)
rotation_direction.y = float(delta_y)

(don't ask me why, but y and x need to be reversed like this to get the expected look directions; must be something to do with the camera transform implementation, which isn't mine.)
然而,这会导致光标停留在窗口上方,当光标到达屏幕边缘时,窗口停止旋转;即代码正在报告屏幕上的实际位置。
我尝试在每个游戏循环中“重置”鼠标位置(顺便隐藏鼠标):
pygame.mouse.set_pos([150, 150])
pygame.mouse.set_visible(False)

但是这会在下一个循环中生成一个对称的“回到起点”的增量,意味着你无法“看”任何地方。
总结一下,我想要:
  • 检测从设备报告的实际鼠标移动
  • 不移动/显示任何操作系统光标
  • 不在“屏幕边缘”剪辑
使用 Pygame 或其他 Python 技巧,哪种方法是最好的?
3个回答

6

http://www.pygame.org/docs/ref/mouse.html :

如果鼠标光标被隐藏,并且输入被抓到当前显示器,则鼠标将进入虚拟输入模式,鼠标的相对移动将永远不会被屏幕边界停止。请查看函数 pygame.mouse.set_visible - 隐藏或显示鼠标光标以及 pygame.event.set_grab (文档) - 控制与其他应用程序共享输入设备以进行配置。


换句话说,也可以称为pygame.event.set_grab(True)。 - Ofir
啊哈,我在文档中查找了鼠标捕获函数,但没有找到,因此在我的答案中提出了建议。 - Kylotan
在我的电脑上,顺序很重要。先抓取再隐藏鼠标仍然会被卡在边缘,而先抓取再隐藏则正常运行。 - cuppajoeman

1
尝试在调用set_pos后立即再次调用pygame.mouse.get_rel(),以“丢弃”set_pos调用所执行的任何相对移动。

我在发布问题后也考虑过这个,但@Ofir的答案更简单。谢谢! - tehwalrus
他的回答也是“正确”的方式。 :) - Kylotan
我没有说出来,因为听起来有点刻薄!但是,是的,我想这是 :) - tehwalrus

0

虽然这并没有严格回答问题(问题是关于鼠标事件捕获的),但gluLookAt是我以前从未见过的东西,对于任何试图解决这个问题的人来说都非常相关 - 在我的情况下,它可以让我避免使用一些Python代码(速度较慢)手动完成相同的事情。感谢您的提示! :) - tehwalrus

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