Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pygame-第一人称射击手“;“看”;用鼠标_Python_Mouse_Pygame_Pyopengl - Fatal编程技术网

Python Pygame-第一人称射击手“;“看”;用鼠标

Python Pygame-第一人称射击手“;“看”;用鼠标,python,mouse,pygame,pyopengl,Python,Mouse,Pygame,Pyopengl,我不是在写游戏,而是在用Pygame编写一个科学渲染器。我希望这些控件能够像第一人称射击游戏一样工作,这样用户就可以使用一组熟悉的控件进行导航 我曾尝试编写代码,使其具有与Skyrim或Half Life中的“look”功能相同的属性,但鼠标不移动光标-它允许您在无限的圆圈中环顾四周。点击应该没有效果 控件的第一次尝试: (游戏循环中的代码) delta_y,delta_x=pygame.mouse.get_rel() 旋转方向x=浮动(增量x) 旋转方向y=浮动(增量y) (不要问我为什么,

我不是在写游戏,而是在用Pygame编写一个科学渲染器。我希望这些控件能够像第一人称射击游戏一样工作,这样用户就可以使用一组熟悉的控件进行导航

我曾尝试编写代码,使其具有与Skyrim或Half Life中的“look”功能相同的属性,但鼠标不移动光标-它允许您在无限的圆圈中环顾四周。点击应该没有效果

控件的第一次尝试:

(游戏循环中的代码)

delta_y,delta_x=pygame.mouse.get_rel()
旋转方向x=浮动(增量x)
旋转方向y=浮动(增量y)
(不要问我为什么,但y和x需要像这样反转以获得预期的外观方向;必须与摄影机变换实现有关,这一点很重要。)

然而,这导致光标位于窗口顶部,当光标到达屏幕边缘时,窗口停止旋转;i、 e.代码在屏幕上报告实际位置

我尝试在每次游戏循环中“重置”鼠标位置(顺便说一句,隐藏鼠标):

pygame.mouse.set_pos([150150])
pygame.mouse.set_可见(False)
但这会在下一个循环中生成一个对称的“向后移动到开始”增量,这意味着你不能“看”任何地方

总而言之,我想:

  • 检测设备报告的实际鼠标移动
  • 不移动/显示任何操作系统光标
  • 不夹在“屏幕边缘”

使用Pygame或其他Python黑客,最好的方法是什么?

尝试调用
Pygame.mouse.get\u rel()
调用后立即再次调用
set\u pos
以“扔掉”该
set\u pos
调用执行的任何相对运动。

<


如果鼠标光标处于隐藏状态,并且输入被抓取到当前显示则鼠标将进入虚拟输入模式,在该模式下,鼠标的相对移动将永远不会被屏幕的边框停止。请参阅函数
pygame.mouse.set_visible
-隐藏或显示鼠标光标和
pygame.event.set_grab
()-控制与其他应用程序共享输入设备以进行配置。

由于您使用的是pyOpenGL,请尝试
gluLookAt()
示例:

换句话说,也可以调用pygame.event.set_grab(True)啊哈,我在文档中查找鼠标捕捉功能,但找不到,因此在我的答案中提出了建议。我在发布问题后确实考虑过这一点,但@Ofir的答案要简单得多。谢谢他的回答也是正确的我没有说那件事,因为听起来有点刻薄!但是,是的,我想它是:)虽然这并没有严格地回答这个问题(关于鼠标事件捕获,)
gluLookAt
是我以前没有见过的东西,看起来与任何试图解决这个问题的人都非常相关——在我的例子中,它允许我避免使用一些python代码(速度慢得多)手工完成同样的事情。谢谢你提醒我!:)