第080讲: Pygame:事件 | 学习记录(小甲鱼零基础入门学习Python)

版权声明:转载请标明出处: https://blog.csdn.net/qq_38970783/article/details/89069462

这节课我们来谈谈事件,什么是事件呢?

事实上,我们可以看到,游戏就是一个死循环,如果我们不去干预它的话,它会自己玩得很开心,像之前我们写的乱跑的小猪。而事件就是Pygame 提供给我们去干预它的机制,例如我们点 关闭,就会产生 QUIT 事件,我们处理这个 QUIT 事件的方法就是调用 sys.exut() 方法来退出整个程序。

事件随时都可能发生,比如你在窗口上面移动鼠标,点击鼠标或者敲击键盘的按键,这些都会产生事件,并且信息量是非常大的。Pygame 的做法就是将这所有产生的事件都放在一个叫做 事件队列里,然后我们通过 for 语句迭代出每一个事件,对我们关注的事件进行处理,像我们刚才关注的 QUIT 事件。如下面代码:

for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()

我们现在来写一个代码,将程序运行期间产生的所有事件记录并保存到一个文件中。大家可以先写一下,再看下面的代码:

import pygame
import sys
 
# 初始化Pygame
pygame.init()
 
size = width, height = 800, 600
speed = [-2, 1]
bg = (255, 255, 255) # RGB
 
#实例化Pygame 的time 模块的 Clock 对象
clock = pygame.time.Clock()
 
# 创建指定大小的窗口 Surface
screen = pygame.display.set_mode(size)
# 设置窗口标题
pygame.display.set_caption("初次见面,请大家多多关照!")
 
# 加在图片
turtle = pygame.image.load(r"D:\Code\Python\3.png")
# 获得图像的位置矩形
position = turtle.get_rect()
f =  open (r'D:\Code\Python\1.txt','w')
while True:
    for event in pygame.event.get():
        #将时间全部存到文件中
        f.write(str(event) + '\n')
        if event.type == pygame.QUIT:
            f.close()
            sys.exit()
 
    # 移动图像
    position = position.move(speed)
 
    if position.left < 0 or position.right > width:
        # 翻转图像
        turtle = pygame.transform.flip(turtle, True, False) #水平翻转,垂直不翻转
        # 反方向移动
        speed[0] = -speed[0]
 
    if position.top < 0 or position.bottom > height:
        speed[1] = -speed[1]
 
    # 填充背景
    screen.fill(bg)
    # 更新图像
    screen.blit(turtle, position)
    # 更新界面
    pygame.display.flip()
    # 延迟10毫秒
    #pygame.time.delay(10)
    #设置帧率
    clock.tick(200)

得到的 record.txt 文件里面就可以看到在程序运行期间的所有事件。
在这里插入图片描述
接下来我们希望将这些事件显示在 屏幕上,这就涉及到要在屏幕上显示文本的功能,或者要求我们在 Surface 对象上来打印文字,但是很遗憾的告诉大家,Pygame 并没有办法让你在一个 Surface 对象上面绘制你想要的文字,但是Pygame 也提供了可以达到同样效果的途径,我们就需要使用到 font 模块的 render() 方法。

这个render() 方法就是将显示的文字活生生的渲染成一个 Surface 对象,这样你就可以调用 blit() 方法将一个 Surface 对象复制到另一个Surface 上面。

我们就来开始写代码吧:

import pygame
import sys
 
# 初始化Pygame
pygame.init()
 
size = width, height = 800, 600
bg = (0, 0,0) # RGB
 
# 创建指定大小的窗口 Surface
screen = pygame.display.set_mode(size)

#设置字体对象,第一个参数是字体类型(默认为系统字体),第二个参数是大小
font = pygame.font.Font(None,20)

# 设置窗口标题
pygame.display.set_caption("输出运行期间的所有事件")

#将背景刷成黑色
screen.fill(bg)

#初始化y位置
position = 0

#每一行的高度
font_lineheight = font.get_linesize() 

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        else:
            #使用font中的render方法将事件渲染成图片,第一个参数为要渲染的字符串,第二个参数为是否锯齿化,第三个参数为颜色
            font1 = font.render(str(event),True,(0,255,0))
            #将渲染好的图片添加到原始图像上,后面要跟上位置参数
            screen.blit(font1,(0,position))
            #每次行高发生改变
            position = position + font_lineheight 
            #如果到达最底端,则重新从头开始书写
            if position > height :
                #重新刷成黑色
                screen.fill(bg)
                position = 0
    # 更新界面
    pygame.display.flip()

在代码运行过程中,会将产生的事件依次显示在屏幕上
在这里插入图片描述
大家可能对于打印的事件内容和含义还搞不清楚,下表列出了所有常用的Pygame 事件及其含义。

例如 MOUSEMOTION,它有3个属性,pos 表示当前坐标位置,rel 表示距离上一个位置的相对距离,buttons 是一个三元组,表示你按下了哪一个按钮。

接下来我们就可以做一件事了,让疯狂的小猪受控制了。

我们就不止关注 QUIT 事件了,我们还需要关注 KEYDOWN。(按键事件)

import pygame
import sys
 
# 初始化Pygame
pygame.init()
 
size = width, height = 800, 600
speed = [-2, 1]
bg = (255, 255, 255) # RGB
 
#实例化Pygame 的time 模块的 Clock 对象
clock = pygame.time.Clock()
 
# 创建指定大小的窗口 Surface
screen = pygame.display.set_mode(size)
# 设置窗口标题
pygame.display.set_caption("初次见面,请大家多多关照!")
 
# 加在图片
turtle = pygame.image.load(r"D:\Code\Python\3.png")
# 获得图像的位置矩形
position = turtle.get_rect()
#左转
turn_left = turtle
#右转
turn_right = pygame.transform.flip(turtle, True, False) #水平翻转,垂直不翻转
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        #如果事件类型是按下某个键
        if event.type == pygame.KEYDOWN:
            #如果按下的是左键
            if event.key == pygame.K_LEFT:
                #使小猪翻转
                turtle = turn_left
                speed = [-1,0]
            #如果按下的是右键
            if event.key == pygame.K_RIGHT:
                turtle = turn_right
                speed = [1,0]
            #如果按下的是上键
            if event.key == pygame.K_UP:
                speed = [0,-1]
            #如果按下的是下键
            if event.key == pygame.K_DOWN:
                speed = [0,1]
 
    # 移动图像
    position = position.move(speed)
 
    if position.left < 0 or position.right > width:
        # 翻转图像
        turtle = pygame.transform.flip(turtle, True, False) #水平翻转,垂直不翻转
        # 反方向移动
        speed[0] = -speed[0]
 
    if position.top < 0 or position.bottom > height:
        speed[1] = -speed[1]
 
    # 填充背景
    screen.fill(bg)
    # 更新图像
    screen.blit(turtle, position)
    # 更新界面
    pygame.display.flip()
    # 延迟10毫秒
    #pygame.time.delay(10)
    #设置帧率
    clock.tick(200)

猜你喜欢

转载自blog.csdn.net/qq_38970783/article/details/89069462
今日推荐