Pygame事件处理机制简介-慕课的python游戏开发入门02

目录

首先解释几个问题:

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、事件处理的重要函数则是对事件进行处理的方法,哪些需要处理,哪些不需要处理,如何处理都是由此处理的,甚至于根据自己需要生成事件进行处理。

注:键盘的常用键值和修饰值一般不需要记忆,用的时候查一下就行了!有点太多了,了解一下就中了!

猜你喜欢

转载自blog.csdn.net/sygoodman/article/details/124358615