这是一篇由教程团队成员Julian Meyer发表的文章,一个12岁的python开发人员。你能够在Google+和Twitter上找到他。html
你可曾想过如何建立视频游戏吗?它不像你想象的那么复杂!python
在本教程中,您将建立一个简单的游戏叫作兔子和獾,在这里做为英雄的兔子要保卫城堡反击进攻的獾群。:O编程
写这个游戏,你将使用Python。不,我指的并非一条大蛇!:]数组
Python是一种计算机编程语言。咱们就本教程选择Python,Python是一种易于上手、有趣并且很容易学的语言。app
若是你刚接触Python,开始以前先检出这本书 - 深刻Python:怎样像计算机科学家同样思考,这将使你提高速度。dom
而后回到这里,准备开始—— 有一场小兔子和獾之间的战争即将发生。继续阅读将加入战争吧!编程语言
若是你想在Windows电脑上尝试本教程,你须要安装Python,记住要安装2.7.3版本而不是3.3.0!运行完安装程序后,在开始菜单程序文件夹中会有IDLE,运行IDL。编辑器
若是你使用Mac,Python已经安装了!只需打开一个终端(/Applications/Utilities/Terminal.app),输入python而后按回车。ide
注意:若是你从python.org安装Python(若是你想得到PyGame须要这样作),那么你也须要在Mac上进入IDLE。它应该在“Applications/Python 2.7”文件夹内。函数
若是操做正确的话,你将会看到相似输出:
1
2
3
4
|
Python
2.7
.
3
(v2.
7.3
:
70274d53c1dd
, Apr
9
2012
,
20
:
52
:
43
)
[GCC
4.2
.
1
(Apple Inc. build
5666
) (dot
3
)] on darwin
Type
"help"
,
"copyright"
,
"credits"
or
"license"
for
more information.
>>>
|
注意:若是你想退出Python提示窗(三个尖括号提示:>>>),你能够经过在提示窗里输入exit()或按Ctrl+D。
一旦你在Python提示窗了,测试Python是否正常工做的话输入print 1+1,而后按回车或换行,它将输出2。你已经写了你的第一个Python程序。
如今你知道Python工做正常,为使用Python写游戏你须要安装PyGame。
PyGame是一个使写游戏变简单的Python库,它提供如图像处理、声音回放等你能够很容易添加都游戏中的功能。
到这来下载你系统适合的PyGame,确认你下载的是一个Python2.7版本。
注意:从上面连接下载的PyGame安装文件不能与Apple的Mac上默认安装的Python一块儿工做,为使用PyGame你须要从python.org上下载安装Python,或者你能够经过MacPorts安装Python和PyGame。
要检验PyGame安装是否正确的话,打开IDLE或经过终端运行Python,在Python提示符处输入import pygames,若是回车后没有输出的话你安装成功了。
若是,另外一方面,输出了下附相似错误,PyGame没有正确安装。
1
2
3
4
5
6
7
8
|
Python
2.7
.
2
(default, Jun
20
2012
,
16
:
23
:
33
)
[GCC
4.2
.
1
Compatible Apple Clang
4.0
(tags
/
Apple
/
clang
-
418.0
.
60
)] on darwin
Type
"help"
,
"copyright"
,
"credits"
or
"license"
for
more information.
>>>
import
pygame
Traceback (most recent call last):
File
"<stdin>"
, line
1
,
in
<module>
ImportError: No module named pygame
>>>
|
若是你遇到相似的错误,在论坛上发出来我将帮助你让它正常。
虽然你能够在Python提示符下运行短的Python代码,但若是你工做在一个大的程序(好比游戏)里,你可能想要将你的代码保存到一个文件,这样你就没必要一遍又一遍地键入它了。
有几种方法能够运行Python程序文件。一种方法是使用一个纯文本编辑器,不如记事本(Windows)或TextEdit(Mac)。打开一个新的文本文件,输入你的Python代码(像print 1 + 1)。而后保存它为asXXX.py(XXX能够是任何描述性的文件名称)。
使用Windows的话,经过双击这个文件来运行它。在Mac上,打开终端,输入python,而后拖动你保存的文件到终端窗口并按Enter。
另外一种方法是键入代码类到IDLE,也就是你在这个教程中须要作的方式。运行IDLE - 只需在终端输入IDLE。 而后选择文,而后选择File\New Window,会出现一个你能够输入代码的文本编辑器窗口。你能够经过File\Save保存你更改的代码,经过运行Run\Run Module(F5)运行代码。
请注意运行菜单只在你已有一个文件在编辑器窗口打开时有效。
你几乎已经能够开始建立你的游戏了。但没有一些震撼的图像和声音效果的游戏又算什么呢?我已经收集了游戏所须要的所的图形和声音效果并把它们压缩成了一个ZIP存档,你能够在这里下载。
下载文件后,在你的硬盘上建立一个游戏使用的文件夹,将resources文件夹解压到这个文件夹中,这样你的游戏文件夹有了名为resources的子文件夹,各类资源在resources文件夹里面分组显示以下:
兔子和獾的游戏你已经准备就绪。:]
运行IDLE开发环境,向上一节提到的那样,打开一个新的文本编辑窗。在编辑窗键入如下代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
# 1 - Import library
import
pygame
from
pygame.
locals
import
*
# 2 - Initialize the game
pygame.init()
width, height
=
640
,
480
screen
=
pygame.display.set_mode((width, height))
# 3 - Load images
player
=
pygame.image.load(
"resources/images/dude.png"
)
# 4 - keep looping through
while
1
:
# 5 - clear the screen before drawing it again
screen.fill(
0
)
# 6 - draw the screen elements
screen.blit(player, (
100
,
100
))
# 7 - update the screen
pygame.display.flip()
# 8 - loop through the events
for
event
in
pygame.event.get():
# check if the event is the X button
if
event.
type
=
=
pygame.QUIT:
# if it is quit the game
pygame.quit()
exit(
0
)
|
把它保存到你的游戏目录下(即资源子目录)并命名为itgame.py。
让咱们逐段分析以上代码:
1. 导入PyGame库。这一步让你在你的程序中使用来自库中的函数。
2. 初始化PyGame并设置显示窗口。
3. 加载你想要给bunny使用的图片。
4. 循环执行如下缩进的代码。
5. 在绘图前,将屏幕填充成黑色。
6. 将以前加载进来的bunny图片以100*100的大小显示在屏幕上。
7. 更新屏幕。
8. 检查任何新事件若是有的话,不然转到退出命令,退出程序。
注意:根据PyGame的文档,你不须要调用pygame.quit()由于解析器关闭时会自动调用它。然而,至少在Mac OS上,这个游戏会在退出时挂起除非pygame.quite被调用。
若是如今运行这段代码(在Idle菜单栏点击 “Run\Run Module"),你应该能够看到一个以下所示的屏幕:
耶,兔子就显示在屏幕上了,并准备作动做!
可是只有一只兔子显示在一个黑漆漆的屏幕上,这个游戏看起来很吓人且很孤单。接下来要作的就是稍微美化一下咯。
咱们首先给游戏场景添加背景图片,能够经过调用一组screen.blit()来完成背景添加。
在代码的#3 小节,载入角色图像以后添加下面的代码:
1
2
|
grass
=
pygame.image.load(
"resources/images/grass.png"
)
castle
=
pygame.image.load(
"resources/images/castle.png"
)
|
这些代码载入图片而后赋给指定的变量,而后把它们画到屏幕上。但若是你检查草地的图片,你会发现它没有覆盖整个640 x 480的屏幕,因此你必须平铺使草地的图片彻底覆盖屏幕。
在#6小节的开始(把兔子画在屏幕上以前),添加如下代码到game.py:
1
2
3
4
5
6
7
|
for
x
in
range
(width
/
grass.get_width()
+
1
):
for
y
in
range
(height
/
grass.get_height()
+
1
):
screen.blit(grass,(x
*
100
,y
*
100
))
screen.blit(castle,(
0
,
30
))
screen.blit(castle,(
0
,
135
))
screen.blit(castle,(
0
,
240
))
screen.blit(castle,(
0
,
345
))
|
正如你所见,首先把x坐标经过for循环递增,在这个循环中再把y坐标循环递增,而且将草地画在使用循环生成的x、y坐标上。紧接着的一组代码只是将城堡画在屏幕上。
你如今运行这个程序,你会看到像以下的结果:
从如今开始,变得好看点了! :]
下面你须要添加一些真正的游戏元素,好比让兔子响应键盘的按键。
要作到这一点,你须要实现好一个方法记录哪个键在某一时刻被按下。你能够简单的使用一个数组保存在游戏须要使用的键的按下状态。
添加以下代码到game.py的#2小节结束(在你设了屏幕高和宽度以后):
1
2
|
keys
=
[
False
,
False
,
False
,
False
]
playerpos
=
[
100
,
100
]
|
这段代码是很是明了。数组keys按WASD的顺序记录它们的状态。数组的每一个元素对应一个键,第一个是W,第二个是A等等。
playerpos变量定义程序开始绘制游戏角色的起始位置。由于这个游戏将移动游戏角色到不一样的位置,设置一个储存角色位置的变量,而后即可以简单地将角色绘制到这个位置。
如今你须要修改现有的代码来绘制角色,使用新的playerpos变量,将# 6的程序:
1
|
screen.blit(player, (
100
,
100
))
|
改成:
1
|
screen.blit(player, playerpos)
|
接下来,基于哪些按键被按下更新键数组,PyGame经过添加event.key事件使检测按键很容易实现。
在# 8检测event.type==pygame.QUIT以后,添加这些代码(若是有块缩进的话使用与pygame.QUIT相同的缩进级):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
if
event.
type
=
=
pygame.KEYDOWN:
if
event.key
=
=
K_w:
keys[
0
]
=
True
elif
event.key
=
=
K_a:
keys[
1
]
=
True
elif
event.key
=
=
K_s:
keys[
2
]
=
True
elif
event.key
=
=
K_d:
keys[
3
]
=
True
if
event.
type
=
=
pygame.KEYUP:
if
event.key
=
=
pygame.K_w:
keys[
0
]
=
False
elif
event.key
=
=
pygame.K_a:
keys[
1
]
=
False
elif
event.key
=
=
pygame.K_s:
keys[
2
]
=
False
elif
event.key
=
=
pygame.K_d:
keys[
3
]
=
False
|
哇!这里有不少行代码,若是你把它按If语句拆分也不是很复杂的。
首先你要检测一是否有键被按下或释放,而后你须要检测哪一个键被按下或者释放,若是被按下或者释放的键是你要使用的键,根据键值更新相应的键变量。
最后,你须要更新playerpos变量做为键按下的响应,这太简单了。
将下附代码添加到game.py的末尾(使用相同的缩进级,使用和for循环相同的缩进级)
1
2
3
4
5
6
7
8
9
|
# 9 - Move player
if
keys[
0
]:
playerpos[
1
]
-
=
5
elif
keys[
2
]:
playerpos[
1
]
+
=
5
if
keys[
1
]:
playerpos[
0
]
-
=
5
elif
keys[
3
]:
playerpos[
0
]
+
=
5
|
这段代码只是检查哪一个键被按下,而后添加或减去游戏角色的x或y位置(取决于按下的键)来移动游戏角色。
运行这个游戏,你会获得根之前同样的角色。试一下按WASD键,哈哈,起效了!
是的,你的兔子如今能够随着你的按键移动,但用鼠标来旋转兔子朝向到你选择的方向岂不更酷,因此它不是全部时间都朝向一个方向。使用三角函数来实现,这很简单。
看一下下面的图解:
上图中,若是(5,3)是兔子的位置,(2,4)是当前鼠标的位置,你能够经过对两点间距离的不一样应用atan2三角函数得到旋转角度(z)。固然,一旦你知道旋转角,你能够轻松相应地旋转兔子。:]
若是你对这部分有点困惑,不要担忧,你依然能够继续。但这就是你应该在数学课上用功的缘由!:]在游戏编程时你会一直使用这个东西。
如今你须要将这个原理应用到你的游戏上,为作到这一点,你可使用PyGameSurface.rotate(度数)函数, 顺便说一下,记住,Z值是弧度。:[
atan2函数在Python的math库总,全部先在#1结尾处增长:
1
|
import
math
|
而后,将#6最后一行(player.blit这行)替换成下面的代码:
1
2
3
4
5
6
|
# 6.1 - Set player position and rotation
position
=
pygame.mouse.get_pos()
angle
=
math.atan2(position[
1
]
-
(playerpos[
1
]
+
32
),position[
0
]
-
(playerpos[
0
]
+
26
))
playerrot
=
pygame.transform.rotate(player,
360
-
angle
*
57.29
)
playerpos1
=
(playerpos[
0
]
-
playerrot.get_rect().width
/
2
, playerpos[
1
]
-
playerrot.get_rect().height
/
2
)
screen.blit(playerrot, playerpos1)
|
让咱们梳理一下上面代码的基本流程。首先获取鼠标和游戏角色的位置,而后你对两个位置应用atan2函数,以后,你将atan2返回的弧度转化成度数(将弧度乘以近似57.29或360/2π)。
由于兔子会旋转,它的位置也将会改变。因此如今计算兔子的新位置并把它显示在屏幕。
再次运行这个游戏。若是你只按了“WASD”键,那么这个游戏应该和以前彻底同样,但若是你移动你的鼠标兔子也会随之旋转,酷!
如今你的兔子已经能够自由活动了,是时候给它添加更多的动做了。让兔子能够用剑射击敌人怎么样?它可不是只温顺的兔斯基!
这一步稍微有点复杂,由于你必须记录全部射出的剑,更新它们的位置、旋转而且在它们飞出屏幕后删除它们。
首先,在初始化小节(#2小节)的结束添加必要的变量:
1
2
|
acc
=
[
0
,
0
]
arrows
=
[]
|
第一个变量记录玩家的射击精度,第二个变量记录全部的剑。精度变量acc其实是一个包含射击数量和命中獾 次数的列表。最后咱们可使用这些信息来计算精度的百分比。
接下来,在section #3的末尾加载弓箭图像:
1
|
arrow
=
pygame.image.load(
"resources/images/bullet.png"
)
|
如今当玩家点击鼠标,弓箭就要射出。在section #8的末尾加入如下代码做为新的事件句柄(event handler):
1
2
3
4
|
if
event.
type
=
=
pygame.MOUSEBUTTONDOWN:
position
=
pygame.mouse.get_pos()
acc[
1
]
+
=
1
arrows.append([math.atan2(position[
1
]
-
(playerpos1[
1
]
+
32
),position[
0
]
-
(playerpos1[
0
]
+
26
)),playerpos1[
0
]
+
32
,playerpos1[
1
]
+
32
])
|
这些代码检查是否有鼠标点击,若是有它会读取鼠标位置,并根据玩家的旋转和指针的位置计算出弓箭的旋转。这个旋转储存在arrows数组里。
接下来你须要真正在屏幕上画出弓箭了。在section #6.1以后插入如下代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
# 6.2 - Draw arrows
for
bullet
in
arrows:
index
=
0
velx
=
math.cos(bullet[
0
])
*
10
vely
=
math.sin(bullet[
0
])
*
10
bullet[
1
]
+
=
velx
bullet[
2
]
+
=
vely
if
bullet[
1
]<
-
64
or
bullet[
1
]>
640
or
bullet[
2
]<
-
64
or
bullet[
2
]>
480
:
arrows.pop(index)
index
+
=
1
for
projectile
in
arrows:
arrow1
=
pygame.transform.rotate(arrow,
360
-
projectile[
0
]
*
57.29
)
screen.blit(arrow1, (projectile[
1
], projectile[
2
]))
|
运用基本的三角函数能够计算出vely和velx。10是弓箭的速度。if语句检查弓箭是否飞出边界,若是是则删除该弓箭。第二个for语句循环过arrows数组并画出相应旋转的弓箭。
试试运行程序。你应该有一只兔兔在你点击鼠标时发射弓箭了。(。☉౪ ⊙。)
好的,你有了一个城堡和能够移动和射击的英雄。但少了什么东西呢?攻击城堡的敌人!
(炸掉你的城堡!)
在这个步骤中,你将建立几只随机生成并跑向城堡的獾。随着游戏的进展会有愈来愈多的獾。因此,让咱们作一个列表看看须要作那些工做。
一、把坏家伙们添加到一个数组列表;
二、每帧每帧的更新这个数组并检查他们是否都出如今屏幕上;
三、显示这些坏家伙。
很容易,是吧?:]
首先,把下面这段代码添加到section #2后面:
1
2
3
4
|
badtimer
=
100
badtimer1
=
0
badguys
=
[[
640
,
100
]]
healthvalue
=
194
|
上面这段代码设置了一个计时器(以及其余一些值)以便每过一段时间在游戏中增长一只新的獾。你每帧每帧的减小 badtimer直到0, 而后就生成一个新的獾。
如今把下面这段代码添加到section #3后面:
1
2
|
badguyimg1
=
pygame.image.load(
"resources/images/badguy.png"
)
badguyimg
=
badguyimg1
|
上面代码的第一行相似于前面全部的图片加载代码。第二行代码设置了一个图片副本以便于这个坏家伙能更容易动起来。
下一步,你必须更新而且显示这个坏家伙。把下面代码添加到section #6.2以后:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
# 6.3 - Draw badgers
if
badtimer
=
=
0
:
badguys.append([
640
, random.randint(
50
,
430
)])
badtimer
=
100
-
(badtimer1
*
2
)
if
badtimer1>
=
35
:
badtimer1
=
35
else
:
badtimer1
+
=
5
index
=
0
for
badguy
in
badguys:
if
badguy[
0
]<
-
64
:
badguys.pop(index)
badguy[
0
]
-
=
7
index
+
=
1
for
badguy
in
badguys:
screen.blit(badguyimg, badguy)
|
仔细的看下这段代码,:] 第一行检查badtimer是否为0,以badtimer至今为止已经运行的次数为基础,建立一个新的獾并再次设置badtimer。第一个for循环更新獾的X坐标,并检查是否在屏幕上。若是再也不屏幕上就删除掉。第二个佛如循环绘制全部獾。
为了在上述代码中使用随机函数,咱们必须引入 random 库:
1
|
import
random
|
最后,在 while 语句后面添加下面一行代码用来让 badtimer 值减1:
1
|
badtimer
-
=
1
|
再次运行游戏来测试上述代码,如今你将看到真正的游戏,你能够发射、移动、转向,并且獾也尝试跑向你。
但等等,为何不是獾炸毁这座城堡吗?立刻搞定!
在#6.3小节中每个循环前的 index += 1 以前添加以下代码:
1
2
3
4
5
6
7
8
|
# 6.3.1 - Attack castle
badrect
=
pygame.Rect(badguyimg.get_rect())
badrect.top
=
badguy[
1
]
badrect.left
=
badguy[
0
]
if
badrect.left<
64
:
healthvalue
-
=
random.randint(
5
,
20
)
badguys.pop(index)
# 6.3.3 - Next bad guy
|
这段代码很是简单,若是獾的x坐标值小于64,则删除这家伙而后随机递减5到20点的城堡的生命值。(在后面你能够显示生命值到屏幕上)
如今你构建并运行程序,你将看到一堆獾攻击城堡后消失。虽然你不能看到但獾确实下降了城堡的生命值。
如今獾能够攻击你的城堡但你的箭却对它们没有任何效果!兔子该如何保护本身的家园?
是时候让箭能够杀死獾,你才能够保护你的城堡赢得游戏!首先,你必须循环检查每一个坏蛋,在检查时以须要循环检查全部的箭是否是和獾碰撞了。若是箭碰到了獾则删除箭和獾,而且递增命中值。
在#6.3.1小节后添加以下代码:
1
2
3
4
5
6
7
8
9
10
11
|
#6.3.2 - Check for collisions
index1
=
0
for
bullet
in
arrows:
bullrect
=
pygame.Rect(arrow.get_rect())
bullrect.left
=
bullet[
1
]
bullrect.top
=
bullet[
2
]
if
badrect.colliderect(bullrect):
acc[
0
]
+
=
1
badguys.pop(index)
arrows.pop(index1)
index1
+
=
1
|
这段代码里有一个值得注意的地方,if语句后是PyGame内建的检查两个矩形是否相交的函数。其余语句只是按上面解释运行。
若是你如今运行程序,你会发现已经能够射击并杀死獾了。
游戏如今进展良好,有攻击者和守卫者。如今你还须要一种方式显示分数,看看这些兔子干得怎么样。
最简单的方式是添加一个HUD(平视显示器)显示当前城堡的健康情况。也能够添加一个时钟显示城堡被保护了多久。
首先添加时钟,在#7小节前添加以下代码:
1
2
3
4
5
6
|
# 6.4 - Draw clock
font
=
pygame.font.Font(
None
,
24
)
survivedtext
=
font.render(
str
((
90000
-
pygame.time.get_ticks())
/
60000
)
+
":"
+
str
((
90000
-
pygame.time.get_ticks())
/
1000
%
60
).zfill(
2
),
True
, (
0
,
0
,
0
))
textRect
=
survivedtext.get_rect()
textRect.topright
=
[
635
,
5
]
screen.blit(survivedtext, textRect)
|
上面代码简单的使用PyGame默认字体建立字体并设置尺寸为24。而后使用字体渲染时间到表面上。以后广西被定位并绘制到屏幕上。
下一步添加生命条。在绘制生命条以前你须要载入它的背景图。添加以下代码到#3小节结束:
1
2
|
healthbar
=
pygame.image.load(
"resources/images/healthbar.png"
)
health
=
pygame.image.load(
"resources/images/health.png"
)
|
第一个是红色图用来铺满生命条。第二个绿色图显示当前生命值。
如今添加以下代码到#6.4节(你上一步添加的)以后来将生命条画到屏幕上:
1
2
3
4
|
# 6.5 - Draw health bar
screen.blit(healthbar, (
5
,
5
))
for
health1
in
range
(healthvalue):
screen.blit(health, (health1
+
8
,
8
))
|
上面的代码首先画出全红色的生命条,而后根据城堡的剩余的生命绘制绿色生命条。
如今你构建并运行程序,你能够看到时钟和生命条。
这是什么?若是你玩得足够久,即便你的命令值降到了0,游戏仍是继续!不只仅如此,你也还能够继续射击獾。这应该行不通的,但如今就是这样。你须要添加某种赢/输形式的场景让这个游戏值得玩。
因此咱们如今添加输赢条件和各自的画面。你能够退出主游戏循环并进入输赢界面的循环。在输赢循环中,你能够检查用户是输了仍是赢了,并显示相应的界面。
下面是一个判断输赢的基本方法:
若是超过了时间(90000毫秒或90秒):
若是城堡被摧毁了:
计算准确度的方法。
注:使用acc[0]*1.0 只是将acc[0]转换成float浮点类型,若是你不这么转换,则除法操做将返回一个整数值好比1或2而不是1.5。
将下面的代码加到game.py末尾:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
#10 - Win/Lose check
if
pygame.time.get_ticks()>
=
90000
:
running
=
0
exitcode
=
1
if
healthvalue<
=
0
:
running
=
0
exitcode
=
0
if
acc[
1
]!
=
0
:
accuracy
=
acc[
0
]
*
1.0
/
acc[
1
]
*
100
else
:
accuracy
=
0
# 11 - Win/lose display
if
exitcode
=
=
0
:
pygame.font.init()
font
=
pygame.font.Font(
None
,
24
)
text
=
font.render(
"Accuracy: "
+
str
(accuracy)
+
"%"
,
True
, (
255
,
0
,
0
))
textRect
=
text.get_rect()
textRect.centerx
=
screen.get_rect().centerx
textRect.centery
=
screen.get_rect().centery
+
24
screen.blit(gameover, (
0
,
0
))
screen.blit(text, textRect)
else
:
pygame.font.init()
font
=
pygame.font.Font(
None
,
24
)
text
=
font.render(
"Accuracy: "
+
str
(accuracy)
+
"%"
,
True
, (
0
,
255
,
0
))
textRect
=
text.get_rect()
textRect.centerx
=
screen.get_rect().centerx
textRect.centery
=
screen.get_rect().centery
+
24
screen.blit(youwin, (
0
,
0
))
screen.blit(text, textRect)
while
1
:
for
event
in
pygame.event.get():
if
event.
type
=
=
pygame.QUIT:
pygame.quit()
exit(
0
)
pygame.display.flip()
|
这是截至目前最长的代码块,但不是最复杂的。
第一个if语句检查是否到时间,第二个检查城堡是否被摧毁,第三个计算你的准确率。以后,一个快速的if语句检查你是胜利仍是失败了,并显示正确的图像。
固然,若是你想显示胜利与失败的屏幕图像,那么这些图像必须先被加载。将下面的代码添加到# 3结束的地方:
1
2
|
gameover
=
pygame.image.load(
"resources/images/gameover.png"
)
youwin
=
pygame.image.load(
"resources/images/youwin.png"
)
|
另外一点,更改#4处:
1
2
3
|
# 4 - keep looping through
while
1
:
badtimer
-
=
1
|
更改成:
1
2
3
4
5
|
# 4 - keep looping through
running
=
1
exitcode
=
0
while
running:
badtimer
-
=
1
|
running变量跟踪游戏是否结束,exitcode变量跟踪玩家是赢了仍是输了。
再次运行游戏,如今你能够尝试胜利或死亡!酷!:]
这个游戏看起来至关棒,但是有声音吗?是否是太安静了点呢?增长一点点音效会让整个游戏的感受变得更棒。
PyGame 加载并播放声音的方法很是简单。首先你须要初始化混音器,代码以下:
1
|
pygame.mixer.init()
|
而后加载要播放的声音,并设置音量大小:
1
2
3
4
5
6
7
8
9
10
|
# 3.1 - Load audio
hit
=
pygame.mixer.Sound(
"resources/audio/explode.wav"
)
enemy
=
pygame.mixer.Sound(
"resources/audio/enemy.wav"
)
shoot
=
pygame.mixer.Sound(
"resources/audio/shoot.wav"
)
hit.set_volume(
0.05
)
enemy.set_volume(
0.05
)
shoot.set_volume(
0.05
)
pygame.mixer.music.load(
'resources/audio/moonlight.wav'
)
pygame.mixer.music.play(
-
1
,
0.0
)
pygame.mixer.music.set_volume(
0.25
)
|
最上代码中大多数是简单加载音频文件和配置的音频音量,但要注意pygame.mixer.music.load这一行——这一行加载游戏的背景音乐,下一行设置背景音乐一直重复。
注意音频配置。:] 如今,你所须要作的就是按须要播放各类声音效果。像下面每段注释代码那样作:
1
2
3
4
5
6
|
# section 6.3.1 after if badrect.left<64:
hit.play()
# section 6.3.2 after if badrect.colliderect(bullrect):
enemy.play()
# section 8, after if event.type==pygame.MOUSEBUTTONDOWN:
shoot.play()
|
屡次运行游戏,你会发现你如今有碰撞的背景音乐和射击的声音效果,游戏让人感受更逼真了!:]
你应该为本身感到自豪:你刚刚建立完成一个有趣的游戏,里面充满了音乐,音效,一个杀手兔子,神风特攻队獾和更多东西。我告诉你你能够作到!:]
你能够在这里下载最终的游戏源代码。
这时,在游戏中随意拓展你的创造力!也许能够试着换成与你本身的绘画风格,或添加不一样的武器或不一样类型的怪物到游戏中!
在完成这个教程中你有问题或评论吗? 若是有,请加入咱们论坛的讨论中! 我很期待你的来信。