您的位置:首页 > 其它

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

2017-12-06 21:40 309 查看
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
4000
(my_event)

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


但是我在运行之后出现了error: video system not initialized,经过尝试,如果在程序前段加上pygame.init()对pygame库进行一下初始化就能解决了,bingo!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  游戏 pygame库