本文收录于 《一起学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
根据指定的轴返回它的值,范围在-1到1之间。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游戏手柄模块的使用方法,并提供了一些简单的代码示例。希望对大家有帮助,谢谢。
如果您对文章中内容有疑问,欢迎在评论区进行留言,我会尽量抽时间给您回复。如果文章对您有帮助,欢迎点赞、收藏。您的点赞,是对我最大的支持和鼓励,谢谢 :-)