事件是什么,其实从名称来看我们就能想到些什么,而且你所想到的基本就是事件的真正意思了。
上一个程序,会一直运行下去,直到你关闭窗口而产生了一个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模块来显示文字(后面会讲的),下面是源代码:
#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事件会在鼠标动作的时候发生,它有三个参数:
和MOUSEMOTION类似的,我们还有MOUSEBUTTONDOWN和MOUSEBUTTONUP两个事件,看名字就明白是什么意思了。很多时候,你只需要知道鼠标点下就可以了,那就可以不用上面那个比较强大(也比较复杂)的事件了。它们的参数为:
键盘和游戏手柄的事件比较类似,为KEYDOWN和KEYUP,下面有一个例子来演示使用方向键移动一些东西。
#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事件捕捉