资源简介 (共18张PPT)Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.少儿编程课飞机大战5本节我们优化碰撞检测,并添加计分机制,完善飞机大战游戏效果碰撞检测的优化如果仔细观察游戏效果,你会发现陨石还没有碰到飞机,就发生了碰撞检测,游戏结束这是因为虽然陨石和飞机是不规则的形状,但是碰撞检测还是以图片的长方形来判断的。以下图为例:明白了原因之后,接下来我们想办法优化一下碰撞检测陨石图片陨石本身飞机图片飞机本身图片边缘已经碰撞飞机和陨石本身并没有碰到优化碰撞检测的方法:将飞机和陨石当做圆来处理23为spritecollide添加第四个参数pygame.sprite.collide_circle之前说过,这个参数可以指定一个回调函数,能够定制一些特殊的检测方法,pygame.sprite.collide_circle就是pygame提供的用来检测两个圆是否碰撞的函数将陨石当作圆来处理,指定半径hits = pygame.sprite.spritecollide(player, all_meteorite, True, pygame.sprite.collide_circle)# 把陨石当做圆处理,设定陨石的半径self.radius = int(self.rect.width * 0.85 / 2)# pygame.draw.circle(self.image, COLOR_GREEN, self.rect.center, self.radius)# 把飞机当圆处理,设置飞机圆的半径self.radius = 20# pygame.draw.circle(self.image, COLOR_GREEN, self.rect.center, self.radius)因为陨石外面有透明部分,可以先乘以0.85去掉透明部分然后再除以2作为半径。两个设定半径后跟的一行代码表示绘制指定半径的一个圆,这样可以更直观的看到把飞机和陨石当成圆的样子。1将飞机当作圆来处理,指定半径运行程序,效果如下:素材丰富与记分机制接下来,我们丰富掉落的陨石类型1首先把所有陨石的图片效果列出来存到列表中3最后在陨石的初始化方法中,随机选定一个图片即可4运行程序,效果如下:2然后循环获取所有图片meteor_list = ['img_meteorite_01.png', 'img_meteorite_02.png','img_meteorite_03.png','img_meteorite_04.png','img_meteorite_05.png','img_meteorite_06.png','img_meteorite_07.png', 'img_meteorite_08.png']# 循环获取所有图片meteor_images = []for img in meteor_list:meteor_images.append(pygame.image.load('img/' + img))# 随机获取列表中的某一项self.image = random.choice(meteor_images)飞机打陨石的过程已经做好了,下面我们给游戏添加计分机制1定义绘制计分的方法,首先设置字体和大小# 定义绘制计分的方法def draw_text(surf, text, size, x, y):# 设置画笔的字体font_name = pygame.font.match_font('arial')# 设置画笔的字体和大小font = pygame.font.Font(font_name, size)3# 将字体绘制到屏幕上surf.blit(text_surface, text_rect)2创建字体的矩形区域并设置位置# 绘制内容:text为内容,True为是否抗锯齿,字体颜色为白色text_surface = font.render(text, True, (255, 255, 255))# 设置字体的矩形text_rect = text_surface.get_rect()# 设置字体的位置text_rect.midtop = (x, y)使用blit方法将创建好的字体绘制到屏幕4定义变量score表示分数,初始值为0,每次子弹与陨石碰撞加五分。score = 0for hit in hits:# 分数增加score += 5……5在死循环中调用绘制计分方法将分数绘制到屏幕中# 绘制分数draw_text(screen, str(score), 18, WIDTH / 2, 10)运行程序,效果如下:音效添加一个好的游戏,好的音效是必不可少的,现在我们就为游戏添加音效1在工程目录下新建snd文件夹,将准备好的音效添加进来2初始化pygame处理音效模块mixer模块3使用mixer将本地的声音加载到程序中4最后,在子弹的shoot方法中,调用声音的play方法# 初始化mixer模块pygame.mixer.init()# 加载子弹发生的声音shoot_sound = pygame.mixer.Sound('snd/shoot.wav')# 调用发射子弹的声音shoot_sound.play()练习Exercises密封线内不准答题子弹碰撞上陨石准备了两种音效,在子弹碰撞上陨石时,随机播放。接着,为整个游戏添加背景音乐1使用mixer中的music模块加载音乐2在死循环进行游戏开始之前,调用背景音乐的play()方法3在play()中添加loops参数,值设为-1,使音乐循环播放# 定义游戏的背景音乐pygame.mixer.music.load('snd/music_bg.mp3')pygame.mixer.music.play()# 循环播放背景音乐pygame.mixer.music.play(loops=-1)运行程序,效果如下:总结SummaryPygame碰撞检测的优化处理√pygame字体绘制√Pygame声音素材的添加√Thanks! 展开更多...... 收起↑ 资源预览