pygame库写游戏——入门<2> 游戏中的关键——事件
2017-12-06 21:40
309 查看
1、Pygame对于事件的处理做法是把一系列的事件存放在一个队列中,再逐个的进行处理。
2、事件检索
pygam.event.get()处理所有的事件;
pygame.event.wait(),等到发生一个事件才继续进行下去;
pygame.event.poll()较好一些,一旦调用,会根据当前的情形返回一个真实的事件或者一整个None(什么都没有)。
3、使用wait()来把所有的方法输出:
程序如下:
event_text = event_text[-SCREEN_SIZE[1]//font_height:]
使用//来保证切片为整数(因为我的版本环境为py3.6。
另外退出程序段仍旧使用pygme.quit(),但是我发现当使用窗口形式为NOFRAME也就是无边框的时候,没有QUIT事件,可以用按键来退出程序。代码如下
4、 处理键盘事件
代码如下
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、 产生事件
要想产生事件,必须先构造一个出来,然后再传递它:
完全自定义一个全新事件,代码演示为
但是我在运行之后出现了error: video system not initialized,经过尝试,如果在程序前段加上pygame.init()对pygame库进行一下初始化就能解决了,bingo!
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库写游戏——入门<5>——游戏中的视觉
- pygame库写游戏——入门<6>——存储图像
- pygame库写游戏——入门<8>——动画和帧率
- 【python】python 入门<2>——modules
- 【《Python编程: 从入门到实践》习题答案--第十二章,番外<pycharm安装pygame>】
- pygame库写游戏——入门<7>——python.draw
- 积分从入门到放弃<2>
- OllyDBG 入门系列<2> 字串参考
- Linux入门:常用命令:gzip、tar、file、>、>>、<、2>、;、&&、||、``
- Web从入门到放弃<2>
- starling1.2 游戏思路<2>
- 从零开始学_JavaScript_系列(八)——js系列<2>(事件触发顺序、文本读取、js编写ajax、输入验证、下拉菜单)
- 2015/11/3用Python写游戏,pygame入门(3):字体模块、事件显示和错误处理
- OllyDBG 入门系列<2> 字串参考
- Express学习之开始入门<2>
- Rust之开始入门<2>
- 2015/11/2用Python写游戏,pygame入门(2):游戏中的事件和显示
- 用Python和Pygame写游戏-从入门到精通(2)事件
- <<Android.游戏开发入门](美)Mario.Zechner>>读书笔记-----OpenGL ES概览
- <Python和Pygame游戏开发指南>1