Pygame写游戏, 从入门到精通(二点一)

上次我们试着写了一个最简单的Pygame程序并且解释了一个大概的框架,这次就Pygame中也是游戏中最关键(……好吧,也许并不是关键,但绝对是至关重要的一项)的事件来展开。

此图为一个用Pygame开发的游戏,或许有些简陋,但是只要你有爱,什么都能出来!

理解事件事件是什么,其实从名称来看我们就能想到些什么,而且你所想到的基本就是事件的真正意思了。我们上一个程序,会一直运行下去,直到你关闭窗口而产生了一个QUIT事件,Pygame会接受用户的各种操作(比如按键盘,移动鼠标等)产生事件。事件随时可能发生,而且量也可能会很大,Pygame的做法是把一系列的事件存放一个队列里,逐个的处理。

事件检索上个程序中,使用了pygame.event.get()来处理所有的事件,这好像打开大门让所有的人进入。如果我们使用pygame.event.wait(),Pygame就会等到发生一个事件才继续下去,就好像你在门的猫眼上盯着外面一样,来一个放一个……一般游戏中不太实用,因为游戏往往是需要动态运作的;而另外一个方法pygame.event.poll()就好一些,一旦调用,它会根据现在的情形返回一个真实的事件,或者一个“什么都没有”。下表是一个常用事件集:
[table]
[td][tr][td]事件[/td][td]产生途径[/td][td]参数[/td][/tr]
[tr][td]QUIT[/td][td]用户按下关闭按钮[/td][td]none[/td][/tr]
[tr][td]ATIVEEVENT[/td][td]Pygame被激活或者隐藏[/td][td]gain, state[/td][/tr]
[tr][td]KEYDOWN[/td][td]键盘被按下[/td][td]unicode, key, mod[/td][/tr]
[tr][td]KEYUP[/td][td]键盘被放开[/td][td]key, mod[/td][/tr]
[tr][td]MOUSEMOTION[/td][td]鼠标移动[/td][td]pos, rel, buttons[/td][/tr]
[tr][td]MOUSEBUTTONDOWN[/td][td]鼠标按下[/td][td]pos, button[/td][/tr]
[tr][td]MOUSEBUTTONUP[/td][td]鼠标放开[/td][td]pos, button[/td][/tr]
[tr][td]JOYAXISMOTION[/td][td]游戏手柄(Joystick or pad)移动[/td][td]joy, axis, value[/td][/tr]
[tr][td]JOYBALLMOTION[/td][td]游戏球(Joy ball)?移动[/td][td]joy, axis, value[/td][/tr]
[tr][td]JOYHATMOTION[/td][td]游戏手柄(Joystick)?移动[/td][td]joy, axis, value[/td][/tr]
[tr][td]JOYBUTTONDOWN[/td][td]游戏手柄按下[/td][td]joy, button[/td][/tr]
[tr][td]JOYBUTTONUP[/td][td]游戏手柄放开[/td][td]joy, button[/td][/tr]
[tr][td]VIDEORESIZE[/td][td]Pygame窗口缩放[/td][td]size, w, h[/td][/tr]
[tr][td]VIDEOEXPOSE[/td][td]Pygame窗口部分公开(expose)?[/td][td]none[/td][/tr]
[tr][td]USEREVENT[/td][td]触发了一个用户事件[/td][td]code[/td][/tr]
[/table]如果你想把这个表现在就背下来,当然我不会阻止你,但实在不是个好主意,在实际的使用中,自然而然的就会记住。我们先来写一个可以把所有方法输出的程序,它的结果是这样的。

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

import pygame
from pygame.locals import *
from sys import exit

pygame.init()
SCREEN_SIZE = (640, 480)
screen = pygame.display.set_mode(SCREEN_SIZE, 0, 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:]
#这个切片操作保证了event_text里面只保留一个屏幕的文字

if event.type == QUIT:
exit()

screen.fill((255, 255, 255))

y = SCREEN_SIZE[1]-font_height
#找一个合适的起笔位置,最下面开始但是要留一行的空
for text in reversed(event_text):
screen.blit( font.render(text, True, (0, 0, 0)), (0, y) )
#以后会讲
y-=font_height
#把笔提一行

pygame.display.update()

:3_54:道长,图片里的游戏是您老人家做的么!?

显然不是啊,这风格配不上我的称呼:4_86: 我要做肯定是仙侠风的 哈哈

:3_52:我也这么认为!那道长赶紧上自己做的游戏截图给俺们看看呀~