资源简介 (共46张PPT)Python少儿编程第十章 玩游戏不如自己开发游戏目录1.1Python的游戏开发装备1.2Pygame大显身手PART 01Python的游戏开发装备Pygame简介1.1Pygame是一个用于开发游戏的Python模块,它是在SDL库的基础上开发的。通过Pygame,用户可以开发功能丰富的游戏和多媒体程序。此外,Pygame是一个可移植性很高的模块,可支持多个操作系统,非常适合小游戏的开发。Pygame是一个由一系列模块组成的集合包,不同的模块可以实现游戏中不同的功能, Pygame所有模块列表如表10-1所示。表10-1 Pygame所有模块列表Pygame简介1.1表10-1 Pygame所有模块列表(续)Pygame第三方库安装1.1步骤 1 启动PyCharm,新建“第10章”项目,然后在菜单栏中选择“文件”→“设置”选项,如图10-1所示。图10-1 设置项目Pygame第三方库安装1.1步骤 2 打开“设置”对话框,选择“项目:第10章”→“Python解释器”选项,然后在显示的列表框上方单击“+”按钮,如图10-2所示。图10-2 选择安装项目Pygame第三方库安装1.1步骤 3 打开“可用包”对话框,在搜索栏中输入“pygame”,然后在显示的列表中选择“pygame”选项,单击“安装包”按钮,如图10-3所示。步骤 4 等待安装,安装成功后,“可用包”对话框中将显示“已成功安装包‘pygame’”,如图10-4所示。图10-3 选择安装库 图10-4 成功安装Pygame第三方库安装1.1步骤 5 关闭“可用包”对话框,返回“设置”对话框,在已安装库列表中可看到“pygame”,单击“确定”按钮即可完成安装,如图10-5所示。图10-5 完成安装PART 02Pygame大显身手创建窗口2.1所有游戏都在一个固定的窗口(或屏幕)进行操作,故开发游戏的第一步就是创建窗口。pygame.display模块提供了set_mode()方法用于初始化一个窗口,其方法原型如下。set_mode(resolution=(0,0)[, flags=0, depth=0])其中,resolution是一个二元组,表示宽和高,单位为像素;flags用于指定扩展选项,可同时指定多个选项(使用“|”操作符隔开),具体选项如表10-2所示;depth表示颜色深度,如果缺省,系统会自动选择一个最优值。该方法返回一个Surface对象(即Pygame用来表示图像的对象)。创建窗口2.1表10-2 flags可用的选项创建窗口2.1pygame.image模块提供了load()方法用于加载图片,其方法原型如下。load(filename)其中,filename为加载的图片的名称(可包含路径)。该方法返回一个Surface对象。图片加载完成后,并不是显示在窗口中,而是转换成一个Surface对象,想要将其在窗口上显示,须使用pygame.surface模块中的blit()方法将一个图像绘制到另一个图像上,其方法原型如下。blit(source, dest[, area=None, special_flags = 0])其中,source为Surface对象(即显示的图片);dest为坐标值,一般为source的左上角坐标;area为图片绘制的区域;special_flags用于指定混合模式。加载图片2.2pygame.image模块提供了load()方法用于加载图片,其方法原型如下。load(filename)其中,filename为加载的图片的名称(可包含路径)。该方法返回一个Surface对象。图片加载完成后,并不是显示在窗口中,而是转换成一个Surface对象,想要将其在窗口上显示,须使用pygame.surface模块中的blit()方法将一个图像绘制到另一个图像上,其方法原型如下。blit(source, dest[, area=None, special_flags = 0])其中,source为Surface对象(即显示的图片);dest为坐标值,一般为source的左上角坐标;area为图片绘制的区域;special_flags用于指定混合模式。加载图片2.2【例10-1】 创建一个窗口,并加载一张图片作为背景。【问题分析】 首先,使用import语句导入所需模块(如pygame、sys);接着,初始化pygame;然后,创建窗口、设置窗口标题、加载背景图片、绘制图形及刷新绘图;最后,程序进入无限循环,判断是否获取退出事件,如果是,则退出程序。【参考代码】import pygame, sys #导入模块pygame.init() #初始化pygamescreen = pygame.display.set_mode((400, 200)) #设置窗口大小pygame.display.set_caption('贪吃蛇') #设置窗口标题加载图片2.2【参考代码】(续)#加载背景图片background = pygame.image.load('images\\贪吃蛇.jpg')screen.blit(background, (0, 0)) #将背景绘制到窗口的(0,0)位置pygame.display.update() #刷新绘图while True: #循环for event in pygame.event.get(): #获取事件并遍历if event.type == pygame.QUIT: #如果为退出事件pygame.quit() #退出pygamesys.exit() #退出系统加载图片2.2【运行结果】 程序运行结果如图10-6所示。图10-6 例10-1程序运行结果绘制图形2.3pygame.draw模块中常用的方法如表10-3所示。表10-3 pygame.draw模块中常用的方法绘制图形2.3表10-3 pygame.draw模块中常用的方法(续)绘制图形2.3【例10-2】 绘制多种图形。【参考代码】#导入模块和常量import pygame, sysfrom math import pipygame.init() #初始化pygamescreen = pygame.display.set_mode((520, 250)) #设置窗口大小pygame.display.set_caption('绘制图形') #设置窗口标题#定义颜色BLACK = (0, 0, 0)WHITE = (255, 255, 255)RED = (255, 0, 0)绘制图形2.3【参考代码】(续)GREEN = (0, 255, 0)BLUE = (0, 0, 255)screen.fill(WHITE) #设置背景颜色#绘制一条线pygame.draw.line(screen, RED, [10, 10], [50, 10], 2)#绘制一条抗锯齿的线pygame.draw.aaline(screen, GREEN, [10, 50], [50, 50], True)#绘制一条折线pygame.draw.lines(screen,BLACK,False,[[75,10],[125,10],[125,50]],5)#绘制一条闭环折线pygame.draw.lines(screen,BLACK,True,[[150,10],[200,10],[200,50]],5)#绘制一个矩形框绘制图形2.3【参考代码】(续)pygame.draw.rect(screen, BLUE, [225, 10, 50, 40], 2)#绘制一个矩形pygame.draw.rect(screen, BLUE, [300, 10, 50, 40])#绘制一个椭圆框pygame.draw.ellipse(screen, RED, [375, 10, 50, 40], 2)#绘制一个椭圆pygame.draw.ellipse(screen, RED, [450, 10, 50, 40])#绘制多边形(三角形)pygame.draw.polygon(screen,BLACK,[[10,200],[120,100],[150,200]],5)绘制图形2.3【参考代码】(续)#绘制多条弧线pygame.draw.arc(screen, BLACK, [200, 90, 150, 125],0,pi/2,2)pygame.draw.arc(screen, GREEN, [200, 90, 150, 125],pi/2,pi,2)pygame.draw.arc(screen, BLUE, [200, 90, 150, 125],pi,3*pi/2,2)pygame.draw.arc(screen, RED, [200, 90, 150, 125],3*pi/2,2*pi,2)#绘制一个圆pygame.draw.circle(screen, BLUE, [450, 150], 60, 2)#刷新绘图pygame.display.update()while True: #循环for event in pygame.event.get(): #获取事件并遍历if event.type == pygame.QUIT: #如果为退出事件pygame.quit() #退出pygamesys.exit() #退出系统绘制图形2.3【运行结果】 程序运行结果如图10-7所示。图10-7 例10-2程序运行结果设置动画效果2.4物体移动的原理很简单,即在原有坐标的基础上增加偏移量,再重新绘制图片,依次一张一张地循环绘制下去,就可以得到物体移动的效果。此外,需要考虑两个画面之间的时间间隔,即经过多长时间绘制下一张图片。pygame.time模块提供了一个Clock对象,使用其tick()方法可解决上述问题。(1)通过pygame.time.Clock()方法创建对象获得pygame的时钟。(2)使用pygame.time.Clock.tick(FPS)方法设置pygame时钟的时间间隔。设置动画效果2.4【例10-3】 设置动画效果示例。【参考代码】import pygame, sys #导入模块pygame.init() #初始化pygameFPS = 30 #设置帧率fpsClock = pygame.time.Clock() #创建时钟对象screen = pygame.display.set_mode((500, 400)) #设置窗口大小pygame.display.set_caption('动画') #设置窗口标题WHITE = (255, 255, 255) #定义颜色img = pygame.image.load('images\\球.png') #加载图片imgx, imgy = 10, 10 #初始化图片的位置direction = 'right' #初始化图片的移动方向设置动画效果2.4【参考代码】(续)while True: #循环screen.fill(WHITE) #背景填充为白色if direction == 'right': #如果图片向右移动imgx += 5 #图片x坐标加5if imgx == 420: #如果图片x坐标等于420direction = 'down' #设置方向为向下elif direction == 'down': #如果图片向下移动imgy += 5 #图片y坐标加5if imgy == 320: #如果图片y坐标等于320direction = 'left' #设置方向为向左elif direction == 'left': #如果图片向左移动imgx -= 5 #图片x坐标减5if imgx == 0: #如果图片x坐标等于0direction = 'up' #设置方向为向上设置动画效果2.4【参考代码】(续)elif direction == 'up': #如果图片向上移动imgy -= 5 #图片y坐标减5if imgy == 0: #如果图片y坐标等于0direction = 'right' #设置方向为向右screen.blit(img, (imgx, imgy)) #绘制图片for event in pygame.event.get(): #获取事件并遍历if event.type == pygame.QUIT: #如果为退出事件pygame.quit() #退出pygamesys.exit() #退出系统pygame.display.update() #刷新绘图fpsClock.tick(FPS) #设置时钟的时间间隔设置动画效果2.4【运行结果】 运行程序,可以看到小球自左往右、自上往下、自右往左、自下往上循环移动,部分显示结果如图10-8所示。图10-8 例10-3程序运行结果播放声音2.5播放音效使用pygame.mixer模块,须首先创建一个Sound对象,其语法格式如下。Sound(filename)其中,filename为音频文件名(可包含路径)。创建Sound对象后,可使用play()方法播放音效。Sound对象的常用方法如表10-4所示。表10-4 Sound对象的常用方法播放声音2.5播放背景音乐使用pygame.music模块,它是pygame.mixer模块的一个特殊实现,使用时须通过pygame.mixer.music调用其方法。pygame.music模块的常用方法如表10-5所示。表10-5 pygame.music模块的常用方法播放声音2.5【例10-4】 播放声音示例。【参考代码】import pygame, sys #导入模块pygame.init() #初始化pygamescreen = pygame.display.set_mode((400, 300)) #设置窗口大小pygame.display.set_caption('播放声音') #设置窗口标题background = pygame.image.load('images\\烟花.jpg') #加载背景图片screen.blit(background, (0, 0)) #绘制背景sound = pygame.mixer.Sound('sounds\\燃放烟花.wav') #创建音效对象pygame.display.update() #刷新绘图播放声音2.5【参考代码】(续)#加载背景音乐文件pygame.mixer.music.load('sounds\\新年好.mp3')#播放背景音乐,第一个参数为播放的次数(-1表示无限循环),第二个参数是设置播放的起点(单位为秒)pygame.mixer.music.play(-1, 0.0)while True: #循环sound.play() #播放音效for event in pygame.event.get(): #获取事件并遍历if event.type == pygame.QUIT: #如果为退出事件pygame.mixer.music.stop() #停止播放背景音乐pygame.quit() #退出pygamesys.exit() #退出系统播放声音2.5【运行结果】 运行程序,出现主界面(见图10-9),然后直接播放音效和背景音乐。图10-9 例10-4程序运行结果显示文字2.6如果想要将文字显示到屏幕上,须首先使用pygame.font模块中的Font()方法创建一个Font对象,其语法格式如下。Font(filename, size)其中,filename为字体文件名称(一般为“.ttf”格式);size为字体的大小,单位为像素。创建Font对象后,须使用render()方法返回一个Surface对象绘制文本,其语法格式如下。render(text, antialias, color[, background=None])其中,text为要显示的文字;antialias是个布尔值,表示是否开启抗锯齿,当为True时字体比较平滑;color为文字颜色;background为背景颜色。最后还须使用blit()方法显示文字。显示文字2.6【例10-5】 显示文字示例。【参考代码】import pygame, sys #导入模块pygame.init() #初始化pygamescreen = pygame.display.set_mode((260, 100)) #设置窗口大小pygame.display.set_caption('显示文字') #设置窗口标题#定义颜色WHITE = (255, 255, 255)RED = (255, 0, 0)GREEN = (0, 255, 0)#创建字体对象font = pygame.font.Font('fonts\\simkai.ttf', 30)显示文字2.6【参考代码】(续)#设置显示的文字,创建文字对象textSurface = font.render('恭喜你,你赢了!', True, GREEN, RED)screen.fill(WHITE) #背景填充为白色textRect = textSurface.get_rect() #获取文字对象的recttextRect.center = (130, 50) #设置文字对象的中心坐标screen.blit(textSurface, textRect) #绘制文字pygame.display.update() #刷新绘图while True: #循环for event in pygame.event.get(): #获取事件并遍历if event.type == pygame.QUIT: #如果为退出事件pygame.quit() #退出pygamesys.exit() #退出系统显示文字2.6【运行结果】 运行程序,窗口中显示绿色的“恭喜你,你赢了!”文字,其背景色为红色,如图10-10所示。图10-10 例10-5程序运行结果事件处理2.7Pygame会接收用户各种操作(如按下或释放按键、移动鼠标、按下或释放鼠标等)产生的事件。事件随时可能发生,Pygame将一系列事件存放在一个事件队列里,然后通过for循环取出每一个事件与产生的事件进行比较,如果相等则处理产生的事件。一般可使用pygame.event模块中的get()方法来获取所有事件,Pygame中常用的事件如表10-6所示。事件处理2.7表10-6 Pygame中常用的事件事件处理2.7【例10-6】 事件处理示例。【参考代码】import pygame, sys #导入模块pygame.init() #初始化pygamescreen = pygame.display.set_mode((400, 300)) #设置窗口大小pygame.display.set_caption('事件处理') #设置窗口标题image = pygame.image.load('images\\蝴蝶.png') #加载图片WHITE = (255, 255, 255) #定义颜色x, y = 200, 150 #初始化图片位置事件处理2.7【参考代码】(续)while True: #循环for event in pygame.event.get(): #获取事件并遍历#如果移动鼠标,获得鼠标当前位置if event.type == pygame.MOUSEMOTION:x = event.pos[0]y = event.pos[1]#如果按下鼠标,输出鼠标按下位置if event.type == pygame.MOUSEBUTTONDOWN:print('按下鼠标:', event.pos)#如果释放鼠标,输出鼠标释放的位置if event.type == pygame.MOUSEBUTTONUP:print('释放鼠标:', event.pos)事件处理2.7【参考代码】(续)#如果按下按键if event.type == pygame.KEYDOWN:#如果按键为方向键,输出对应的方向if event.key == pygame.K_UP:print('上')if event.key == pygame.K_DOWN:print('下')if event.key == pygame.K_LEFT:print('左')if event.key == pygame.K_RIGHT:print('右')事件处理2.7【参考代码】(续)#如果按键为Esc键if event.key == pygame.K_ESCAPE:pygame.quit() #退出pygamesys.exit() #退出系统screen.fill(WHITE) #背景填充为白色screen.blit(image, (x, y)) #绘制图片pygame.display.update() #刷新绘图事件处理2.7【运行结果】 运行程序,出现加载图片的窗口,当鼠标在窗口上移动时,图片随着鼠标移动,如图10-11所示。单击窗口上的任意位置,输出鼠标按下和释放时的坐标;按下“上”“下”“左”“右”方向键,输出相应的“上”“下”“左”“右”信息;按下“Esc”键,退出程序,如图10-12所示。图10-11 窗口界面 图10-12 输出信息感谢观看 展开更多...... 收起↑ 资源预览