pygame库写游戏——入门 游戏中的关键——事件

1、Pygame对于事件的处理做法是把一系列的事件存放在一个队列中,再逐个的进行处理。

2、事件检索
pygam.event.get()处理所有的事件;
pygame.event.wait(),等到发生一个事件才继续进行下去;
pygame.event.poll()较好一些,一旦调用,会根据当前的情形返回一个真实的事件或者一整个None(什么都没有)。

3、使用wait()来把所有的方法输出:
程序如下:

# -*- coding: utf-8 -*-
"""
Created on Tue Nov 28 19:14:39 2017

@author: zhang
"""
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:
        pygame.quit()

    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()

event_text = event_text[-SCREEN_SIZE[1]//font_height:]
使用//来保证切片为整数(因为我的版本环境为py3.6。

另外退出程序段仍旧使用pygme.quit(),但是我发现当使用窗口形式为NOFRAME也就是无边框的时候,没有QUIT事件,可以用按键来退出程序。代码如下

if event.type == KEYDOWN
  if event == K_SPACE
    pygame.quit()

4、 处理键盘事件
代码如下

# -*- coding: utf-8 -*-
"""
Created on Tue Nov 28 21:22:20 2017

@author: zhang
"""
background_image_filename = 'sushiplate.jpg'

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

pygame.init()
screen = pygame.display.set_mode((640, 480), 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:
           pygame.quit()
        if event.type == KEYDOWN:
            #键盘有按下?
            if event.key == K_LEFT:
                #按下的是左方向键的话,把x座标减一
                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 = 0
            move_y = 0

#计算出新的座标
x+= move_x
y+= move_y

screen.fill((0,0,0))
screen.blit(background, (x,y))
#在新的位置上画图
pygame.display.update()

KEYDOWN和KEYUP的参数描述:
①key – 按下或者放开的键值,是一个数字,估计地球上很少有人可以记住,所以Pygame中你可以使用K_xxx来表示,比如字母a就是K_a,还有K_SPACE和K_RETURN等。
②mod – 包含了组合键信息,如果mod & KMOD_CTRL是真的话,表示用户同时按下了Ctrl键。类似的还有KMOD_SHIFT,KMOD_ALT。
③unicode – 代表了按下键的Unicode值,这个有点不好理解,真正说清楚又太麻烦,游戏中也不太常用,说明暂时省略,什么时候需要再讲吧。

5、事件过滤
可以通过pygame.event.set_blocked(事件名)来完成。
如果需要过滤很多事件,可以传递一个列表,比如pygame.event.set_blocked(KEYDOWN,KEYUP),如果其中参数设定为NONE,那么所有的事件都被允许了。相对应的,我们使用pygame.event.set_allowed()来设定被允许的事件。

6、 产生事件
要想产生事件,必须先构造一个出来,然后再传递它:

my_event = pygame.event.Event(KEYDOWN,key=K_SPACE,mod=0,unicode=u'')
#也可以按下面的写,更清晰明了
my_event = pygame.event.Event(KEYDOWN,{"key":K_SPACE,"mod":0,"unicode":u''})
pygame.event.post(my_event)
#这两段代码我不是很懂-_-

完全自定义一个全新事件,代码演示为

CATONKEYBOARD = USEREVENT+1
my_event = pygame.event.Event(CATONKEYBOARD, message="Bad cat!")
pgame.event.post(my_event)

#然后获得它
for event in pygame.event.get():
    if event.type == CATONKEYBOARD:
        print event.message

但是我在运行之后出现了error: video system not initialized,经过尝试,如果在程序前段加上pygame.init()对pygame库进行一下初始化就能解决了,bingo!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章