创建真正的游戏(续)
在上一篇博客介绍了pygame模块的安装,并开始通过pygame模块来创建贪吃蛇游戏。在上篇博客中我创建了一个窗体,贪吃蛇游戏将在窗体中运行。同时简单编写了一个退出窗体的事件应对机制,今天的博客将深入学习pygame模块,并一步一步“勾勒”出完整的贪吃蛇游戏。
上篇博客贪吃蛇代码编写到创建贪吃蛇游戏的窗体:
import pygame #导入pygame模块 from pygame.locals import * #导入pygame模块中常用的函数和常量,如表示全屏的FULLSCREEN常量 from sys import exit #导入sys模块中的exit()方法,用于退出程序 #设置常量 BACKBROUNDFILL = (255,245,238) #窗体背景填充RGB数值 #初始化pygame组件 pygame.init() #创建一个窗口对象 screen = pygame.display.set_mode((640,480),0,32) #元组(640,480)代表640X480的分辨率;0表示窗口显示,如果是FULLSCREEN则表示全屏显示;32代表色深32位 #设置窗口标题 pygame.display.set_caption("贪吃蛇大作战!") while True: #此处为主循环,类似之前命令行贪吃蛇代码中的循环,此处一个循环可看作一帧 for event in pygame.event.get(): #等待获取外部事件,读取外部事件的队列 if event.type == QUIT: #判断外部事件类别,即判断用户的操作类型 exit() #执行事件的对应操作,退出程序 #pygame.quit() #关闭窗体,但程序仍在运行;在下个while循环由于窗体关闭,因事件无法获取故会出现报错 screen.fill(BACKBROUNDFILL) #设置窗体的背景填充色 pygame.display.update() #刷新Surface对象到窗体中(不可缺少)
之前窗体填充色都是默认黑色,我加了screen.fill()语句修改了窗体颜色,看着舒服多了
窗体创建好了,接下来介绍事件应对机制。pygame有一个事件应对的体系,用于玩家与GUI进行友好交互,比如之前关闭窗体的事件应对案例。
玩家控制贪吃蛇的方式正常只有“上下左右”四个动作(此处用键盘控制,也可以用鼠标等控制方向),接下来列举一个键盘控制Surface对象的应对机制。
1 import pygame #导入pygame模块 2 from pygame.locals import * #导入pygame模块中常用的函数和常量,如表示全屏的FULLSCREEN常量 3 from sys import exit #导入sys模块中的exit()方法,用于退出程序 4 5 #设置常量 6 BACKBROUNDFILL = (255,245,238) #窗体背景填充RGB 7 TESTPICTURE = 'snowman.png' #选取Surface素材(此处使用雪人图片) 8 9 #初始化pygame组件 10 pygame.init() 11 12 #创建一个窗口对象 13 screen = pygame.display.set_mode((640,480),0,32) 14 #元组(640,480)代表640X480的分辨率;0表示窗口显示,如果是FULLSCREEN则表示全屏显示;32代表色深32位 15 16 #设置窗口标题 17 pygame.display.set_caption("贪吃蛇大作战!") 18 19 #素材转化为pygame识别的surface对象 20 testsurface = pygame.image.load(TESTPICTURE) 21 22 #设定雪人在窗体中的初始位置 23 x,y = 0,0 #将窗体看作坐标轴,窗体左上顶点为坐标轴原点 24 25 #此处为主循环,类似之前命令行贪吃蛇代码中的循环,此处一个循环可看作一帧 26 while True: 27 28 29 for event in pygame.event.get(): #等待获取外部事件,读取外部事件的队列 30 if event.type == QUIT: #判断外部事件类别,即判断用户的操作类型 31 exit() #执行事件的对应操作,退出程序 32 #pygame.quit() #关闭窗体,但程序仍在运行;在下个while循环由于窗体关闭,因事件无法获取故会出现报错 33 34 pressed_keys = pygame.key.get_pressed() #获取键盘相关事件的返回信息;返回的是一个元组如(K_UP,TRUE) 35 36 if pressed_keys[K_LEFT]: #if结构判断键盘“上下左右”哪个按键被按下,执行相应操作 37 x -= 1 38 elif pressed_keys[K_RIGHT]: 39 x += 1 40 if pressed_keys[K_UP]: 41 y -= 1 42 elif pressed_keys[K_DOWN]: 43 y += 1 44 45 screen.fill(BACKBROUNDFILL) #设置窗体的背景填充色 46 47 screen.blit(testsurface,(x,y)) #在screen窗体对象中添加一个testsurface代表的雪人对象,添加的坐标为(x,y) 48 49 pygame.display.update() #刷新Surface对象到窗体中(不可缺少)
上面的代码是将雪人对象添加到窗体对象中,并在whlie循环中不断监听键盘的“上下左右”按键是否被按下,最后根据监听的结果改变雪人对象的坐标,在下次刷新时变化雪人在窗体中的位置。
注:45行代码与47行代码的次序不能对调,否则在运行程序时窗体中不会有雪人出现;这是因为如果次序对调,执行screen.fill()语句时会将之前的雪人对象“覆盖”。
来看看代码运行的效果:
键盘“左键”按一下,“右键”按一下看看效果:
Bingo!玩家与贪吃蛇游戏的“互动平台”已经搭建好了,接下来可以进入正题了。下篇博客将开始创建贪吃蛇、食物和草地对象。