少儿编程分享:手把手教你用Python编写战斗机游戏(四)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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()方法。
成功!恭喜你!
游戏制作完成!