当前位置: 首页 > news >正文

《Python游戏编程入门》注-第4章2

《Python游戏编程入门》的“4.2.2 键盘事件”中介绍了通过键盘事件来监听键盘按键的方法。

1 键盘事件

玩家点击键盘中某个按键实际上包含了两个动作:点击按键和释放按键,也就是按键按下和松开。按键按下的对应的事件是KEYDOWN,按键松开对应的事件是KEYUP。监听键盘按键,对这两个事件中的一个进行监听即可。

当玩家点击了键盘上的某个按键后,KEYDOWN和KEYUP事件就会被系统加入到事件队列中;接下来游戏程序从系统的事件队列中取出事件,如果是KEYDOWN和KEYUP事件,则继续判断玩家点击了键盘中的哪个按键,最后游戏程序对不同的按键进行不同的处理,流程如图1所示。

图1 监听键盘按键的流程

2 监听按键的代码实现

2.1 判断按键是否被按下

当从事件队列中获取到KEYDOWN或KEYUP事件,则说明按键被按下,代码如图2所示。

图2 判断按键是否被按下的代码

其中,第15行代码中的elif对事件类型event.type进行判断,如果是KEYDOWN,则说明此时有按键被按下。

注意1 KEYDOWN在pygame.locals中定义。

注意2 也可以监听KEYUP事件。

2.2 判断哪个按键被按下

当监听到玩家按下了按键后,接下来就要判断玩家按下了哪个按键,可以通过两种方法进行判断。

2.2.1 通过按键ID进行判断

通过按键ID进行判断的代码如图3所示。

图3 通过按键ID进行判断的代码

从图3中可以看出,event.key表示按键ID,通过if...elif对event.key的值进行判断,不同取值表示玩家按下了不同的按键,则进行不同的处理。

相关链接1 K_ESCAPE对应Esc按键;K_0~K_9分别对应0-9按键;K_a~K_z分别对应a~z按键;KEY_UP、KEY_DOWN、KEY_LEFT和KEY_RIGHT分别对应上下左右按键。

2.2.2 通过按键名进行判断

通过按键名进行判断的代码如图4所示。

图4 通过按键名进行判断的代码

其中,第16行代码通过pygame.key.name()函数获取到了按键ID对应的按键名,该按键名是字符串类型,保存在变量key_name中;接下来的17-25行代码对按键名key_name进行判断,不同的按键名进行不同的处理。

2.3 按键长按与短按的处理

在某些游戏中,会将长按按键和短按按键设置为不同的功能。可以通过如图5所示的代码进行设置,使得pygame能够重复地响应一个持续被按下的键。

图5 设置pygame能够重复地响应持续按下的键

该函数的参数是一个以毫秒为单位的值,表示第一个KEYDOWN事件在等待10毫秒后,被送到事件队列中。

相关链接2 pygame.key.set_repeat()函数还可以包含第二个参数,第二个参数也是一个以毫秒为单位的值,表示之后的KEYDOWN事件被送到事件队列中的间隔时间。

相关文章:

《Python游戏编程入门》注-第4章2

《Python游戏编程入门》的“4.2.2 键盘事件”中介绍了通过键盘事件来监听键盘按键的方法。 1 键盘事件 玩家点击键盘中某个按键实际上包含了两个动作:点击按键和释放按键,也就是按键按下和松开。按键按下的对应的事件是KEYDOWN,按键松开对应…...

deque

deque 底层数据结构 动态开辟的二维数组第一维数组中存放的是第二维数组的指针每个第二维数组大小为512字节。假如存放的是**_Tp类型,每个第二维数组存放512/(sizeof(_Tp**))个元素按照第一维数组大小二倍进行扩容 举例 当deque进行push_back,将下半部分空间元素…...

YOLOv11改进策略【卷积层】| CVPR-2020 Strip Pooling 空间池化模块 处理不规则形状的对象 含二次创新

一、本文介绍 本文记录的是利用Strip Pooling模块优化YOLOv11的目标检测网络模型。Strip Pooling结合了长而窄的卷积核形状在一个空间维度上的长程关系捕捉能力和在另一个空间维度上的局部细节捕捉能力,有效地处理复杂的场景信息。这一机制通过采用 1 N 1N 1N或 N 1 N1 N1的…...

yt-dlp下载视频

插件官方下载地址 通过以下命令行使用 yt-dlp下载 (base) D:\tool\video>cd D:\tool\video (base) PS D:\tool\video> .\vdownlod.bat 此处输入链接或者(base) D:\tool\video>yt-dlp -f bv[extmp4]ba[extm4a] --cookies d:\Downloads\www.youtube.com_cookies.txt -…...

oracle insert忽略主键冲突,忽略重复记录

在INSERT语句中使用IGNORE_ROW_ON_DUPKEY_INDEX提示: INSERT /* IGNORE_ROW_ON_DUPKEY_INDEX(table_name, index_name) */ INTO table_name(column1, column2) VALUES(value1, value2); 或 INSERT /* IGNORE_ROW_ON_DUPKEY_INDEX(table_name(column_name)) */ …...

小新学习k8s第四天之发布管理

一、金丝雀发布(灰度发布) Deployment控制器支持自定义控制更新过程中的滚动节奏,如“暂停(pause)”或“继续(resume)”更新操作。 ①比如等待第一批新的Pod资源创建完成后立即暂停更新过程,此时,仅存在一部分新版本的…...

01_IAR新建CC2530工程

IAR建立CC2530工程 前言 ​ 由于很多Zigbee商家提供的教程未有从零建立CC2530工程的讲解,可能会导致后面的开发中出现一些琐碎的问题。本文将以LED流水灯为例,从0到1用IAR建立CC2530工程。 IAR介绍 ​ IAR Embedded Workbench被广泛应用于消费电子、…...

原生鸿蒙的竞争力到底如何?

目录 1. 崛起与挑战2. 安全机制3. 自动化检测前移4. 深入探讨开发者服务优势 1. 崛起与挑战 长期以来,移动操作系统市场被IOS和安卓所垄断,一直都难以推出完整的自主系统,面临诸多挑战,如推广困难、应用适配难度大,以及…...

数字化生态平台:关键功能全解析

​在当今数字化浪潮中,数字化生态平台正发挥着举足轻重的作用。那么,它的关键功能究竟有哪些呢?让我们一探究竟。 首先,数据集成与管理是数字化生态平台的重要功能之一。它能够从多个来源收集数据,包括企业内部系统、外…...

c 到 c++ 过渡

c基础入门 #include <iostream> #include <cmath> #include <unistd.h> // 总结&#xff1a;按照书写依次往下&#xff0c;先看 iostream 再看 cxxx 最后 xxx.husing namespace std; // 本质&#xff1a;自定义作用域&#xff0c;作用域就在该命名空间内部。…...

[linux驱动开发--环境搭建] qemu-9.1+linux-kernel-6.11

本文档模拟vexpress-a9开发板&#xff0c;作为铁头娃&#xff0c;要学就学最新的包 已经上传到github仓库 目录 编译qemu-9.1编译linux-kernel-6.11编译busybox-1.36.1NFS挂载 1. qemu-stable-9.1源码编译安装 1.1. 下载qemu源码的stable-9.1分支 仓库地址 mkdir qemu_9.…...

019集——获取CAD图中多个实体的包围盒(CAD—C#二次开发入门)

如下图所示&#xff0c;获取多个实体的最大包围盒&#xff0c;用红色线表示&#xff1a; 也可单独选圆的包围盒 部分代码如下&#xff1a; using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.Geometry; using A…...

【Clickhouse 探秘】Clikchouse 有哪些表引擎?你都知道哪些?

&#x1f449;博主介绍&#xff1a; 博主从事应用安全和大数据领域&#xff0c;有8年研发经验&#xff0c;5年面试官经验&#xff0c;Java技术专家&#xff0c;WEB架构师&#xff0c;阿里云专家博主&#xff0c;华为云云享专家&#xff0c;51CTO 专家博主 ⛪️ 个人社区&#x…...

你好,C++并发世界

C并发编程的主要目的是任务隔离和提高性能 是的&#xff0c;C并发编程的主要目的是任务隔离和提高性能。具体来说&#xff0c;可以总结为以下几点&#xff1a; 任务隔离&#xff1a;通过并发编程&#xff0c;程序可以将不同的任务或计算分隔开&#xff0c;这样可以防止它们之间…...

windows10 安装 达梦数据库DM8

一. 前期工作 下载 https://www.dameng.com/list_103.html 通过百度网盘分享的文件&#xff1a;达梦数据库 链接&#xff1a;https://pan.baidu.com/s/1mJcT3UiwojeWIhXpAwh-RA 提取码&#xff1a;jyzi 点我: 想要 解压 双击iso文件 二. 安装步骤 1 .双击setup.ext安装 …...

ntp交叉编译 ntpdate时间同步

NTP(Network Time Protocol,网络时间协议)是一种用于在计算机系统之间同步时钟的协议,广泛覆盖网络环境中,确保网络设备和计算机上的时间保持一致。NTP 是基于 UDP 协议工作在123号端口上,能够在不同的网络条件下达到数千级别的精度同步时间。 实现windows上位机作为ntp服…...

微服务实战系列之玩转Docker(十六)

导览 前言Q&#xff1a;基于容器云如何实现高可用的配置中心一、etcd入门1. 简介2. 特点 二、etcd实践1. 安装etcd镜像2. 创建etcd集群2.1 etcd-node12.2 etcd-node22.3 etcd-node3 3. 启动etcd集群 结语系列回顾 前言 Docker&#xff0c;一个宠儿&#xff0c;一个云原生领域的…...

Solana 代币 2022 — Transfer Hook

从零到英雄的 Solana 代币 2022 — Transfer Hook Token 2022 计划引入了几项令人兴奋的扩展&#xff0c;增强了铸造和代币账户的功能。在这些功能中&#xff0c;我个人最喜欢的是Transfer Hook &#xff08;转账钩子&#xff09; 。 想象时间 让我们戴上想象的帽子&#xf…...

网络爬虫中的反爬虫技术:突破限制,获取数据

&#xff0c;网络爬虫已成为获取大量网络数据的重要工具。然而&#xff0c;随着爬虫技术的发展&#xff0c;许多网站也开始采用各种反爬虫措施来保护自己的数据。作为爬虫开发者&#xff0c;我们需要不断更新我们的技术&#xff0c;以应对这些反爬虫措施。本文将详细介绍一些常…...

【ROS2】cv_bridge:ROS图像消息和OpenCV的cv::Mat格式转换库

1、简述 cv_bridge可以实现ROS图像消息(sensor_msgs::msg::Image)和OpenCV的cv::Mat格式的转换。 cv_bridge支持各种常见的图像编码格式,包括JPEG、PNG、BMP等。 2、互转 1)cv::Mat转sensor_msgs::Image cv::Mat image; sensor_msgs::ImagePtr pMsg = cv_bridge::CvIma…...

LeetCode--25.k个一组翻转链表

解题思路&#xff1a; 1.获取信息&#xff1a; &#xff08;1&#xff09;给定一个链表&#xff0c;每k个结点一组进行翻转 &#xff08;2&#xff09;余下不足k个结点&#xff0c;则不进行交换 2.分析题目&#xff1a; 其实就是24题的变题&#xff0c;24题是两两一组进行交换&…...

AU音频软件|Audition 2025网盘下载与安装教程指南

说起AU&#xff0c;有些小伙伴可能第一印象是化学元素金&#xff08;Aurum&#xff09;。实际上&#xff0c;本文要介绍的AU&#xff0c;全称是Adobe Audition&#xff0c;是一款专业音频编辑和混音软件‌&#xff0c;广泛应用于音乐制作、广播、电影及视频声音设计等领域。 目…...

面壁智能推出 MiniCPM 4.0 端侧大模型,引领端侧智能新变革

在 2025 智源大会期间&#xff0c;面壁智能重磅发布了开源模型 MiniCPM 4.0 的两个新版本&#xff08;0.5B、8B&#xff09;&#xff0c;代号「前进四」。此次发布在人工智能领域引发了广泛关注&#xff0c;标志着端侧大模型技术取得了重大突破。 卓越性能&#xff0c;树立行业…...

C++11 Token Bucket (令牌桶)算法的锁无实现及应用

Token Bucket&#xff08;令牌桶&#xff09;算法是一种在流量控制和资源分配领域被广泛应用的技术。它通过约束数据传输速率或任务执行频率&#xff0c;确保系统在资源有限的情况下&#xff0c;能够稳定、高效地运行&#xff0c;避免因突发流量或任务积压而导致的性能下降甚至…...

机器学习基础相关问题

机器学习相关的基础问题 K-means是否一定会收敛 K-means是否一定会收敛 K-means算法在有限步数内一定会收敛&#xff0c;但收敛到的可能是局部最优解而非全局最优解。以下是详细分析&#xff1a; K-means 的优化目标是最小化 样本到其所归属簇中心的距离平方和&#xff08;SSE…...

redis分片集群架构

主从集群解决高并发&#xff0c;哨兵解决高可用问题。但是任然有两个问题没有解决&#xff1a;1海量数据存储问题&#xff1b;2高并发写的问题&#xff08;如果服务中有大量写的请求&#xff09; 那就可以采用分片集群架构解决这些问题 分片集群特征 分片集群中有多个master…...

【CATIA的二次开发22】关于抽象对象Document概念详细总结

在CATIA VBA开发中,Document对象是最核心、最基础的对象之一。它代表了当前在CATIA会话中打开的一个文档(文件)。 几乎所有与文件操作、模型访问相关的操作都始于获取一个Document对象。 一、Document对象概述 1、获取Document对象: 当前活动文档: 最常见的方式是获取用户…...

快速上手shell脚本运行流程控制

一、条件运行流程控制 1.if单分支结构 #!/bin/bash if [ 条件 ] then动作1动作2... fi 2.if双分支结构 ​ #!/bin/bash if [ 条件 ] then动作1动作2... else动作1动作2... fi​ 3.if多分支结构 二、循环运行流程控制 1.无判定for循环 给网卡一键添加5个IP 2.判断循环 while…...

Android实现点击Notification通知栏,跳转指定activity页面

效果 1、点击通知栏通知&#xff0c;假如app正在运行&#xff0c;则直接跳转到指定activity显示具体内容&#xff0c;在指定activity中按返回键返回其上一级页面。 2、点击通知栏通知&#xff0c;假如app已经退出&#xff0c;先从SplashActivity进入&#xff0c;显示app启动界…...

Ubuntu 下开机自动执行命令的方法

Ubuntu 下开机自动执行命令的方法&#xff08;使用 crontab&#xff09; 在日常使用 Ubuntu 或其他 Linux 系统时&#xff0c;我们常常需要让某些程序或脚本在系统启动后自动运行。例如&#xff1a;启动 Clash 代理、初始化服务、定时同步数据等。 本文将介绍一种简单且常用的…...