【Python游戏】Joystick游戏手柄编程介绍

本文收录于 《一起学Python趣味编程》专栏,从零基础开始,分享一些Python编程知识,欢迎关注,谢谢!

一、前言

本文简单介绍一下python中pygame.joystick游戏手柄模块的使用。

  • 什么是Python?

    Python是由荷兰人吉多·范罗苏姆于1990年代初设计的一门编程语言,应用领域非常广泛,尤其在数据分析、人工智能、游戏开发等领域,已经成为最受欢迎的程序设计语言之一,比较适合新手学习。

    Python语言标准库官方使用手册:https://docs.python.org/zh-cn/3/library/

  • 什么是Pygame?
    Pygame 是一个专门用来开发游戏的 Python 模块,是一个免费、开源的第三方软件包,主要为开发、设计 2D 电子游戏而生,比如扫雷、纸牌游戏、贪吃蛇、超级马里奥、飞机大战等等。
    Pygame官网地址:https://www.pygame.org/tags/all

  • 什么是Pygame.joystick?
    ‌pygame.joystick是Pygame库中的一个模块,专门用于与计算机上的游戏手柄、游戏杆等设备进行交互。它模块提供了一组函数和类,允许开发者访问和控制连接到计算机的游戏手柄和其他类似的输入设备。

    Pygame.joystick官方技术文档:https://pyga.me/docs/ref/joystick.html

二、正式开始

2.1 认识游戏手柄结构

‌如下图所示,这是一款普通的游戏手柄(XBox 360 Controller),是一种外接输入设备。大多数游戏手柄包含几个部分:轴(axis)、球(ball)、按钮(button)、帽子(hat),数量各不相同。

在这里插入图片描述

2.2 了解pygame.joystick模块简单使用步骤

使用pygame.joystick模块,可以执行以下操作:

首先,初始化joystick模块。

pygame.joystick.init()

之后,获取当前连接的游戏手柄数量。

joystick_count = pygame.joystick.get_count()

之后,创建Joystick对象,每个对象代表一个连接的游戏手柄或游戏杆。

if joystick_count > 0:
    joystick_0 = pygame.joystick.Joystick(0)
    joystick_0.init()

最后,监听和处理由游戏手柄生成的事件,如按钮按下、轴移动等。

if event.type == pygame.JOYBUTTONDOWN:
    # 获取控制器编号
    joystick_id = event.joy
    # 获取按钮0的值
    button = joystick_0.get_button(0)
    # 打印控制器编号和按钮值
    # print(f"Controller {joystick_id} - button: {button}")

下面是一个完整的示例代码,实现了使用游戏手柄上的游戏杆控制小红点的移动方向。

代码运行效果:

在这里插入图片描述

完整代码如下:

import pygame
import sys

"""
实现游戏手柄控制小红点移动的方向
@author 姑苏老陈
@date 2024-08-23
"""

# 初始化pygame
pygame.init()

# 设置屏幕大小
screen_width = 800
screen_height = 600
screen = pygame.display.set_mode((screen_width, screen_height))

# 设置角色的起始位置
x = 50
y = 50

# 游戏主循环标志
running = True

# 游戏杆的轴索引,使用第0个axis,控制左右;使用第1个axis,控制上下;
AXIS_LEFT_RIGHT = 0
AXIS_UP_DOWN = 1

# 游戏杆索引
JOYSTICK_ID = 0

# 获取玩家的游戏杆
joystick = pygame.joystick.Joystick(JOYSTICK_ID)
joystick.init()

# 游戏主循环
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    # 获取游戏杆的轴值,其值是从 -1.0 到 1.0,0 在中间。
    axes_left_right = joystick.get_axis(AXIS_LEFT_RIGHT)
    axes_up_down = joystick.get_axis(AXIS_UP_DOWN)

    # 根据轴值移动角色
    if axes_left_right > 0.5:
        x += 5
    elif axes_left_right < -0.5:
        x -= 5

    if axes_up_down > 0.5:
        y += 5
    elif axes_up_down < -0.5:
        y -= 5

    # 确保角色不会移出屏幕
    x = max(0, min(screen_width, x))
    y = max(0, min(screen_height, y))

    # 绘制背景
    screen.fill((255, 255, 255))

    # 绘制角色
    pygame.draw.circle(screen, (255, 0, 0), (x, y), 10)

    # 更新屏幕显示
    pygame.display.flip()

    # 限制游戏循环的速度
    pygame.time.delay(10)

# 结束pygame
pygame.quit()
sys.exit()

2.3 了解pygame.joystick模块常用方法和事件

pygame.joystick模块常用的方法如下:

get_count() -> count

返回连接的游戏手柄数量

Joystick(id) -> Joystick

游戏手柄对象。

Joystick.get_instance_id() -> int

返回游戏手柄的标识符

Joystick.get_power_level() -> str

返回游戏手柄的电量情况,可能的返回值有:empty, low, medium, full, wired, max, unknown(字符串)

Joystick.get_name() -> string

返回游戏手柄的系统名称

Joystick.get_numaxes() -> int

返回游戏手柄“轴”的数量

Joystick.get_axis(axis_number) -> float

根据指定的轴返回它的值,范围在-11之间。0表示轴位于中间。

Joystick.get_numballs() -> int

返回游戏手柄“球”的数量

Joystick.get_ball(ball_number) -> x, y

根据指定的球返回它的值,x, y表示球相对移动的位置。

Joystick.get_numbuttons() -> int

返回游戏手柄“按钮”的数量

Joystick.get_button(button) -> bool

根据指定的按钮返回它的值,表示是否按下按钮。

Joystick.get_numhats() -> int

返回游戏手柄“帽子”的数量

Joystick.get_hat(hat_number) -> x, y

根据指定的帽子返回它的值。(0,0)表示居中。-1表示左或下,1表示右或上,所以(- 1,0)表示左;(1,0)表示右;(0,1)表示向上;(1,1)表示右上角;等等。

游戏手柄支持的事件如下:

在这里插入图片描述

2.4 查看游戏手柄连接的数据信息

可以通过运行以下代码,查看当前连接的游戏手柄设备的数据信息。从而,熟悉如何访问和控制该游戏手柄。

import pygame

"""
用于输出Xbox游戏手柄操作数据到屏幕上
@author 姑苏老陈
@date 2024-08-23
"""

# 定义颜色
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)


# 文本打印类
class TextPrint:
    def __init__(self):
        self.reset()
        # self.font = pygame.font.Font(None, 20)
        self.font = pygame.font.SysFont('SimHei', 20)
        # 设置字体和颜色

    def print(self, screen, textString):
        textBitmap = self.font.render(textString, True, BLACK)
        screen.blit(textBitmap, [self.x, self.y])
        self.y += self.line_height

    def reset(self):
        self.x = 10
        self.y = 10
        self.line_height = 30

    def indent(self):
        self.x += 10

    def unindent(self):
        self.x -= 10


pygame.init()

# 设置屏幕宽度和高度
size = [800, 800]
screen = pygame.display.set_mode(size)

pygame.display.set_caption("当前连接的手柄joystick数据显示")

# 保持循环直到用户点击关闭按钮
done = False

# 被用来管理屏幕更新的速度
clock = pygame.time.Clock()

# 初始化joystick
pygame.joystick.init()

# 准备好打印
textPrint = TextPrint()


while done == False:
    # 事件处理
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True

        # joystick事件类型包括: JOYAXISMOTION、JOYBALLMOTION、JOYBUTTONDOWN、JOYBUTTONUP、JOYHATMOTION
        if event.type == pygame.JOYBUTTONDOWN:
            print("Joystick button pressed.")
        if event.type == pygame.JOYBUTTONUP:
            print("Joystick button released.")
        if event.type == pygame.JOYHATMOTION:
            # 获取控制器编号
            joystick_id = event.joy
            # 获取方向盘的状态
            hat_direction = event.value
            # 打印控制器编号和方向
            print(f"Joystick pressed, Controller {joystick_id} - Hat direction: {hat_direction}")
        if event.type == pygame.JOYAXISMOTION:
            # 获取游戏杆的轴值
            print("Joystick axis moved.")

    # 绘制的步骤
    # 首先,用白色清除屏幕
    screen.fill(WHITE)
    textPrint.reset()

    # 得到joystick的数量
    joystick_count = pygame.joystick.get_count()
    textPrint.print(screen, "【***************当前连接的游戏手柄信息显示*****************】")
    textPrint.print(screen, "【手柄数量】Number of joysticks: {}".format(joystick_count))
    # textPrint.indent()

    # 在每个joystick中:
    for i in range(joystick_count):
        joystick = pygame.joystick.Joystick(i)
        joystick.init()

        textPrint.print(screen, "【手柄索引值】Joystick {}".format(i))
        # textPrint.indent()

        # 从操作系统中获取控制器/joystick的名称
        name = joystick.get_name()
        textPrint.print(screen, "【手柄名称】Joystick name: {}".format(name))
        # textPrint.indent()

        # 获得控制轴axes数量
        axes = joystick.get_numaxes()
        textPrint.print(screen, "【控制轴数据】Number of axes: {}".format(axes))
        textPrint.indent()

        # 获得控制轴axes坐标值,例如0.3,其值是从 -1.0 到 1.0之间,若0则表示在中间。
        for i in range(axes):
            axis = joystick.get_axis(i)
            textPrint.print(screen, "Axis {} value: {:>6.3f}".format(i, axis))
        textPrint.unindent()

        # 获取按钮数量
        buttons = joystick.get_numbuttons()
        textPrint.print(screen, "【按钮数据】Number of buttons: {}".format(buttons))
        textPrint.indent()

        # 获取按钮值,例如0或1
        for i in range(buttons):
            button = joystick.get_button(i)
            textPrint.print(screen, "Button {:>2} value: {}".format(i, button))
        textPrint.unindent()

        # 获取帽子(十字架方向键)数量
        # 值在数组中返回
        hats = joystick.get_numhats()
        textPrint.print(screen, "【帽子数据】Number of hats: {}".format(hats))
        textPrint.indent()

        # 获取帽子值,该值是一对元组值,例如:(0,1)
        for i in range(hats):
            hat = joystick.get_hat(i)
            textPrint.print(screen, "Hat {} value: {}".format(i, str(hat)))
        textPrint.unindent()

        textPrint.unindent()

    # 更新屏幕
    pygame.display.flip()

    # 限制每秒20帧
    clock.tick(20)

# 关闭窗口并退出.
pygame.quit()

代码运行效果如下:

在这里插入图片描述

三、总结

以上介绍了python中pygame.joystick游戏手柄模块的使用方法,并提供了一些简单的代码示例。希望对大家有帮助,谢谢。

如果您对文章中内容有疑问,欢迎在评论区进行留言,我会尽量抽时间给您回复。如果文章对您有帮助,欢迎点赞、收藏。您的点赞,是对我最大的支持和鼓励,谢谢 :-)

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

姑苏老陈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值