【Python】【进阶篇】八、Pygame的Event事件模块

您所在的位置:网站首页 pygame空格对应的键盘事件 【Python】【进阶篇】八、Pygame的Event事件模块

【Python】【进阶篇】八、Pygame的Event事件模块

2023-12-13 00:40| 来源: 网络整理| 查看: 265

目录 八、Pygame的Event事件模块8.1 事件类型8.2 事件处理方法8.3 处理键盘事件8.4 处理鼠标事件

八、Pygame的Event事件模块

事件(Event)是 Pygame 的重要模块之一,它是构建整个游戏程序的核心,比如常用的鼠标点击、键盘敲击、游戏窗口移动、调整窗口大小、触发特定的情节、退出游戏等,这些都可以看做是“事件”。

8.1 事件类型

Pygame 定义了一个专门用来处理事件的结构,即事件队列,该结构遵循遵循队列“先到先处理”的基本原则,通过事件队列,我们可以有序的、逐一的处理用户的操作(触发事件)。下述表格列出了 Pygame 中常用的游戏事件:

名称说明QUIT用户按下窗口的关闭按钮ATIVEEVENTPygame被激活或者隐藏KEYDOWN键盘按下KEYUP键盘放开MOUSEMOTION鼠标移动MOUSEBUTTONDOWN鼠标按下MOUSEBUTTONUP鼠标放开JOYAXISMOTION游戏手柄(Joystick or pad) 移动JOYBALLMOTION 游戏球(Joy ball) 移动JOYHATMOTION游戏手柄(Joystick) 移动JOYBUTTONDOWN游戏手柄按下JOYBUTTONUP游戏手柄放开VIDEORESIZEPygame窗口缩放VIDEOEXPOSEPygame窗口部分公开(expose)USEREVENT触发一个用户事件

注意,当使用 Pygame 做游戏开发时,上述事件并非都会应用的到,因此在学习的过程中,我们要懂得触类旁通、举一反三。

8.2 事件处理方法 名称说明pygame.event.get()从事件队列中获取一个事件,并从队列中删除该事件pygame.event.wait() 阻塞直至事件发生才会继续执行,若没有事件发生将一直处于阻塞状态pygame.event.set_blocked() 控制哪些事件禁止进入队列,如果参数值为None,则表示禁止所有事件进入pygame.event.set_allowed()  控制哪些事件允许进入队列pygame.event.pump() 调用该方法后,Pygame 会自动处理事件队列pygame.event.poll() 会根据实际情形返回一个真实的事件,或者一个Nonepygame.event.peek()  检测某类型事件是否在队列中pygame.event.clear()从队列中清除所有的事件pygame.event.get_blocked() 检测某一类型的事件是否被禁止进入队列pygame.event.post()  放置一个新的事件到队列中pygame.event.Event()  创建一个用户自定义的新事件

当我们使用 Pygame 处理事件时,逻辑一般都是相似的。首先是判断事件的类型,然后根据不同的事件操作,执行不同的游戏操作。因此这种情况非常适合使用 if … else 语句。如下所示:

import pygame while True: # 等待事件发生 event = pygame.event.wait() if event.type == pygame.QUIT: exit() if event.type == pygame.MOUSEBUTTONDOWN: print('鼠标按下', event.pos) if event.type == pygame.MOUSEBUTTONUP: print('鼠标弹起') if event.type == pygame.MOUSEMOTION: print('鼠标移动') # 键盘事件 if event.type == pygame.KEYDOWN: # 打印按键的英文字符 print('键盘按下', chr(event.key)) if event.type == pygame.KEYUP: print('键盘弹起') 8.3 处理键盘事件

键盘事件提供了一个 key 属性,通过该属性可以获取键盘的按键。Pygame 将键盘上的字母键、数字键、组合键等按键以常量的方式进行了定义,下表列出了部分常用按键的常量:

名称说明K_BACKSPACE退格键(Backspace)K_TAB制表键(Tab)K_CLEAR清除键(Clear)K_RETURN回车键(Enter)K_PAUSE暂停键(Pause)K_ESCAPE退出键(Escape)K_SPACE空格键(Space)K_0...K_90…9K_a...Kza…zK_DELETE删除键(delete)K_KP0...K_KP90(小键盘)…9(小键盘)K_F1...K_F15F1…F15K_UP向上箭头(up arrow)K_DOWN向下箭头(down arrow)K_RIGHT向右箭头(right arrow)K_LEFT向左箭头(left arrow)KMOD_ALT同时按下Alt键

下面通过“图片移动”示例来了解键盘事件的处理过程,如下所示:

import pygame import sys # 初始化pygame pygame.init() # 定义变量 size = width, height = 600, 400 bg = (255, 255, 255) # 加载logo图 img = pygame.image.load("./python.png") # 获取图像的位置 position = img.get_rect() # 创建一个主窗口 screen = pygame.display.set_mode(size) # 标题 pygame.display.set_caption("Python自学网") # 创建游戏主循环 while True: # 设置初始值 site = [0, 0] for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() # 图像移动 KEYDOWN 键盘按下事件 # 通过 key 属性对应按键 if event.type == pygame.KEYDOWN: if event.key == pygame.K_UP: site[1] -= 8 if event.key == pygame.K_DOWN: site[1] += 8 if event.key == pygame.K_LEFT: site[0] -= 8 if event.key == pygame.K_RIGHT: site[0] += 8 # 移动图像 position = position.move(site) # 填充背景 screen.fill(bg) # 放置图片 screen.blit(img, position) # 更新显示界面 pygame.display.flip() 8.4 处理鼠标事件 Pygame 提供了三个鼠标事件,分别是鼠标移动(MOUSEMOTION)、鼠标按下(MOUSEBUTTONDOWN)、鼠标释放(MOUSEBUTTONUP),不同事件类型对应着不同的成员属性。如下所示: pygame.event.MOUSEMOTION鼠标移动事件 event.pos 相对于窗口左上角,鼠标的当前坐标值(x,y) event.rel 鼠标相对运动距离(X,Y),相对于上次事件 event.buttons 鼠标按钮初始状态(0,0,0),分别对应(左键,滑轮,右键),移动过程中点击那个键,相应位置变会为1 pygame.event.MOUSEBUTTONUP鼠标键释放事件 event.pos 相对于窗口左上角,鼠标的当前坐标值(x,y) event.button 鼠标释放键编号(整数)左键为1,按下滚动轮2、右键为3 pygame.event.MOUSEBUTTONDOWN 鼠标键按下事件 event.pos 相对于窗口左上角,鼠标的当前坐标值(x,y) event.button 鼠标按下键编号(整数),左键为1,按下滚动轮2、右键为3,向前滚动滑轮4、向后滚动滑轮5 import pygame from random import randint # 初始化程序 pygame.init() screen = pygame.display.set_mode((450, 400)) pygame.display.set_caption("Python自学网") # 更新显示 pygame.display.flip() while True: # 等待事件发生 event = pygame.event.wait() if event.type == pygame.QUIT: exit("成功退出") if event.type == pygame.MOUSEBUTTONDOWN: # pos 获取鼠标当前位置 print('鼠标按下', event.pos) mx, my = event.pos # 调用 pygame.draw 模块画圆 pygame.draw.circle(screen, (255, 255, 0), (mx, my), 50) # 处理完,更新显示 pygame.display.update() if event.type == pygame.MOUSEBUTTONUP: print('鼠标弹起') pass if event.type == pygame.MOUSEMOTION: print('鼠标移动') mx, my = event.pos # 随机生成 RGB 颜色值 r = randint(0, 255) g = randint(0, 255) b = randint(0, 255) pygame.draw.circle(screen, (r, g, b,), (mx, my), 50) # 处理完,更新显示 pygame.display.update()


【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3