Pygame Event事件模�(详细示例)
事件类型
Pygame 定义了一个专门用æ�¥å¤„ç�†äº‹ä»¶çš„结构,å�³äº‹ä»¶é˜Ÿåˆ—,该结构é�µå¾ªé�µå¾ªé˜Ÿåˆ—“先到先处ç�†”的基本原则,通过事件队列,我们å�¯ä»¥æœ‰åº�çš„ã€�é€�一的处ç�†ç”¨æˆ·çš„æ“�作(触å�‘äº‹ä»¶ï¼‰ã€‚ä¸‹è¿°è¡¨æ ¼åˆ—å‡ºäº† Pygame ä¸å¸¸ç”¨çš„æ¸¸æˆ�事件:| 事件类型 | æ��è¿° | æˆ�员属性 |
|---|---|---|
| QUIT | 用户按下窗å�£çš„关闿Œ‰é’® | none |
| ATIVEEVENT | Pygame被激活或者�� | gain,state |
| KEYDOWN | 键盘按下 | unicode�key�mod |
| KEYUP | 键盘放开 | key�mod |
| MOUSEMOTION | é¼ æ ‡ç§»åŠ¨ | pos, rel, buttons |
| MOUSEBUTTONDOWN | é¼ æ ‡æŒ‰ä¸‹ | pos, button |
| MOUSEBUTTONUP | é¼ æ ‡æ”¾å¼€ | pos, button |
| JOYAXISMOTION | 游�手柄(Joystick or pad) 移动 | joy, axis, value |
| JOYBALLMOTION | 游��(Joy ball) 移动 | joy, axis, value |
| JOYHATMOTION | 游�手柄(Joystick) 移动 | joy, axis, value |
| JOYBUTTONDOWN | 游�手柄按下 | joy, button |
| JOYBUTTONUP | 游�手柄放开 | joy, button |
| VIDEORESIZE | Pygame窗�缩放 | size, w, h |
| VIDEOEXPOSE | Pygame窗�部分公开(expose) | none |
| USEREVENT | 触å�‘一个用户事件 | 事件代ç � |
注æ„�,当使用 Pygame å�𿏏æˆ�å¼€å�‘时,上述事件并é�žéƒ½ä¼šåº”ç”¨çš„åˆ°ï¼Œå› æ¤åœ¨å¦ä¹ 的过程ä¸ï¼Œæˆ‘们è¦�懂得触类æ—�通ã€�举一å��三。
事件处�方法
Pygame.event 模��供了处�事件队列的常用方法,如下表所示:| 方法 | 说明 |
|---|---|
| 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() | 创建一个用户自定义的新事件 |
当我们使用 Pygame 处ç�†äº‹ä»¶æ—¶ï¼Œé€»è¾‘一般都是相似的。首先是判æ–事件的类型,然å�Žæ ¹æ�®ä¸�å�Œçš„事件æ“�作,执行ä¸�å�Œçš„æ¸¸æˆ�æ“�ä½œã€‚å› æ¤è¿™ç§�情况é�žå¸¸é€‚å�ˆä½¿ç”¨ if ... else è¯å�¥ã€‚如下所示:
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('键盘弹起')
....
下é�¢åº”ç”¨ä¸Šè¿°æ–¹æ³•å¯¹é¼ æ ‡äº‹ä»¶å’Œé”®ç›˜äº‹ä»¶åˆ†åˆ«å�šç®€å�•的介ç»�。
处�键盘事件
键盘事件会涉å�Šåˆ°å¤§é‡�的按键æ“�作,比如游æˆ�ä¸çš„上下左å�³ï¼Œæˆ–者人物的å‰�è¿›ã€�å�Žé€€ç‰æ“�作,这些都需è¦�键盘æ�¥é…�å�ˆå®žçŽ°ã€‚é”®ç›˜äº‹ä»¶æ��供了一个 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_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 pygame
import sys
# �始化pygame
pygame.init()
# 定义��
size = width, height = 600, 400
bg = (255, 255, 255)
# åŠ è½½logo图
img = pygame.image.load("C:/Users/Administrator/Desktop/logo.jpg")
# 获�图�的�置
position = img.get_rect()
# 创建一个主窗�
screen = pygame.display.set_mode(size)
# æ ‡é¢˜
pygame.display.set_caption("Cè¯è¨€ä¸æ–‡ç½‘")
# 创建游�主循环
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()
程��行结果如下:
图1:Pygame键盘事件——图åƒ�移动
处ç�†é¼ æ ‡äº‹ä»¶
é¼ æ ‡æ˜¯è®¡ç®—æœºæœ€é‡�è¦�外接设备之一,å�Œæ—¶å®ƒä¹Ÿæ˜¯æ¸¸æˆ�玩家必ä¸�å�¯å°‘的工具之一。
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("cè¯è¨€ä¸æ–‡ç½‘")
# 更新显示
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()
程åº�è¿�行结果如下:
图2:Pygameé¼ æ ‡äº‹ä»¶——é¼ æ ‡ç§»åŠ¨
关注公众å�·ã€Œç«™é•¿ä¸¥é•¿ç”Ÿã€�,在手机上阅读所有教程,éš�æ—¶éš�地都能å¦ä¹ 。本公众å�·ç”±Cè¯è¨€ä¸æ–‡ç½‘站长亲自è¿�è�¥ï¼Œé•¿æœŸæ›´æ–°ï¼Œå�šæŒ�原创。

微信扫ç �关注公众å�·
优秀文ç«
- 顺åº�查找算法和折å�Šï¼ˆäºŒåˆ†æ³•)查找算法,Cè¯è¨€æŸ¥æ‰¾ç®—法详解
- dd命令_Linux dd命令:�制(拷�)文件,并对原文件进行转�
- Linux文件(目录)命�规则
- JS移��算符(<<�>>和>>>)
- Java 8ä¸Map新增的方法
- Goè¯è¨€ä½¿ç”¨å›¾åƒ�包制作GIF动画
- MySQL约�概述
- 关于站长
- Redis HGETALL命令
- fn:escapeXml()函数