前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >pygame-游戏开发学习笔记(三)–event事件捕捉

pygame-游戏开发学习笔记(三)–event事件捕捉

作者头像
十四君
修改2019-11-26 10:43:09
1.5K0
修改2019-11-26 10:43:09
举报
文章被收录于专栏:UrlteamUrlteam

事件是什么,其实从名称来看我们就能想到些什么,而且你所想到的基本就是事件的真正意思了。

上一个程序,会一直运行下去,直到你关闭窗口而产生了一个QUIT事件,Pygame会接受用户的各种操作(比如按键盘,移动鼠标等)产生事件。事件随时可能发生,而且量也可能会很大,Pygame的做法是把一系列的事件存放一个队列里,逐个的处理。

上个程序中,使用了pygame.event.get()来处理所有的事件,这好像打开大门让所有的人进入。如果我们使用pygame.event.wait(),Pygame就会等到发生一个事件才继续下去,就好像你在门的猫眼上盯着外面一样,来一个放一个……一般游戏中不太实用,因为游戏往往是需要动态运作的;而另外一个方法pygame.event.poll()就好一些,一旦调用,它会根据现在的情形返回一个真实的事件,或者一个“什么都没有”。下表是一个

常用事件集:

事件

产生途径

参数

QUIT

用户按下关闭按钮

none

ATIVEEVENT

Pygame被激活或者隐藏

gain, state

KEYDOWN

键盘被按下

unicode, key, mod

KEYUP

键盘被放开

key, mod

MOUSEMOTION

鼠标移动

pos, rel, buttons

MOUSEBUTTONDOWN

鼠标按下

pos, button

MOUSEBUTTONUP

鼠标放开

pos, button

JOYAXISMOTION

游戏手柄(Joystick or pad)移动

joy, axis, value

JOYBALLMOTION

游戏球(Joy ball)?移动

joy, axis, value

JOYHATMOTION

游戏手柄(Joystick)?移动

joy, axis, value

JOYBUTTONDOWN

游戏手柄按下

joy, button

JOYBUTTONUP

游戏手柄放开

joy, button

VIDEORESIZE

Pygame窗口缩放

size, w, h

VIDEOEXPOSE

Pygame窗口部分公开(expose)?

none

USEREVENT

触发了一个用户事件

code

用下列的一个小程序来实现一下。我们这里使用了wait(),因为这个程序在有事件发生的时候动弹就可以了。还用了font模块来显示文字(后面会讲的),下面是源代码:

代码语言:javascript
复制
#coding:utf-8
import pygame 
from pygame.locals import *
from sys import exit

pygame.init()
screen_size = (1280,800)

screen = pygame.display.set_mode(screen_size, 0 ,32)
#初始化屏幕,大小1280*800,不使用特殊,32色。
font = pygame.font.SysFont("arial",16);
font_height = font.get_linesize()
event_text = []
#调用系统字体,获取行高的数值,建立一个列表用来存放事件

while True:

    event = pygame.event.wait()
    event_text.append(str(event))
#建立事件等待,获取到就转换成字符串给列表。
    event_text = event_text[-screen_size[1]/font_height:]
#切片处理,暂时还没有领悟,大概作用是一次只保留屏幕所能显示的那部分
    if event.type == QUIT:
        exit()

    screen.fill((0,0,0))
#设置背景色,0,0,0就是全黑
    y = screen_size[1]-font_height

    for text in reversed(event_text):
        screen.blit(font.render(text,True,(0,255,0)),(0,y))

        y -= font_height
#这里是打印出所有事件。
    pygame.display.update()

这个程序在你移动鼠标的时候产生了海量的信息,让我们知道了Pygame是多么的繁忙……我们第一个程序那样是调用pygame.mouse.get_pos()来得到当前鼠标的位置,而现在利用事件可以直接获得!

处理鼠标事件

MOUSEMOTION事件会在鼠标动作的时候发生,它有三个参数:

  • buttons – 一个含有三个数字的元组,三个值分别代表左键、中键和右键,1就是按下了。
  • pos – 就是位置了……
  • rel – 代表了现在距离上次产生鼠标事件时的距离

和MOUSEMOTION类似的,我们还有MOUSEBUTTONDOWNMOUSEBUTTONUP两个事件,看名字就明白是什么意思了。很多时候,你只需要知道鼠标点下就可以了,那就可以不用上面那个比较强大(也比较复杂)的事件了。它们的参数为:

  • button – 看清楚少了个s,这个值代表了哪个按键被操作
  • pos – 和上面一样。

处理键盘事件

键盘和游戏手柄的事件比较类似,为KEYDOWNKEYUP,下面有一个例子来演示使用方向键移动一些东西。

代码语言:javascript
复制
#coding:utf-8
import pygame
from pygame.locals import *
from sys import exit

background_image_filename = '1.1.jpg'

pygame.init()
screen = pygame.display.set_mode((1280,800),0,32)
background = pygame.image.load(background_image_filename).convert()
#以上的请看前几篇的解释。
x,y=0,0
move_x ,move_y = 0,0

while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            exit()
        if event.type == KEYDOWN:
        #开始检测,是否按键下面的很直观就是表现移动值
            if event.key == K_LEFT:
                move_x = -1
            elif event.key == K_RIGHT:
                move_x = 1
            elif event.key == K_UP:
                move_y = -1
            elif event.key == K_DOWN:
                move_y = 1
        elif event.type == KEYUP:
            move_x ,move_y = 0,0
#这里很精妙了,因为把原文中的缩进提前,下面的五行都属于while中了,所以自然会一直的被捕捉到。
    x += move_x
    y += move_y

    screen.fill((0,0,0))
    screen.blit(background,(x,y))
    pygame.display.update()

原创文章,转载请注明: 转载自URl-team

本文链接地址: pygame-游戏开发学习笔记(三)–event事件捕捉

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 常用事件集:
  • 处理鼠标事件
  • 处理键盘事件
相关产品与服务
云开发 CloudBase
云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档