天天看點

Pygame實戰之外星人入侵NO.9——消滅外星人

萬事俱備,隻欠子彈和外星人同歸于盡…… 我們将使用sprite.groupcollide()來檢測子彈和外星人的碰撞,也就是檢視二者是否重疊在一起~~

在game_functions.py中的update_bullets(bullets,aliens)方法内加入一行代碼:

collisions=pygame.sprite.groupcollide(bullets,aliens,True,True)
           

對,就這麼一行,完美解決碰撞問題,話說現在這接口也太實用了吧……四個參數,前兩個為子彈和外星人編組,該方法将周遊二者,參數True告訴pygame删除發生碰撞的子彈和外星人,也就是同歸于盡。。如果想設計超級子彈,即一顆子彈消滅多個敵人(抗日神劇中經常性地上演),那可以降低一格True改成False,即發生碰撞後不删除子彈隻删除外星人。。對了,該方法将傳回一個字典,存儲在collisions中,包含了發生碰撞的子彈和外星人,其中前者是鍵,後者是對應的值。 在主程式中調用 update_bullets(bullets,aliens):

gf.update_bullets(bullets,aliens)
           

這個時候運作遊戲便能開始實物射擊了:

Pygame實戰之外星人入侵NO.9——消滅外星人

還可以設計大号子彈,增大威力,在settings.py中更改子彈寬度:

self.bullet_width=100
           

這時:

Pygame實戰之外星人入侵NO.9——消滅外星人

現在還要做的就是将目前外星人全部消滅後添加新的外星人群,由于之後對代碼進行了重構後,直接上最終效果吧:

def update_bullets(ai_settings,screen,ship,bullets,aliens):
        bullets.update() #将為組bullets中的每一顆子彈調用bullets.update()
        #删除已經消失的子彈
        for bullet in bullets.copy(): #周遊編組的副本,這樣不會删除清單中的條目
            if bullet.rect.bottom<=0:
                bullets.remove(bullet)
        check_collisions(ai_settings,screen,ship,bullets,aliens)             
        #print(len(bullets)) #顯示目前還有多少子彈
def check_collisions(ai_settings,screen,ship,bullets,aliens):
        collisions=pygame.sprite.groupcollide(bullets,aliens,True,True)
         print(collisions)   #列印字典
        if len(aliens)==0:   #判空       
            bullets.empty()  #清空目前子彈
            creat_aliens(ai_settings,screen,aliens,ship)  #建立新的外星人群
           

這是game_functions.py中的兩個方法,在第一個方法中調用第二個方法,後者主要實作檢查處理碰撞,當外星人被消滅完後再建立新的外星人群,正常情況下應該先清理掉目前螢幕中的子彈再建立新的外星人,還有就是列印字典,前邊提到過,這個字典中裝的是已被消滅的子彈和外星人的鍵值對,單列印出來是這個樣子的:

Pygame實戰之外星人入侵NO.9——消滅外星人

如果把列印語句放到if語句中,即消滅一波外星人後再列印,效果是:

Pygame實戰之外星人入侵NO.9——消滅外星人

我本以為是多個鍵值對。。這樣看來他們都在0組中。。後面還會用到字典,繼續探究……

最後别忘了在主程式中調用更改後的方法~~主要就是參數的變化……

繼續閱讀