游戏分享:手把手教你用Python编写
战斗机游戏(四)
2018.1.25飞机大战就到这里啦
你的飞机大战做出来了吗
加入图像
现在我们已经能够玩游戏了,但这个游戏丑确实有点丑。接下来,我们要把单调的白色矩形换成好看的图片。
在前面的代码中,我们用填充了白色的surface对象来表示游戏中的所有东西(包括游戏主角、敌人)。用白色矩形能够帮助我们理解surface对象是如何运作的,但是它们确实不美观。我们现在要给游戏主角和敌人加上图片,图片的素材可以通过文末扫码获得。如果你不记得要把图片素材放在哪里,可以看看我们之前发的兔獾大作战游戏教程。
改变对象构造器
现在我们的player构造器(constructor,类里用于建立对象的特殊子程序)长这样:
classPlayer(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()
www.codingmarch.com
新的构造器会长这样:
我们想把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对象的代码如下:
www.codingmarch.com
看起来是不是很眼熟?在这段代码下面,我们要加上创建敌人的事件:ADDCLOUD=pygame.USEREVENT+2pygame.time.set_timer(ADDCLOUD,1000)然后给他们创建一个新的精灵组:clouds=pygame.sprite.Group()
现在,在我们的游戏主循环中,我们要对事件队列进行循环,并对添加云朵的事件ADDCLOUD进行侦听:这段代码:
foreventinpygame.event.get():ifevent.type==KEYDOWN:ifevent.key==K_ESCAPE:running=Falseelifevent.type==QUIT:running=False
elifevent.type==ADDENEMY:new_enemy=Enemy()enemies.add(new_enemy)all_sprites.add(new_enemy)会变成这样:
foreventinpygame.event.get():ifevent.type==KEYDOWN:ifevent.key==K_ESCAPE:
www.codingmarch.com
running=Falseelifevent.type==QUIT:running=False
elifevent.type==ADDENEMY:new_enemy=Enemy()enemies.add(new_enemy)all_sprites.add(new_enemy)elifevent.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()方法。
成功!恭喜你!游戏制作完成!
www.codingmarch.com