pygame学习(三)——支持多种类型的事件

news2025/6/9 19:14:25

大家好!我是码银🥰

欢迎关注🥰:

CSDN:码银

公众号:码银学编程

实时事件循环

为了保证程序的持续刷新、保持打开的状态,我们会创建一个无限循环,通常使用的是while语句,while True:只要while条件保持为真,while语句块中的代码就会重复地执行。

在游戏或图形应用程序中,事件处理是非常关键的。用户可能会进行各种操作,如点击、按键、移动鼠标等,这些都需要被捕获并相应地处理。为了获取这些事件并进行处理,我们会使用这个语句:pygame.event.get()。

pygame.event.get()这段代码将会创建当前等待处理的事件的一个列表,我们使用一个for循环来遍历该列表:for event in pygame.event.get():

while True:
    for event in pygame.event.get():

下面就可以把各个事件“塞”到这个循环里面了:

QUIT事件

 程序必须响应的最常见的事件是QUIT, 当用户关闭窗口的时候会发生该事件(我相信没有人不会用到关闭窗口的“X”吧😆)。

 正确的代码如下:

    for event in pygame.event.get():
        if event.type == QUIT:
            sys.exit()

也可以这么写:

while True:
    for event in pygame.event.get():
        if event.type in (QUIT,KEYDOWN):
            sys.exit()

 sys.exit()是python的退出程序,以达到关闭窗口的作用。

在我刚学习这个部分的时候,我就在想凭什么点了x后就一定要关闭程序呢?

看一下:

import pygame #导包
from pygame.locals import*
import sys

screen_width=500
screen_height=400
pygame.init()

screen = pygame.display.set_mode(size=(screen_width,screen_height),flags=0)
while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            print("1")

我每按一次“叉叉”就会输出一个“1”,关不了根本关闭不了,要是游戏这么写,想结束这个游戏可费老劲了😂,所以一定要注意书写代码的正确性哦❤️‍🔥

当然 “print("1")” 也可以换成其他的代码,比如是一个打开另一个窗口的代码(询问一下“您是否要关闭本窗口?”)。

键盘事件

KEYUP:当用户释放键盘上的任意键时,会触发此事件(只要你不松手,你就是安全的😎)。

KEYDOWN :当用户按下键盘上的任意键时,会触发此事件(碰上了,契约就达成了,该松手松手吧🤭)。

这里也是一个退出程序,不过多加了一个“ESCAPE”键,也能触发关闭窗口结束程序的效果。 

    for event in pygame.event.get():
        if event.type == QUIT:
            sys.exit()
        elif event.type == KEYUP:
            if event.key == pygame.K_ESCAPE:
                sys.exit()

再比如,下面这段代码 使用了“ESC”、“1”、“2”、“3”、“4”、“Enter”键。

while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            sys.exit()
        elif event.type == KEYUP:
            if event.key == pygame.K_ESCAPE:
                sys.exit()
            elif event.key == pygame.K_1:
                trivia.handle_input(1)
            elif event.key == pygame.K_2:
                trivia.handle_input(2)
            elif event.key == pygame.K_3:
                trivia.handle_input(3)
            elif event.key == pygame.K_4:
                trivia.handle_input(4)
            elif event.key == pygame.K_RETURN:
                trivia.next_question()

鼠标事件

MOUSEMOTION:当用户移动鼠标时,会触发此事件。

MOUSEMOTION事件的相关属性及其含义:

  • event.pos:返回鼠标的当前位置,是一个包含两个元素的元组,表示鼠标在窗口中的x和y坐标,相对于窗口左上角的距离。
  • event.rel:返回鼠标的相对移动距离,也是一个包含两个元素的元组,表示鼠标在x和y方向上的移动距离,相对于上一次事件的位置。
  • event.buttons:返回一个三元组,表示当前鼠标按钮的状态。每个元素的值是0或1,表示对应按钮是否被按下。对于左键、中键和右键,分别对应于三元组中的第1、2和3个元素。如果某个按钮被按下,则对应位置的值为1,否则为0。

下面是示例代码:

import pygame #导包
from pygame.locals import*
import sys

screen_width=500
screen_height=400
pygame.init()

screen = pygame.display.set_mode(size=(screen_width,screen_height),flags=0)
while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            sys.exit()
        elif event.type == pygame.MOUSEMOTION:  # 检查鼠标移动事件
            x, y = event.pos  # 获取鼠标位置
            print(f"鼠标位置:({x}, {y})")
    pygame.display.update()

MOUSEBUTTONDOWN:当用户按下鼠标按钮时,会触发此事件。

MOUSEBUTTONUP:当用户释放鼠标按钮时,会触发此事件。

小结

Pygame支持多种类型的事件,包括鼠标移动、鼠标按键按下和释放、键盘按键按下和释放、游戏退出等。这些事件可以用于控制游戏的行为和响应用户的输入。以下是一些pygame支持的主要事件:

  1. QUIT:当用户关闭pygame窗口时,会触发此事件。
  2. ACTIVEEVENT:当窗口从最小化状态恢复或变为活动窗口时,会触发此事件。
  3. KEYDOWN:当用户按下键盘上的任意键时,会触发此事件。
  4. KEYUP:当用户释放键盘上的任意键时,会触发此事件。
  5. MOUSEMOTION:当用户移动鼠标时,会触发此事件。
  6. MOUSEBUTTONDOWN:当用户按下鼠标按钮时,会触发此事件。
  7. MOUSEBUTTONUP:当用户释放鼠标按钮时,会触发此事件。
  8. JOYAXISMOTION:当游戏控制器上的轴移动时,会触发此事件。
  9. JOYBALLMOTION:当游戏控制器上的球体移动时,会触发此事件。
  10. JOYHATMOTION:当游戏控制器上的操纵杆移动时,会触发此事件。

这些事件可以用于各种游戏逻辑,例如响应按键输入、处理游戏状态、控制动画等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1392107.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第二百六十九回

文章目录 概念介绍设置方法示例代码内容总结 我们在上一章回中介绍了Card Widget相关的内容,本章回中将介绍国际化设置.闲话休提,让我们一起Talk Flutter吧。 概念介绍 我们在这里说的国际化设置是指在App设置相关操作,这样可以让不同国家的…

关于VScode的这个ssh的配置的经验

1.首先,我是因为重装了ubantu系统,不得不重新配置ssh 2.第一步,在本机的终端安装ssh插件: (1) (2)restart开启这个ssh端口 3.然后,就在vscode里面,安装哪个…

【Rust学习】安装Rust环境

本笔记为了记录学习Rust过程,内容如有错误请大佬指教 使用IDE:vs code 参考教程:菜鸟教程链接: 菜鸟教程链接: Rust学习 Rust入门安装Rust编译环境Rust 编译工具 构建Rust 工程目录 Rust入门 安装Rust编译环境 因为我已经安装过VSCode了&am…

【ArcGIS遇上Python】ArcGIS Python批量筛选多个shp中指定字段值的图斑(以土地利用数据为例)

文章目录 一、案例分析二、提取效果二、代码运行效果三、Python代码四、数据及代码下载一、案例分析 以土地利用数据为例,提取多个shp数据中的旱地。 二、提取效果 原始土地利用数据: 属性表: 提取的旱地:(以图层名称+地类名称命名)

mysql — 生产环境发布DDL之避坑操作onlineDDL

一、Mysql onLineDDL特性 1、Mysql 5.6 DDL MySQL 的 DDL(Data Definition Language) 包括增减字段、增减索引等操作。MySQL Online DDL 功能从 5.6 版本开始正式引入,发展到现在的 8.0 版本,那么在 MySQL 5.6 之前,MySQL 的 DDL 操作会按照…

Vue高级(二)

3.搭建vuex环境 创建文件:src/store/index.js //引入Vue核心库import Vue from vue//引入Vueximport Vuex from vuex//应用Vuex插件Vue.use(Vuex)//准备actions对象——响应组件中用户的动作const actions {}//准备mutations对象——修改state中的数据const mutat…

近4w字吐血整理!只要你认真看完【C++编程核心知识】分分钟吊打面试官(包含:内存、函数、引用、类与对象、文件操作)

🌈个人主页:godspeed_lucip 🔥 系列专栏:C从基础到进阶 🏆🏆关注博主,随时获取更多关于C的优质内容!🏆🏆 C核心编程🌏1 内存分区模型&#x1f384…

mac查看maven版本报错:The JAVA_HOME environment variable is not defined correctly

终端输入mvn -version报错: The JAVA_HOME environment variable is not defined correctly, this environment variable is needed to run this program. Java环境变量的问题,打开bash_profile查看 open ~/.bash_profile export JAVA_8_HOME/Library/Java/JavaVirtualMachine…

HCIA——12题目-1章选择

学习目标: 计算机网络 1.掌握计算机网络的基本概念、基本原理和基本方法。 2.掌握计算机网络的体系结构和典型网络协议,了解典型网络设备的组成和特点,理解典型网络设备的工作原理。 3.能够运用计算机网络的基本概念、基本原理和基本方法进行…

GaussDB(DWS)查询优化技术大揭秘

GaussDB(DWS)查询优化技术大揭秘 大数据时代,数据量呈爆发式增长,经常面临百亿、千亿数据查询场景,当数据仓库数据量较大、SQL语句执行效率低时,数据仓库性能会受到影响。本文将深入讲解在GaussDB(DWS)中如何进行表结构设计&#…

解密IP代理池:匿名访问与反爬虫的利器

当今互联网环境中,为了应对反爬虫、匿名访问或绕过某些地域限制等需求,IP代理池成为了一种常用的解决方案。IP代理池是一个包含多个可用代理IP地址的集合,可以通过该代理池随机选择可用IP地址来进行网络请求。 IP代理池是一组可用的代理IP地址…

实验八 排序算法的实现与分析

实验八 排序算法的实现与分析 一.实验目的 1.掌握常用的排序方法,并掌握用高级语言实现排序算法的方法; 2.深刻理解排序的定义和各种排序方法的特点,并能加以灵活应用; 3.了解各种方法的排序过程及其时间复杂度的分析方…

10- OpenCV:基本阈值操作(Threshold)

目录 1、图像阈值 2、阈值类型 3、代码演示 1、图像阈值 (1)图像阈值(threshold)含义:是将图像中的像素值划分为不同类别的一种处理方法。通过设定一个特定的阈值,将像素值与阈值进行比较,根…

单片机I/O口驱动MOS管

自记录: 看完本章,串起来看,看mos驱动电路这篇:MOS管驱动电流计算以及分立器件驱动电路-CSDN博客 使用单片机做一个PLC,输出可如下两种情况: 单片机I/O口驱动,为什么一般都选用三极管而不是MOS管&#xf…

【RTOS】快速体验FreeRTOS所有常用API(1)工程创建

目录 一、工程创建1.1 新建工程1.2 配置RCC1.3 配置SYS1.4 配置外设1)配置 LED PC132)配置 串口 UART13)配置 OLED I2C1 1.5 配置FreeRTOS1.6 工程设置1.7 生成代码1.8 keil设置下载&复位1.9 添加用户代码 快速体验FreeRTOS所有常用API&a…

第36期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区,集成了生成预训练Transformer(GPT)、人工智能生成内容(AIGC)以及大型语言模型(LLM)等安全领域应用的知识。在这里,您可以…

什么是用户态和内核态?用户态和内核态是如何切换的?

一、什么是用户态和内核态? 1.1、概述 用户态和内核态是操作系统的两种运行状态。 内核态:处于内核态的 CPU 可以访问任意的数据,包括外围设备,比如网卡、硬盘等,处于内核态的 CPU 可以从一个程序切换到另外一个程序…

QGroundControl Qt安卓环境搭建及编译出现的问题

记录Qt 5.15.2搭建安卓环境出现的各种问题。 zipalign tool not found: D:/JavaAndroid/Android/sdk/build-tools//zipalign.exe? 答:需要将DANDROID_PLATFORM升级到已下载的版本. bin/llvm-readobj.exe: error: unknown argument ‘–libs’ 答&…

ES搜索的安装以及常用的增删改查操作(已经写好json文件,可以直接使用)

1.es的下载 https://www.elastic.co/cn/downloads/past-releases 2.elasticsearch安装及配置,遇到9200访问不了以及中文乱码,能访问了却要账户密码等问题 Elasticsearch启动后访问9200失败_http://localhost:9200无返回值-CSDN博客 3.开启es服务&#x…

JS-var 、let 、 const使用介绍

变量声明介绍 在我们日常开发用,变量声明有三个 var、 let 和 const,我们应该用那个呢? 首先var 先排除,老派写法,问题很多,可以淘汰掉…let or const ?建议: const 优先,尽量使…