《零基础入门学习Python》第080讲:Pygame:事件

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

事实上,我们可以看到,游戏就是一个死循环,如果我们不去干预它的话,它会自己玩得很开心,像之前我们写的乱跑的小蛇。而事件就是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

screen = pygame.display.set_mode(size)
pygame.display.set_caption("初次见面,请大家多多关照!")

f = open("record.txt", "w") #创建文件,写入形式

while True:
    for event in pygame.event.get():  #迭代每一个事件
        f.write(str(event) + "\n")   #将每一个事件写入文件,以换行符隔开
        if event.type == pygame.QUIT:
            f.close()  #关闭文件
            sys.exit()

得到的 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

screen = pygame.display.set_mode(size)
pygame.display.set_caption("Python Demo")
bg = (0, 0 , 0)

position = 0
#实例化Font对象
font = pygame.font.Font(None, 20)
line_height = font.get_linesize()

screen.fill(bg) #背景画布填充为黑色

while True:
    for event in pygame.event.get():  #迭代每一个事件
        if event.type == pygame.QUIT:            
            sys.exit()

        screen.blit(font.render(str(event), True, (0, 255, 0)), (0, position))
        position += line_height

        if position > height:
            position = 0
            screen.fill(bg)

    pygame.display.flip()

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

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

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

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

import pygame
import sys

# 初始化Pygame
pygame.init()

size = width, height = 600, 400
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("python.png")
# 获得图像的位置矩形
position = turtle.get_rect()

l_head = turtle
r_head = 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 = l_head  #调头
                speed = [-1, 0]
            if event.key == pygame.K_RIGHT:
                turtle = r_head  #调头
                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)

 

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值