Python之Pygame的Event事件模块怎么使用
时间:2023-05-18 17:20
事件(Event)是 Pygame 的重要模块之一,它是构建整个游戏程序的核心,比如常用的鼠标点击、键盘敲击、游戏窗口移动、调整窗口大小、触发特定的情节、退出游戏等,这些都可以看做是“事件”。 Pygame 定义了一个专门用来处理事件的结构,即事件队列,该结构遵循遵循队列“先到先处理”的基本原则,通过事件队列,我们可以有序的、逐一的处理用户的操作(触发事件)。下述表格列出了 Pygame 中常用的游戏事件: 注意,当使用 Pygame 做游戏开发时,上述事件并非都会应用的到,因此在学习的过程中,我们要懂得触类旁通、举一反三。 当我们使用 Pygame 处理事件时,逻辑一般都是相似的。需要先确定事件的类型,然后针对每种事件类型采取不同的游戏操作。因此,if & else 语句非常适用于这种情况。如下所示: 我们可以使用键盘事件提供的 key 属性获取按下的键盘按键。Pygame 将键盘上的字母键、数字键、组合键等按键以常量的方式进行了定义,下表列出了部分常用按键的常量: 下面通过“图片移动”示例来了解键盘事件的处理过程,如下所示: Pygame 提供了三个鼠标事件,分别是鼠标移动(MOUSEMOTION)、鼠标按下(MOUSEBUTTONDOWN)、鼠标释放(MOUSEBUTTONUP),不同事件类型对应着不同的成员属性。如下所示: pygame.event.MOUSEMOTION鼠标移动事件 event.pos 相对于窗口左上角,鼠标的当前坐标值(x,y) pygame.event.MOUSEBUTTONUP鼠标键释放事件 event.pos 相对于窗口左上角,鼠标的当前坐标值(x,y) pygame.event.MOUSEBUTTONDOWN 鼠标键按下事件 event.pos 相对于窗口左上角,鼠标的当前坐标值(x,y) 以上就是Python之Pygame的Event事件模块怎么使用的详细内容,更多请关注Gxl网其它相关文章!Pygame的Event事件模块
事件类型
名称 说明 QUIT
用户按下窗口的关闭按钮 ATIVEEVENT
Pygame被激活或者隐藏 KEYDOWN
键盘按下 KEYUP
键盘放开 MOUSEMOTION
鼠标移动 MOUSEBUTTONDOWN
鼠标按下 MOUSEBUTTONUP
鼠标放开 JOYAXISMOTION
游戏手柄(Joystick or pad) 移动 JOYBALLMOTION
游戏球(Joy ball) 移动 JOYHATMOTION
游戏手柄(Joystick) 移动 JOYBUTTONDOWN
游戏手柄按下 JOYBUTTONUP
游戏手柄放开 VIDEORESIZE
Pygame窗口缩放 VIDEOEXPOSE
Pygame窗口部分公开(expose) USEREVENT
触发一个用户事件 事件处理方法
名称 说明 pygame.event.get()
从事件队列中获取一个事件,并从队列中删除该事件 pygame.event.wait()
阻塞直至事件发生才会继续执行,若没有事件发生将一直处于阻塞状态 pygame.event.set_blocked()
控制哪些事件禁止进入队列,如果参数值为None,则表示禁止所有事件进入 pygame.event.set_allowed()
控制哪些事件允许进入队列 pygame.event.pump()
调用该方法后,Pygame 会自动处理事件队列 pygame.event.poll()
会根据实际情形返回一个真实的事件,或者一个None pygame.event.peek()
检测某类型事件是否在队列中 pygame.event.clear()
从队列中清除所有的事件 pygame.event.get_blocked()
检测某一类型的事件是否被禁止进入队列 pygame.event.post()
放置一个新的事件到队列中 pygame.event.Event()
创建一个用户自定义的新事件 import pygamewhile 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('键盘弹起')
处理键盘事件
名称 说明 K_BACKSPACE
退格键(Backspace) K_TAB
制表键(Tab) K_CLEAR
清除键(Clear) K_RETURN
回车键(Enter) K_PAUSE
暂停键(Pause) K_ESCAPE
退出键(Escape) K_SPACE
空格键(Space) K_0...K_9
0…9 K_a...Kz
a…z K_DELETE
删除键(delete) K_KP0...K_KP9
0(小键盘)…9(小键盘) K_F1...K_F15
F1…F15 K_UP
向上箭头(up arrow) K_DOWN
向下箭头(down arrow) K_RIGHT
向右箭头(right arrow) K_LEFT
向左箭头(left arrow) KMOD_ALT
同时按下Alt键 import pygameimport sys# 初始化pygamepygame.init()# 定义变量size = width, height = 600, 400bg = (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()
处理鼠标事件
event.rel 鼠标相对运动距离(X,Y),相对于上次事件
event.buttons 鼠标按钮初始状态(0,0,0),分别对应(左键,滑轮,右键),移动过程中点击那个键,相应位置变会为1
event.button 鼠标释放键编号(整数)左键为1,按下滚动轮2、右键为3
event.button 鼠标按下键编号(整数),左键为1,按下滚动轮2、右键为3,向前滚动滑轮4、向后滚动滑轮5import pygamefrom 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()