【问题标题】:Pygame - first person shooter "look" with mousePygame - 第一人称射击游戏用鼠标“看”
【发布时间】:2016-08-13 11:00:29
【问题描述】:

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

我尝试编写代码以使其具有与例如中的“外观”功能相同的属性。天际或半条命,但鼠标不会移动光标 - 它可以让你环顾四周,无限循环。点击应该没有效果。

控件的第一次尝试:

(游戏循环内的代码)

delta_y, delta_x = pygame.mouse.get_rel()
rotation_direction.x = float(delta_x)
rotation_direction.y = float(delta_y)

(不要问我为什么,但是需要像这样反转 y 和 x 以获得预期的外观方向;一定与相机变换实现有关,isn't mine。) em>

然而,这会导致光标位于窗口顶部,当光标到达屏幕边缘时,窗口停止旋转;即代码报告屏幕上的实际位置。

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

pygame.mouse.set_pos([150, 150])
pygame.mouse.set_visible(False)

但这会在下一个循环中生成一个对称的“回到起点”增量,这意味着您无法“查看”任何地方。

总而言之,我想:

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

使用 Pygame 或其他 Python hack 的最佳方法是什么?

【问题讨论】:

    标签: python mouse pygame pyopengl


    【解决方案1】:

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

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

    【讨论】:

    • 也就是说,也调用pygame.event.set_grab(True)
    • 啊哈,我在文档中查找了鼠标捕获功能但找不到它,因此在我的回答中提出了建议。
    【解决方案2】:

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

    【讨论】:

    • 我在发布问题后确实考虑过这一点,但@Ofir 的答案要简单得多。谢谢!
    • 他的回答也是“正确”的方式。 :)
    • 我没有这么说,因为这听起来有点刻薄!但是是的,我想它是:)
    【解决方案3】:

    由于您使用的是 pyOpenGL,请尝试gluLookAt() 示例:How do I use gluLookAt properly?

    【讨论】:

    • 虽然这并不能严格回答问题(关于鼠标事件捕获),但gluLookAt 是我以前从未见过的,并且看起来与任何试图解决此问题的人都非常相关 -就我而言,它可以让我避免使用一些 python 代码(慢得多)来手动做同样的事情。感谢您的提醒! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-03
    • 1970-01-01
    • 2015-05-19
    • 2018-04-03
    相关资源
    最近更新 更多