少儿编程分享:手把手教你用Python编写战斗机游戏(四)

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

游戏分享:手把手教你用Python编写

战斗机游戏(四)

2018.1.25

飞机大战就到这里啦

你的飞机大战做出来了吗

加入图像

现在我们已经能够玩游戏了,但这个游戏丑确实有点丑。接下来,我们要把单调的白色矩形换成好看的图片。

在前面的代码中,我们用填充了白色的surface对象来表示游戏中的所有东西(包括游戏主角、敌人)。用白色矩形能够帮助我们理解surface对象是如何运作的,但是它们确实不美观。我们现在要给游戏主角和敌人加上图片,图片的素材可以通过文末扫码获得。如果你不记得要把图片素材放在哪里,可以看看我们之前发的兔獾大作战游戏教程。

改变对象构造器

现在我们的player构造器(constructor,类里用于建立对象的特殊子程序)长这样:

class Player(pygame.sprite.Sprite):

def__init__(self):

super(Player,self).__init__()

self.surf=pygame.Surface((75,25))

self.surf.fill((255,255,255))

self.rect=self.surf.get_rect()

新的构造器会长这样:

我们想把surface对象换成图片,要用到pygame.image.load()方法,然后向这个方法传递一个文件地址。Load()方法会返回一个surface对象。然后我们要对这个surface对象调用convert()对其进行复制,让它更快地出现在屏幕上。

接下来,我们要对图像调用set_colorkey()方法。Set_colorkey方法会设定PyGame渲染成透明色的颜色。在这里,我把这个颜色设置为白色,因为白色是飞机图片的背景图。RLEACCEL是一个可有可无的参数,不过加上这个参数能够让PyGame渲染图片时更快些。

最后,我们要对图像调用get_rect()方法来得到rect对象。

小提示

现在surface对象不再是用白色填充,而是被放上了图片。

对Enemy构造器进行类似的改动:

现在我们的游戏有了更好看的图片了!不过好像还少了些什么。让我们在画面上加些云朵,这样飞机就更像是在空中飞行了。要加上云朵,和先前加上其他对象类似。首先,我们要创建一个带有云朵图片的Cloud对象,然后用update()方法不断地把云朵移向屏幕的左边。然后我们要创建一个自定义事件来产生一些新的云朵(这些新的云朵也会被加到all_sprites组中)。创建Cloud对象的代码如下:

看起来是不是很眼熟?在这段代码下面,我们要加上创建敌人的事件:ADDCLOUD=EREVENT+2

pygame.time.set_timer(ADDCLOUD,1000)

然后给他们创建一个新的精灵组:

clouds=pygame.sprite.Group()

现在,在我们的游戏主循环中,我们要对事件队列进行循环,并对添加云朵的事件ADDCLOUD进行侦听:

这段代码:

for event in pygame.event.get():

if event.type==KEYDOWN:

if event.key==K_ESCAPE:

running=False

elif event.type==QUIT:

running=False

elif event.type==ADDENEMY:

new_enemy=Enemy()

enemies.add(new_enemy)

all_sprites.add(new_enemy)

会变成这样:

for event in pygame.event.get():

if event.type==KEYDOWN:

if event.key==K_ESCAPE:

running=False

elif event.type==QUIT:

running=False

elif event.type==ADDENEMY:

new_enemy=Enemy()

enemies.add(new_enemy)

all_sprites.add(new_enemy)

elif event.type==ADDCLOUD:

new_cloud=Cloud()

all_sprites.add(new_cloud)

clouds.add(new_cloud)

我们要把云朵加到all_sprites组和新的clouds组内。之所以要把云朵加到这两个组内是因为我们要用all_sprites来进行渲染,用clouds来调用update函数。你可能会问,我们为什么不直接把他们加到现有的enemies组中?我们不是一直在调用相同的update函数吗?原因是,我们不需要检测飞机是否撞上了云朵。我们的飞机应该能够完好无损地穿过云朵,而不是撞到云朵然后游戏结束。我们现在需要做的就是调用clouds组的update()方法。

成功!恭喜你!

游戏制作完成!

相关文档
最新文档