持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第25天,点击查看活动详情
pygame 实现操纵杆控制
除了游戏之外,操纵杆还不受在其他地方使用它们的需求的限制,并且完全可以自由地进行创新,因此现代操纵杆具有光滑的模制设计,并利用玩家可以使用的每个备用数字。虽然这个词
操纵杆通常用于表示任何类型的游戏控制器,它更严格地描述了飞行模拟中使用的飞行杆。
如今,游戏手柄最受游戏玩家的欢迎,并且通常带有控制台。它们舒适地放在两只手上,除了一个方向垫和两个拇指操作的模拟摇杆外,还具有许多按钮。想想你的 Xbox 或游戏机控制器。许多人将他们的 Xbox 控制器插入他们的计算机。
Pygame的操纵杆模块支持具有相同接口的各种控制器,并且不区分各种可用的设备。这是一件好事
因为我们不想为每个游戏控制器编写代码!
操纵杆基础知识
让我们从pygame.joystick 开始。操纵杆模块,仅包含五个简单功能:
-
init 操纵杆模块。这由pygame自动调用。init,所以你很少需要自己称呼它。
-
quit - 取消初始化操纵杆模块。与 init 一样,此函数是自动调用的,因此不经常需要。
-
pygame.joystick.get_init 如果操纵杆模块已初始化,则返回 True。如果它返回 False,则接下来的两个操纵杆函数将不起作用。
-
pygame.joystick.get_count - 返回当前插入计算机的操纵杆数。
-
pygame.joystick.joystick - 创建一个新的操纵杆对象,用于访问该操纵杆的所有信息。构造函数采用操纵杆的 ID - 第一个操纵杆的 ID 为 0,然后是 ID 1,依此类推,直至达到系统上可用的操纵杆数。
操纵杆模块中的前三个函数用于初始化过程,通常不手动调用。另外两个功能更重要,因为我们需要它们来找出插入计算机的操纵杆数量,并为我们要使用的任何操纵杆创建操纵杆对象。这些操纵杆对象可用于查询有关操纵杆的信息,以及获取任何按钮的状态和任何模拟操纵杆的位置。以下是我们将第一个操纵杆插入计算机的方法:
此代码使用一个名为“操纵杆”的变量,该变量将引用第一个操纵杆。它最初设置为 None,因为可能没有将操纵杆插入计算机。如果至少有一个插入(pygame .joystick.get_count()>0),将为第一个操纵杆 ID 创建一个操纵杆对象,该 ID 始终为 0。以这种方式工作时,我们必须小心,因为如果我们尝试在“无”时使用操纵杆,Python将引发异常。因此,在尝试使用操纵杆之前,如果操纵杆不是无,则应首先使用操纵杆来测试是否存在操纵杆。
操纵杆按钮
操纵杆有太多的按钮,很少有游戏可以全部使用它们。对于典型的游戏手柄,右侧有四个按钮,最常用作射击按钮,或用于执行游戏中最基本的操作,中间有一个或两个按钮用于选择,启动或暂停等操作。通常还有两个或四个肩部按钮,它们是位于游戏手柄边缘的细长按钮,下面是索引和食指自然放置的地方。我发现这些按钮适合
需要按住按钮的操作。例如,赛车游戏可能会使用肩部按钮进行加速和休息。肩部按钮在第一人称射击游戏中也可以很好地左右扫射(侧步)。一些垫子在垫子的底部还隐藏了一个额外的两个按钮,这可能有点难以访问,因此可能最适合不经常需要的操作。最后,通常有两个按钮位于模拟摇杆下方,因此您必须按下摇杆才能激活它们。这些可能最好用于激活用摇杆移动的东西,因为如果玩家按下另一个按钮,它会弹回中心。没有多少游戏使用这些摇杆按钮,因为很少有游戏玩家甚至意识到它们!
如果您没有操纵杆,您可能至少需要查看代码,但您不需要操纵杆来完成本章或本书的其余部分。
与其他输入设备一样,在访问游戏手柄时,您有两种选择:通过事件或直接查询游戏手柄的状态。当按下键盘上的按钮时,Pygame 会发出一个 JOYBUTTONDOWN 事件,其中包含操纵杆 ID 和按钮的索引(按钮的编号从 0 开始)。您可以从操纵杆对象的get_numbuttons成员函数中获取操纵杆上的按钮数。当一个按钮被释放时,Pygame会发出一个包含相同信息的相应JOYBUTTONDOWN事件。
让我们调整第 3 章中的事件脚本(清单 3-2),以查看生成的操纵杆事件。清单 6-5 与原始代码类似,但初始化了当前插入的所有操纵杆,并过滤掉了任何与操纵杆无关的事件。
当您运行清单 6-5 并按下操纵杆上的某些按钮时,每次按下按钮时,您都应该看到 JOYBUTTONDOWN 和相应的 JOYBUTTONUP(参见图 6-3)。如果您摆动模拟摇杆并按下方向键,您还将看到各种其他事件,我们将在下一节中介绍。
检测游戏手柄按钮的状态与按键和鼠标按钮略有不同。在操纵杆对象中使用get_button成员函数,而不是返回布尔值列表,该函数获取按钮的索引并返回其状态。尽管您可以随时找到操纵杆按钮的状态,但通常最好在每个帧开始时获取按钮状态的快照。这样,您可以确保在绘制屏幕时状态不会更改。下面介绍了如何获取按钮状态的布尔值列表: