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

news/2024/9/14 1:44:09/ 标签: python, 游戏, pygame, joystick, 游戏手柄编程

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

文章目录

    • 一、前言
    • 二、正式开始
    • 三、总结

一、前言

本文简单介绍一下pythonpygame.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),数量各不相同。

在这里插入图片描述

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

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

首先,初始化joystick模块。

python">pygame.joystick.init()

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

python">joystick_count = pygame.joystick.get_count()

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

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

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

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

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

代码运行效果:

在这里插入图片描述

完整代码如下:

python">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 += 5elif axes_left_right < -0.5:x -= 5if axes_up_down > 0.5:y += 5elif 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()
pygamejoystick_170">2.3 了解pygame.joystick模块常用方法和事件

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

python">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 查看游戏手柄连接的数据信息

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

python">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_heightdef reset(self):self.x = 10self.y = 10self.line_height = 30def indent(self):self.x += 10def unindent(self):self.x -= 10pygame.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、JOYHATMOTIONif 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或1for 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()

代码运行效果如下:

在这里插入图片描述

三、总结

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

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


http://www.ppmy.cn/news/1516418.html

相关文章

USB详解,配置及难点

一、USB发展历史 二、USB简介 USB有USB1.0/1.1/2.0/3.0多个版本&#xff0c;标准USB由4根线组成,VCC&#xff0c;GND&#xff0c;D&#xff0c;D-&#xff0c;其中D和D-是数据线&#xff0c;采用差分传输。在USB主机上,D-和D都是接了15K的电阻到地,所以在没有设备接入的时候,D、…

网络安全场景化解决方案编写教程(大纲)

目录 1.概述 1.1.项目背景 1.2.项目现状 1.3.项目目标 2.需求分析 3.方案设计 3.1设计依据 3.2设计原则 3.3架构设计 3.3产品设计 3.5服务设计 4.方案收益 5.项目预算 附录A&#xff08;案例&#xff09; 附录B&#xff08;公司资质人员资质等&#xff09; 1.概…

UnrealEngine学习(02):虚幻引擎编辑器界面详解

学习一款软件&#xff0c;我个人建议是先学习怎么用&#xff0c;然后是学习怎么用的好&#xff0c;再研究源码。 上一篇文章详细描述了我们该如何安装虚幻5引擎&#xff1a; UnrealEngine学习(01)&#xff1a;安装虚幻引擎https://blog.csdn.net/zuodingquan666/article/deta…

无人机+消防车:高楼灭火系统技术详解

“无人机消防车”高楼灭火系统技术是一种创新的消防解决方案&#xff0c;旨在解决高层建筑灭火难题。以下是对该技术的详细解析&#xff1a; 一、技术背景与需求 高层建筑数量多&#xff0c;火灾隐患多发。根据国家消防救援局发布的数据&#xff0c;高层建筑火灾频发&#xf…

Robot Operating System——兴趣区域信息

大纲 应用场景定义字段解释 案例 sensor_msgs::msg::RegionOfInterest 是 ROS (Robot Operating System) 中的一个消息类型&#xff0c;用于表示图像中的感兴趣区域 (Region of Interest, ROI)。它通常与图像处理和计算机视觉任务相关联&#xff0c;帮助系统聚焦于图像中的特定…

Java并发编程的核心概念--线程与进程

‌原子性‌&#xff1a;‌操作或多个操作要么全部执行且不被打断&#xff0c;‌要么都不执行。‌这保证了线程在执行操作时不会被其他线程干扰。‌‌可见性‌&#xff1a;‌当多个线程访问同一个变量时&#xff0c;‌一个线程修改了这个变量的值&#xff0c;‌其他线程能够立即…

【MySQL】MySQL表的增删改查(初阶)

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 目录 表内容操作 插入内容 按顺序插入 指定某些列插入 一次插入多行记录 插入时间 查询表内容 全列查询 指定列查询 指定表达式查询 用as取别名 ​编辑 去重查询 排序查询…

计算机毕业设计选题推荐-高校学术交流平台-Java/Python项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

基于微信小程序的行李寄存管理系统的设计与实现(论文+源码)_kaic

基于微信小程序的行李寄存管理系统的设计与实现(论文源码)_kaic 摘 要 人们外出旅行的时候&#xff0c;经常会需要到行李寄存的服务。行李寄存处在全国各地都很常见。现存的行李寄存方式很传统&#xff0c;适合小规模的行李寄存&#xff0c;当行李数量较多时&#xff0c;就…

JVM常见面试题总结

文章目录 1 JVM 组成1.1 JVM架构组成&#x1f525;1.2 JVM 内存结构/内存模型&#x1f525;1.3 堆和栈区别&#x1f525;1.4 详细的介绍 Java 堆&#x1f525;1.5 JVM 为什么使用元空间替换了永久代&#xff1f;&#x1f525;1.6 内存溢出与内存泄漏的区别&#x1f525;1.7 OOM…

根据数据库设计开发一套通用的电子商务平台

目录 案例 【题目】 【问题 1】(9 分) 【问题 2】(9 分) 【问题 3】(7 分) 【答案】 【问题 1】解析 【问题 2】解析 【问题 3】解析 相关推荐 案例 阅读以下关于数据库设计的叙述&#xff0c;在答题纸上回答问题 1 至问题 3。 【题目】 某制造企业为拓展网上销售业…

河南萌新联赛2024第(六)场:郑州大学(补题ABCDFGIL)

文章目录 河南萌新联赛2024第&#xff08;六&#xff09;场&#xff1a;郑州大学A 装备二选一&#xff08;一&#xff09;简单介绍&#xff1a;思路&#xff1a;代码&#xff1a; B 百变吗喽简单介绍&#xff1a;思路&#xff1a;代码&#xff1a; C 16进制世界简单介绍&#x…

es相关概念、索引操作(相当于mysql中的数据库操作)

文章目录 1、概念2、索引操作&#xff08;index&#xff09;2.1、查询索引&#xff08;数据库&#xff09;2.2、创建索引&#xff08;数据库&#xff09;2.3、查看单个索引&#xff08;数据库&#xff09;2.4、删除索引&#xff08;数据库&#xff09; 1、概念 RDBMSesMongoDB…

Manim实现目标的移动和出现速度控制

一&#xff0c;介绍 缓动函数 自定义参数随时间变化的速率。 现实生活中&#xff0c;物体并不是突然启动或者停止&#xff0c; 当然也不可能一直保持匀速移动。就像我们 打开抽屉的过程那样&#xff0c;刚开始拉的那一下动作很快&#xff0c; 但是当抽屉被拉出来之后我们会不自…

【操作系统】实验:进程死锁

目录 一、实验目的 二、实验要求 三、实验步骤 四、核心代码 五、记录与处理 六、思考 七、完整报告和成果文件提取链接 一、实验目的 1掌握死锁的基本概念&#xff1b; 2理解死锁的必要条件&#xff1b; 3理解避免死锁的方法、安全状态等重要概念&#xff1b; 4了解银…

Windows环境如何安装maven并配置IDEA

运行Springboot项目时&#xff0c;出现了依赖错误&#xff0c;最后排查可能是maven安装出错了。 MAVEN版本要和IDEA版本对应&#xff0c;maven发行版本不能比idea版本高&#xff0c;可以在idea查看内置的maven版本。 点击 File–>Settings,在设置页面搜索maven&#xff0c;如…

2024牛客暑期多校训练营7 D.Interval Selection(异或哈希+双指针)

原题链接&#xff1a;D.Interval Selection 题目大意&#xff1a; 给你一个长度为 n n n 的数组 a a a&#xff0c;定义一个区间 [ l , r ] [l,r] [l,r] 内的连续子数组为好的&#xff0c;当且仅当这个子数组内的所有元素 a l , a l 1 , . . . , a r a_{l},a_{l1},...,a_{…

虚幻5|暴击攻击和释放技能,造成伤害

玩家数据的Actor组件制作&#xff1a;虚幻5|制作玩家血量&#xff0c;体力-CSDN博客 造成伤害时&#xff0c;显示暴击及暴击字体颜色和未暴击的字体颜色&#xff0c;还有释放技能连击 一.编辑暴击数据 1.打开之前创建的玩家数据Actor组件 创建一个浮点变量&#xff0c;命名…

Python实现贪心算法

目录 贪心算法简介贪心算法的基本思想贪心算法的应用场景活动选择问题 Python实现活动选择问题代码解释活动选择问题的解贪心算法的正确性分析贪心算法的其他应用贪心算法的局限性贪心算法的优化与变种总结 贪心算法简介 贪心算法&#xff08;Greedy Algorithm&#xff09;是一…

10天速通Tkinter库——Day7:主菜单及图鉴

本篇博客我将介绍Tkinter实践项目《植物杂交实验室》中的杂交实验室主菜单、基础植物图鉴、杂交植物图鉴、杂交植物更多信息四个页面的制作。 它们作为主窗口的子页面实例&#xff0c;除了继承主窗口的基础设置&#xff08;如图标、标题、尺寸等等&#xff09;、还可以使用主窗…