前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Easy Games With Python and Pygame(三)- Pygame Event

Easy Games With Python and Pygame(三)- Pygame Event

作者头像
RiemannHypothesis
发布2022-09-26 16:09:41
1.5K0
发布2022-09-26 16:09:41
举报
文章被收录于专栏:Elixir

我正在参加掘金社区游戏创意投稿大赛个人赛,详情请看:游戏创意投稿大赛

一、Pygame Event

事件既发生的某件事,在Pygame中事件有移动或者点击鼠标、按下按键、松开按键或者是经过一定的时间等,都可以称为事件Event,

在之前的程序中,最后都会有一个while True的循环,这个循环会在程序运行期间一致运行,这就是Pygame的事件循环,所以才能看到窗口和图形,否则程序执行完成就停止,也就无法看到窗口和图形了。

只有有按键按下或者鼠标点击都会发生事件,这个事件会存储在队列中等待处理

键盘事件

键盘事件包括KEYUP和KEYDOWN,KEYUP表示松开键盘按键,KEYDOWN表示按下键盘按键,Escape是默认的退出键

新增一个event脚本

代码语言:javascript
复制
import pygame
from pygame.locals import *

pygame.init()

# 创建一个surface对象
surface_size = (640, 480)
surface = pygame.display.set_mode(surface_size)
background = pygame.Surface(surface.get_size())
background_color = (230, 230, 230)
background.fill(background_color)
clock = pygame.time.Clock()


class Alien(pygame.sprite.Sprite):
    def __init__(self, image_file, speed, location):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load(image_file)
        self.rect = self.image.get_rect()
        self.rect.left, self.rect.top = location
        self.speed = speed

    def move(self):
        if self.rect.left <= surface.get_rect().left or self.rect.right >= surface.get_rect().right:
            self.speed[0] = - self.speed[0]
        newpos = self.rect.move(self.speed)
        self.rect = newpos


alien = Alien('alien.bmp', [10, 0], [20, 20])
running = True
while running:
    for event in pygame.event.get():
        if event.type == QUIT:
            running = False

    clock.tick(30)
    surface.blit(background, (0, 0))
    alien.move()
    surface.blit(alien.image, alien.rect)
    pygame.display.flip()

pygame.quit()

这段代码实现了一个外星人可以在窗口中不断的移动反弹

屏幕录制2022-04-25 上午12.14.34.gif
屏幕录制2022-04-25 上午12.14.34.gif

我们可以增加一个键盘事件处理器,当按下上方向键或者下方向键时外星人可以上下移动,也就是说需要检测KEYDOWN事件并且检测按键是上方向键还是下方向键,然后再去做相应的处理

修改while代码块

代码语言:javascript
复制
while running:
    for event in pygame.event.get():
        if event.type == QUIT:
            running = False
        # 检测是否键盘按下事件
        elif event.type == KEYDOWN:
            # 判断按键是否是上方向键
            if event.key == K_UP:
                alien.rect.top -= 10
            # 判断按键是否是下方向键
            elif event.key == K_DOWN:
                alien.rect.top += 10
# 中间代码不变
pygame.quit()

再次重新启动程序,使用上下方向键操作

屏幕录制2022-04-25 上午12.41.06.gif
屏幕录制2022-04-25 上午12.41.06.gif

但是这里还要一个问题,就是当持续按住下方向键时,外星人只会往下移动一次,我们期望的是当连续按下时,外星人可以连续移动,在Pygame中按键一直按下会生成多个KEYDOWN事件也称为按键重复

代码语言:javascript
复制
# 这段代码放在Alien类上面
delay = 100
interval = 50
pygame.key.set_repeat(delay, interval)

delay是告诉pygane在开始按键重复之前等待多长事件,interval是告诉pygame以多块的速度重复,也就是说重复的各个KEYDOWN事件之间要间隔多长时间,单位都是毫秒

Pygame Event 处理 Pygame 程序中的各种事件,在之前已经使用过Q键或者ESC键退出创建的窗口,除此之外还有其他很多Event,比较常用的有除了QUIT,还有鼠标事件,可以通过pygame.event.get()获取所有的事件

  • QUIT
  • KEYDOWN
  • KEYUP
  • MOUSEMOTION
  • MOUSEBUTTONUP
  • MOUSEBUTTONGDOWN

pygame还给键盘中的按键做了命名,这些都在pygame.locals中,字母都是以K_开头,比如在使用上下方向键操作外星人时,还可以使用K_w键和K_s键来代替上和下方向键

鼠标事件

常用的事件除了键盘事件还有鼠标事件,既用鼠标来进行操作,常用的鼠标事件有三种

  • MOUSEBUTTONUP
  • MOUSEBUTTONDOWN
  • MOUSEMOTION

将操作外星人上下的键盘事件切换为鼠标事件

代码语言:javascript
复制
while running:
    for event in pygame.event.get():
        if event.type == QUIT:
            running = False
        elif event.type == MOUSEMOTION:
            alien.rect.center = event.pos
# 其余代码不变
pygame.quit()

上述代码中只要发生了鼠标事件,就将event.pos既鼠标的位置赋值给外形人的中心位置,外星人会随着鼠标的移动而移动

屏幕录制2022-04-25 上午12.52.18.gif
屏幕录制2022-04-25 上午12.52.18.gif

这种处理并不好,只要鼠标晃过都会多外星人的位置有影响,更好的实现是拖动,既按照鼠标按键的情况下对外星人的位置进行移动

代码语言:javascript
复制
held_down = False
while running:
    for event in pygame.event.get():
        if event.type == QUIT:
            running = False
        elif event.type == MOUSEBUTTONDOWN:
            held_down = True
        elif event.type == MOUSEBUTTONUP:
            held_down = False
        elif event.type == MOUSEMOTION:
            if held_down:
                alien.rect.center = event.pos
# 中间代码不变
pygame.quit()

首先判断鼠标按键是否按下,只有鼠标按键按下时拖动鼠标外星人的位置才会随着鼠标移动。

定时器事件

Pygame中还有一种事件是定时器事件,既会按照固定的时间间隔生成事件,pygame定时器事件可以设置为任意间隔,如果定时器到时间,他会创建一个能够被事件循环检测到的事件,pygame设置定时器要使用set_timer()函数

代码语言:javascript
复制
pygame.time.set_timer(EVENT_NUMBER, interval)

EVENT_NUMBER是事件编号,interval是间隔事件,单位是毫秒

pygame中每一个事件都有一个编号

image.png
image.png

事件编号从24开始

代码语言:javascript
复制
direction = 1
pygame.time.set_timer(pygame.USEREVENT, 1000)
while running:
    for event in pygame.event.get():
        if event.type == QUIT:
            running = False
        elif event.type == USEREVENT:
            alien.rect.centery += 30
            if alien.rect.top <= 0 or alien.rect.bottom >= surface.get_rect().bottom:
                direction = -direction
                
                
# 中间代码不变
pygame.quit()
屏幕录制2022-04-25-上午1.18.00.gif
屏幕录制2022-04-25-上午1.18.00.gif

外星人会每1000ms向下移动

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-04-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、Pygame Event
    • 键盘事件
      • 鼠标事件
        • 定时器事件
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档