python⾼效读取mp3_少⼉Python编程_第⼗五讲:图像和声⾳上⼀讲学习了Python游戏开发的简单⽅法,并在练习中下载和阅读了⼏个⼩游戏的源代码。本讲将⾃⼰动⼿制作游戏,练习编写50⾏左右的⽐较复杂的程序,在此过程中将继续学习图形图像相关知识、播放声⾳,以及运⽤前⾯学习的各种数据类型、函数等技术。
15.1 图形图像
15.1.1 原理
早期的计算机和⼿机都⽤按键输⼊,屏幕只能显⽰⽂字。后来随着软硬件升级,逐步出现彩⾊显⽰器,以窗⼝界⾯为主,使⽤⿏标和触摸屏操作的计算机和⼿机系统。
现在在屏幕上看到的所有显⽰都是以图⽚⽅式“绘制”出来的。之前讲过软件分为系统软件和应⽤软件,系统软件的⼀部分⼯作是管理当前开启的应⽤程序(应⽤软件),并将各个软件的输出“绘制”在屏幕上。因此作为普通开发者,只需要考虑应⽤软件的输出即可。
上⼀讲在窗⼝中绘制图形:窗⼝是开发者在程序内定义的⼀个固定⼤⼩的区域,绘图位置通过坐标(x,y)指定。
屏幕上显⽰的画⾯⼜分为图形和图像两种,之前学习的绘制矩形、圆形,以及显⽰⽂字都属于“图形”,
另⼀种是图像,它可能是拍摄的照⽚或者⽤画图软件绘制的卡通⼈物或风景,在Python程序中从⽂件读出,并将其内容绘制到某⼀区域,叫做绘制图像。
15.1.2 图像格式
顺序表和链表的优缺点从绘图的⾓度看,图像分为两种:带有透明度通道的图⽚和不带有透明度通道的图⽚。
图15.1 图⽚透明通道⽰意图
如图15.1所⽰,将两张卡通⽺图⽚绘制在背景图上,左侧不带透明通道,因此将其⽩⾊背景也贴了出来,右侧带透明通道,并其将卡通⽺的背景置为透明,贴图后的效果更加⾃然。⼀般情况下,在绘制背景图⽚,以及后⾯不需要透出其它图⽚时,使⽤不带透明通道的图⽚即可。⽽绘制前景图⽚,⽐如
游戏中需要移动变化的卡通⼈物,则使⽤带透明通道图⽚。
图像⼀般存储在图⽚⽂件中,通过不同的扩展名区分不同的格式,最常见的图⽚格式有bmp、jpg和png。bmp是早期的图像存储格式,它直接把图⽚中每个像素的颜⾊存储在图⽚⽂件中,占空间较⼤;jpg是最常⽤的图⽚存储格式,它⽤压缩算法将图⽚内容压缩后存储,占存储空间较⼩,有时也会损失⼀些图⽚的质量,在保存图⽚时可以设置压缩⽐例,以便在图⽚的⼤⼩和精度之间达到平衡;png采⽤⽆损压缩格式,存储的是带透明通道的图⽚。
15.1.3 获取图像
图形界⾯或多或少⽤到图像,⽐如:⽹站的Logo(商标)、软件的欢迎界⾯、⼩图标等,游戏为了提升视觉效果会⽤到更多的图像。
图15.2 下载⽹络图⽚
从⽹络上下载的图⽚多数是jpg格式,如果需要透明通道,则要使⽤绘图软件修改,或者在搜索时指定png格式。
下载⽹络图⽚简单快捷,但会涉及图⽚的版权问题,如果仅⽤于学习和实验,问题不⼤。也可以⾃⼰⽤电脑绘制图⽚,如使⽤Windows⾃带的绘图⼯具:开始->所有程序->附件->画图,绘图后保存成图⽚⽂件即可在程序中使⽤。另外,也可以把⼿机中的照⽚⽂件通过传到电脑上使⽤。常⽤的绘图⼯具还有⽤于修图的PhotoShop,和⽤于绘图的Illustrator等等。
15.1.4 Python绘图
任何编程语⾔,操作图⽚⼀般都需要三步:读取图⽚⽂件、调整图⽚、显⽰图⽚。本例使⽤游戏开发库pygame操作图⽚:
app商城第⼀步,使⽤pygame.image.load()函数读取图⽚,它⽀持主流的图⽚格式,读取⽂件后将其转换成pygame的内部图⽚存储格式。
第⼆步,使⽤ansform.scale()函数将图⽚缩放到指定⼤⼩。
第三步,使⽤画布提供的screen.blit()函数将图⽚按指定的位置显⽰在画布(绘图窗⼝)上。
01 import pygame
02
03 WIDTH = 640
04 HEIGHT = 480
05
06 pygame.init()
07 screen = pygame.display.set_mode((WIDTH, HEIGHT))
08
09 back_img = pygame.image.load('bg.jpg')
10 background = ansform.scale(back_img, (WIDTH, HEIGHT))
11
12 running = True
13 while running:
14 for event in ():
15 pe == pygame.QUIT:
16 running = False
17 screen.blit(background, (0, 0))
18 pygame.display.update()
19
20 pygame.quit()
第01-07⾏引⼊pygame游戏开发模块,初始化,并创建⼀个宽为640,⾼为480的窗⼝。(详见上⼀讲)
第09⾏加载当前⽬录下的图⽚⽂件bg.jpg。
少儿python入门教程第10⾏将图⽚缩放成与窗⼝同样的⼤⼩。
第12⾏设置变量running,⽤于控制程序主循环。
第13⾏⽤while实现程序主循环,当running为True时循环显⽰,否则退出。
第14-16⾏接收⽤户操作,当⽤户关闭窗⼝时将running设为False,退出主循环。
第17⾏⽤blit⽅法将背景图⽚显⽰在窗⼝之中(类似于将图像区域复制粘贴到显⽰区域),显⽰位置为(0,0)。
第18⾏更新显⽰,将内存中的数据显⽰在屏幕上。
第20⾏释放pygame资源。
15.2 播放声⾳
背景⾳乐和⾳效也是游戏重要的组成部分,本节介绍播放背景⾳乐和播放普通⾳效的⽅法。
15.2.1 ⾳频格式
与图像⼀样,声⾳数据也存储在⾳频⽂件中,常见的声⾳⽂件有两种格式,常⽤的扩展名有wav、ogg和mp3。wav也叫波形声⾳⽂件,是早期的数字⾳频格式,占空间较⼤,不适合较长时间的声⾳存储,常⽤于存储长短为⼏秒钟的⾳效,例如“叮”的⼀声响,⽽mp3是⽬前⽐较常⽤的声⾳⽂件存储格式,它使⽤压缩算法,对⾳频有⼀定损失,但相应数据量也较⼩,便于存储和传输。
15.2.2 获取声⾳⽂件
声⾳⽂件也可以从⽹络下载,或者⾃⼰录制。Windows系统中也有很多⾃带的⾳效⽂件,在计算机中搜索扩展名为“.wav”的⽂件即可查⾳效⽂件,使⽤时可将其复制到程序能访问的位置。搜索⽅法如图15.3所⽰:
15.3 查⾳效⽂件
15.2.3 Python播放声⾳
1. 播放背景⾳乐
播放声⾳⽂件,⾸先需要初始化声⾳模块,然后加载要播放的声⾳⽂件,最后是播放声⾳,本例中同样使⽤pygame游戏开发模块中提供的mixer混⾳⼦模块实现播放背景⾳乐。
使⽤pygame.mixer.init()初始化声⾳相关模块。
使⽤pygame.mixer.music.load()加载常见格式的声⾳⽂件。
使⽤pygame.mixer.music.play()播放声⾳。
使⽤pygame.mixer.music.set_volume()调节⾳量。
程序导⼊模块和主循环与前⼀例程相同,此处不再重复。在主循环之前加⼊以下代码即可循环播放当前⽬录下的背景⾳乐back.mp3⽂件。
01 pygame.mixer.init()
02 back_music = pygame.mixer.music.load('back.mp3')
03 pygame.mixer.music.set_volume(0.5)
04 pygame.mixer.music.play(loops=-1)
第01⾏初始化声⾳相关模块。
第02⾏加载当前⽬录下的声⾳⽂件back.mp3,运⾏程序前请先将要播放的⽂件复制到当前⽬录下。
第03⾏设置⾳量为最⼤⾳量的50%,以防⽌背景⾳乐声⾳过⼤。
第04⾏播放已加载的⾳乐,并使⽤loops参数设置播放次数,设置为-1时声⾳循环播放。
2. 播放其它⾳效
除了背景⾳乐之外,有时还需要根据⽤户的操作或者游戏需要偶尔播放⼀些⾳效⽂件,⽅法如下:
01 dound = pygame.mixer.Sound('warning.wav')
02 dound.play()
第01⾏⽤于加载⾳效⽂件。
第02⾏⽤于播放⾳效,默认为播放⼀次。
需要注意的是:以Sound⽅式加载的⾳效⽂件有⼀定的格式要求,只能播放简单格式的wav和ogg⽂件,当格式不符合要求时,程序将报错“Unable to open file”。另外需要注意的是在播放完⾳效后不能马上结束程序,否则将听不到声⾳的播放效果。
15.3 综合实例
本节将通过游戏“愤怒的⼩鸟”,学习游戏常⽤的程序技术,⾸先使⽤git下载源码(git使⽤⽅法详见前⼀讲)。
transport翻译成中文在git bash中输⼊以下命令下载“愤怒的⼩鸟”项⽬:
$ git clone www.github/estevaofon/angry-birds-python angry-birds-python
该程序还依赖三⽅模块pymunk,在Anaconda Prompt中,⽤以下命令安装:
$ pip3 install pymunk
windbg教程进⼊下载后的angry-birds-python⽬录,可以看到程序包的具体内容,如图15.4所⽰:
图15.4 愤怒的⼩鸟项⽬
其中src为source code的缩写,意思是源代码;resources译为资源,其中包括游戏⽤到的图⽚和⾳效⽂件,有时也简写为res;README.md是说明⽂件,⽤Windows记事本打开该⽂件,可以看到其中介绍了该软件依赖的三⽅模块,以及运⾏该程序的⽅法;LICENSE是软件的版本信息。请读者⾃⾏进⼊每个⽬录,通过⽂件名和⽂件扩展名了解它们的⽤途。
之前讲解的例程中,为了⽅便调⽤,资源⽂件、代码⽂件以及说明⽂件常存储在同⼀个⽬录下⾯,⽽当程序中有多个代码⽂件和资源⽂件时,⽬录内容将变得⾮常混乱,建议读者在之后的项⽬中利⽤⽬录更好地分类和管理⽂件。
从Readme.md⽂件中可以看到,程序的⼊⼝(主要程序)是main.py,绝⼤多数项⽬的主程序名都为
main.py,这也是约定俗成的命名习惯。请读者在Spyder或者Jupyter中打开main.py,并运⾏该游戏,了解“愤怒的⼩鸟”的游戏规则。
请读者在main.py中到主循环、⽤户事件处理、以及绘图的相应代码,上⼀讲学习了对键盘事件的处理,本讲请读者⾃学对⿏标事件的处理(提⽰:⿏标关键字“MOUSE”)。
通过玩游戏可以了解:本游戏除了包含图⽚和声⾳之外,主要的难点在于物体的碰撞效果,碰撞效果使⽤pymunk三⽅库实现。它是⼀个物理计算引擎,很多游戏的运动效果都借助该库实现。
课后练习:(练习答案见本讲最后的⼩结部分)
课后练习:
练习⼀:实现简单版愤怒的⼩鸟,具体要求如下:
1. 游戏⽬标:接收⽤户⿏标事件,根据⿏标按下时长决定投掷⼩鸟的远近。当⼩鸟打中猪时,游戏结束。
2. 前景和背景⽤图⽚显⽰,⾄少两个前景物体:⼩鸟和猪。
3. 带背景⾳乐和⽤户操作⾳效,⽤户点击⿏标时播放⾳效。
4. 提⽰:参考以下代码06-09⾏计算抛物线的轨迹:
01 import math as m # 引⼊数学函数库
02 import matplotlib.pyplot as plt
03 %matplotlib inline
linux编程的基本过程04
05 # v是⼒度取值(100-1000), a是⾓度取值(0.1-2), width为窗⼝宽度
06 def calc(a,v,width):
07 arr = [m.floor(0.5+x*m.tan(a)-x*x/(s(a))) for x in range(width)]
08 arr = [i for i in arr if i >= 0]
09 return arr
10
11 arr = calc(1.3,800,640)
12 plt.plot(arr)
13 arr = calc(0.5,800,640)
14 plt.plot(arr)
程序运⾏结果如图15.5所⽰:
图15.5 抛物线图
本讲内容不多,但是练习的难度较⼤,对于完全没有编程经验的读者,是⼀个巨⼤的考验。编写程序
的最终⽬标是实现完整功能,⽽不是照猫画虎地做秀,增加难度也是必经的过程。
15.4 思维训练
15.4.1 解决复杂问题
本讲中的习题,不像之前的练习,照猫画虎就能完成,需要把学到的知识打散,再组合。⼩李同学在放假时做了四遍:第⼀天两遍、第⼆天⼀遍、第三天⼀遍,每做⼀遍之后,把源码删掉,再重新写。
⼀开始做的时候问题不断,以她三年级的英语⽔平,报错基本都看不懂。在常量、变量、坐标系、列表、表达式,判断和循环的缩进中,暴露出了很多前期学得不扎实的知识点。但随着不断地重复,提出的问题也越来越少。
最后她说她都把这五⼗多⾏代码背下来了,让她背了⼀遍,流程基本都对。有点像多年前流⾏背《新概念》英语中的例⽂。
下⾯分享⼀下解题思路:
第⼀步:拆分问题——把⼀个⼤问题拆分成⼏个⼩问题。
⼩李把问题分解为:1接收⿏标事件、2打到猪退出程序、3显⽰图像、4点⿏标播放⾳效、5根据⿏标时长确定⼩鸟的飞⾏距离。在这⼀步,⼩朋友切分的粒度不够完美,⽐如应该把⼩鸟按抛物线运动单列出来。但框架基本正确。
第⼆步:确定依赖关系,排列解决“⼩问题”的顺序。
由于问题之间存在前后的依赖关系,同时还需要考虑难易程度,顺序排列为:3->4->1->5->2。
第三步:按步骤解决“⼩问题”。
新⼿程序员常犯的错误是:把所有想到的功能都加上,然后再开始调试。可⼀旦遇到问题,就很难定位问题出在哪⼉。建议每做完⼀步,调试通过后再做下⼀步。
对⼩朋友来说,每解决⼀个⼩问题,都是⼀次⼩⼩的成功,这个过程也是不断地肯定⾃⼰的过程。在最后⼀遍练习中,她开始⼤量使⽤print语句打印状态信息。基本跳出了瞎蒙的状态。
15.4.2 统筹规划
统筹规划是运⽤统筹兼顾的基本思想,对错综复杂、种类繁多的⼯作进⾏统⼀筹划,合理安排的⽅法。对于解决复杂的问题尤为重要。1.层进式优化
在刚开始学习画画时,⽼师要求,先确定构图,然后画线稿;铺调⼦;再⼀遍⼀遍逐渐深⼊印画。
图15.6 层进优化
这种⽅法在软件⼯程中叫作螺旋模型,它不追求⼀次到位,⽽是把整个过程从时间分为多个阶段,每个阶段都包含:计划、执⾏、检查。它有以下优点:
如果⼯程中断,也保留了阶段性的成果,基本可⽤。
当遇到⼀些关键错误,能及时发现和调整。
时间规划合理,不会为⼀些细节的不完美影响⼤局。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论