目录
首先解释几个问题:
1、事件处理需求主要有以下几个方面:
2、Pygame事件队列
3、Pygame事件
4、事件类型及属性
5、事件处理的重要函数
6、键盘事件
7、鼠标事件
8、处理事件函数
9、操作事件队列
10、生成事件
其次给出代码段,有利于大家对其进行学习和分析
最后进行小结:
作为一款游戏,一方面是游戏的内容是否吸引人,另一方面就是作为游戏者参与其中,因此如何与用户互动是需要着重解决的问题,因此第二部分是事件处理机制,也就是上篇中提到的event.type的处理。一般为键盘和鼠标输入,开发高级一点游戏还需要游戏杆,这里主要说一下键盘和鼠标操作的处理。
首先解释几个问题:
1、事件处理需求主要有以下几个方面:
• 响应用户键盘、鼠标等外设操作
• 响应屏幕尺寸和模式变化
• 响应游戏情节的特定触发条件
• 产生一些触发条件
• ……
2、Pygame事件队列
建立的一个队列,用于缓存并派发所有事件
原则上先到先处理
3、Pygame事件
pygame.event.EventType
• 事件本质上是一种封装后的数据类型(对象)
• EventType是Pygame的一个类,表示事件类型
• 事件类型只有属性,没有方法
• 用户可自定义新的事件类型
4、事件类型及属性
5、事件处理的重要函数
6、键盘事件
针对事件类型,例如键盘中按下,然后针对不同的键值和修饰符组合,可以实现多种对游戏的操作反馈,从而实现人对游戏的全面操控,但是基于游戏的可玩性,尽量的减少按键的数量,对于游戏是有益的!
7、鼠标事件
(1)pygame.event.MOUSEMOTION鼠标移动事件
• event.pos 鼠标当前坐标值(x,y),相对于窗口左上角
• event.rel 鼠标相对运动距离(X,Y),相对于上次事件
• event.buttons 鼠标按钮状态(a,b,c),对应于鼠标的三个键
(2)pygame.event.MOUSEBUTTONUP 鼠标键释放事件
• event.pos 鼠标当前坐标值(x,y),相对于窗口左上角
• event.button 鼠标按下键编号n,取值 0/1/2,分别对应三个键
(3)pygame.event.MOUSEBUTTONDOWN 鼠标键按下事件
• event.pos 鼠标当前坐标值(x,y),相对于窗口左上角
• event.button 鼠标按下键编号n,取值为整数,左键为1,右键为3,设备相关
8、处理事件函数
(1)pygame.event.get()
• 从事件队列中获得事件列表,即获得所有被队列的事件
例如:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
• 可以增加参数,获得某类或某些类事件:
pygame.event.get(type)
pygame.event.get(typelist)
(2)pygame.event.poll()
• 从事件队列中获得一个事件
While True:
event = pygame.event.poll()
• 事件获取将从事件队列中删除
• 如果事件队列为空,则返回 event.NOEVENT
(3)pygame.event.clear()
• 从事件队列中删除事件,默认删除所有事件
• 该函数与pygame.event.get()类似,区别仅是不对事件进行处理
• 可以增加参数,删除某类或某些类事件:
pygame.event.clear(type)
pygame.event.clear(typelist)
9、操作事件队列
pygame.event.set_blocked(type or typelist)
• 控制哪些类型事件不允许被保存到事件队列中
pygame.event.set_allowed(type or typelist)
• 控制哪些类型事件允许被保存到事件队列中
pygame.event.get_blocked(type)
• 测试某个事件类型是否被事件队列所禁止
• 如果事件类型被禁止,则返回True,否则返回False
10、生成事件
pygame.event.post(Event)
• 产生一个事件,并将其放入事件队列
• 一般用于放置用户自定义事件(pygame.USEREVENT)
• 也可以用于放置系统定义事件(如鼠标或键盘等),给定参数
pygame.event.Event(type, dict)
• 创建一个给定类型的事件
• 其中,事件的属性和值采用字典类型复制,属性名采用字符串形式
• 如果创建已有事件,属性需要一致
其次给出代码段,有利于大家对其进行学习和分析
# Unit PYG03: Pygame Wall Ball Game version 8 鼠标型
import pygame,sys
pygame.init()
size = width, height = 600, 400
speed = [1,1]
BLACK = 0, 0, 0
screen = pygame.display.set_mode(size, pygame.RESIZABLE) #窗口大小可调
icon = pygame.image.load("PYG03-flower.png")
pygame.display.set_icon(icon)
pygame.display.set_caption("Pygame壁球")
ball = pygame.image.load("PYG02-ball.gif")
ballrect = ball.get_rect()
fps = 300
fclock = pygame.time.Clock()
still = False
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
speed[0] = speed[0] if speed[0] == 0 else (abs(speed[0]) - 1)*int(speed[0]/abs(speed[0]))
elif event.key == pygame.K_RIGHT:
speed[0] = speed[0] + 1 if speed[0] > 0 else speed[0] - 1
elif event.key == pygame.K_UP:
speed[1] = speed[1] + 1 if speed[1] > 0 else speed[1] - 1
elif event.key == pygame.K_DOWN:
speed[1] = speed[1] if speed[1] == 0 else (abs(speed[1]) - 1)*int(speed[1]/abs(speed[1]))
elif event.key == pygame.K_ESCAPE:
sys.exit()
elif event.type == pygame.VIDEORESIZE:
size = width, height = event.size[0], event.size[1]
screen = pygame.display.set_mode(size, pygame.RESIZABLE)
elif event.type == pygame.MOUSEBUTTONDOWN:
if event.button == 1:
still = True
elif event.type == pygame.MOUSEBUTTONUP:
still = False
if event.button == 1:
ballrect = ballrect.move(event.pos[0] - ballrect.left, event.pos[1] - ballrect.top)
elif event.type == pygame.MOUSEMOTION:
if event.buttons[0] == 1:
ballrect = ballrect.move(event.pos[0] - ballrect.left, event.pos[1] - ballrect.top)
if pygame.display.get_active() and not still:
ballrect = ballrect.move(speed)
if ballrect.left < 0 or ballrect.right > width:
speed[0] = - speed[0]
if ballrect.right > width and ballrect.right + speed[0] > ballrect.right:
speed[0] = - speed[0]
if ballrect.top < 0 or ballrect.bottom > height:
speed[1] = - speed[1]
if ballrect.bottom > height and ballrect.bottom + speed[1] > ballrect.bottom:
speed[1] = - speed[1]
screen.fill(BLACK)
screen.blit(ball, ballrect)
pygame.display.update()
fclock.tick(fps)
上面的代码中用到获取事件,处理了关闭、键盘、鼠标、窗口变化等,可以用于分析代码使用
# Unit PYG04: Pygame Event Post
import pygame,sys
pygame.init()
screen = pygame.display.set_mode((600, 400))
pygame.display.set_caption("Pygame事件处理")
fps = 1
fclock = pygame.time.Clock()
num = 1
while True:
uevent = pygame.event.Event(pygame.KEYDOWN, {"unicode": 123, "key":pygame.K_SPACE, "mod":pygame.KMOD_ALT})
pygame.event.post(uevent)
num = num + 1
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.unicode == "":
print("[KEYDOWN {}]:".format(num), "#", event.key, event.mod)
else:
print("[KEYDOWN {}]:".format(num), event.unicode, event.key, event.mod)
pygame.display.update()
fclock.tick(fps)
上面的代码段创建和产生事件的操作,可用于学习使用,代码段来源于慕课
最后进行小结:
本文简单的介绍了pygame的事件处理机制。
1、事件的处理需求通俗的讲,就是软件如何应对用户的操作,何种操作对应如何处置,那些需要响应,哪些不需要响应,哪些重点响应,哪些可以等会响应,以及如何响应的问题。
2、事件队列通俗讲就是排队需要解决的问题,一般是后来先处理,但也可以设置不同的处理方式。
3、事件类型是pygame可以处理的类型,并对键盘、鼠标等进行重点解释。这些事件类型是应用于事件处理中的,排在事件队列中,但一般不需要我们管事件队列的处理方式
4、事件处理的重要函数则是对事件进行处理的方法,哪些需要处理,哪些不需要处理,如何处理都是由此处理的,甚至于根据自己需要生成事件进行处理。文章来源:https://www.toymoban.com/news/detail-461277.html
注:键盘的常用键值和修饰值一般不需要记忆,用的时候查一下就行了!有点太多了,了解一下就中了!文章来源地址https://www.toymoban.com/news/detail-461277.html
到了这里,关于Pygame事件处理机制简介-慕课的python游戏开发入门02的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!