資源簡介 (共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! 展開更多...... 收起↑ 資源預覽 縮略圖、資源來源于二一教育資源庫