Python編寫微信打飛機小遊戲(一)
如果覺得這篇文章對您有所啟發,歡迎關注我的公眾號,我會盡可能積極和大家交流,謝謝。
最近開始學習Python語言,發現Python有一個神奇的Pygame模組,在編寫小遊戲時顯得非常方便,於是參照教學視訊編寫了一個微信打飛機的小遊戲,網上有很多相關的部落格,但都不是很詳細,大都是直接貼程式碼,於是決定沉下心來把編寫程式的過程記錄下來,與大家分享。
首先宣告一點,這篇部落格完全參照了小甲魚的《零基礎入門學習Python》教學視訊,為了尊重原創,特將原作者的視訊地址公佈如下:《零基礎入門學習Python》
Python編譯器和Pygame模組的安裝網上的教程很多,這裡不再贅述,需要強調的一點是,兩者之前不僅要求版本一致,所對應作業系統位數也應該一致,例如32位的Pygame模組必須對應32位的Python編譯器,我採用的是Python3.4(32位),所用Python的IDE為Pycharm。
在編寫遊戲的過程中需要用到大量圖片和聲音資源,如背景圖片、背景音樂等,這裡將相關資源統一打包,供大家下載:《微信打飛機圖片音效資源》
1、匯入相關模組。
建立主函式檔案,如“mian.py”,在程式開始前將用到的Python模組匯入:
# 匯入相關模組 # coding: utf-8 import pygame import sys import tracebackfrom random import * from pygame.locals import *
這裡有幾個問題需要解釋一下:(1)如果Python不能正常列印中文字元,需要在檔案開頭加上“# coding: utf-8”來指定對應的編碼型別;(2)“sys”為系統模組,“traceback”為Python用來捕獲異常的模組,“random”為隨機數生成模組,“pygame.locals”則包含了Pygame中的一些固定的標誌常量,在下面的程式中將會用到。(3)這裡涉及了Python兩種匯入模組的方式,一種是形如“import pygame”,這種方法表示宣告一個模組,如果需要使用其中的元素,應採用“模組名.變數名”的格式;另一種形如“from random import *”,表示將模組中的所有元素全部匯入當前工程,在使用時直接使用元素名稱即可。
2、載入相關資源
將下載得到的資源(一個image資料夾,一個sound資料夾)放入工程目錄下(與mian.py相同的資料夾中),之後在主程式中載入這些資源。在載入之前,需要對pygame的相關功能進行初始化:
# ==================初始化================== pygame.init() pygame.mixer.init() # 混音器初始化 bg_size = width, height = 480, 852 # 設計背景尺寸 screen = pygame.display.set_mode(bg_size) # 設定背景對話方塊 pygame.display.set_caption("飛機大戰……FishC Demo") background = pygame.image.load("image/background.png") # 載入背景圖片,並設定為不透明
注意:(1)mixer為pygame模組的聲音控制物件(俗稱混音器),在涉及到與聲音有關的操作時會用到。(2)bg_size取決於背景圖片的尺寸
在完成相關初始化後,可以正式的載入背景圖片和相關音效了:
# ==========載入遊戲音樂==================== pygame.mixer.music.load("sound/game_music.wav") pygame.mixer.music.set_volume(0.2) bullet_sound = pygame.mixer.Sound("sound/bullet.wav") bullet_sound.set_volume(0.2) big_enemy_flying_sound = pygame.mixer.Sound("sound/big_spaceship_flying.wav") big_enemy_flying_sound.set_volume(0.2) enemy1_down_sound = pygame.mixer.Sound("sound/enemy1_down.wav") enemy1_down_sound.set_volume(0.2) enemy2_down_sound = pygame.mixer.Sound("sound/enemy2_down.wav") enemy2_down_sound.set_volume(0.2) enemy3_down_sound = pygame.mixer.Sound("sound/enemy3_down.wav") enemy3_down_sound.set_volume(0.2) me_down_sound = pygame.mixer.Sound("sound/game_over.wav") me_down_sound.set_volume(0.2) button_down_sound = pygame.mixer.Sound("sound/button.wav") button_down_sound.set_volume(0.2) level_up_sound = pygame.mixer.Sound("sound/achievement.wav") level_up_sound.set_volume(0.2) bomb_sound = pygame.mixer.Sound("sound/use_bomb.wav") bomb_sound.set_volume(0.2) get_bomb_sound = pygame.mixer.Sound("sound/get_bomb.wav") get_bomb_sound.set_volume(0.2) get_bullet_sound = pygame.mixer.Sound("sound/get_double_laser.wav") get_bullet_sound.set_volume(0.2)
注意,由於pygame音訊處理能力有限,在讀取音訊資訊時,需要將音訊檔案轉換成wav格式,普通的MP3格式一般情況下是無法正常讀取的,更多pygame有關音訊檔案的操作可以參考下面的部落格:《Pygame音訊操作》
3、遊戲主程序,迴圈播放背景音樂
在載入完相關資源之後,開始編寫遊戲的主函式。由於還沒有定義相關的模組,這裡顯示編寫一個最簡單的框架,讓程式能夠迴圈執行起來。
if __name__ == '__main__': try: main() except SystemExit: pass except: traceback.print_exc() pygame.quit() input()
這是Python的主程式入口,如果我們執行main.py檔案,程式則自動開始執行。如果只是將main.py作為一個模組import到其他工程中,則不會觸發這個函式的執行。注意在這裡我們使用了try語句來捕獲程式執行時出現的異常,如果main()函式在執行過程中丟擲任何異常,除了系統正常退出(SystemExit)的異常外,其他異常都通過“traceback.print_exc()”來列印異常資訊,同時呼叫“pygame.quit()”退出程式。
由於還沒有編寫其他程式碼,在此處我們只編寫一個最簡單的main()函式來保證程式的正常執行,即簡單的顯示背景圖片並迴圈播放背景音樂:
def main(): pygame.mixer.music.play(-1) running = True while running: screen.blit(background, (0, 0)) for event in pygame.event.get(): # 響應使用者的偶然操作 if event.type == QUIT: # 如果使用者按下螢幕上的關閉按鈕,觸發QUIT事件,程式退出 pygame.quit() sys.exit() pygame.display.flip()
這裡對混音器mixer的成員函式play()賦值為-1代表迴圈播放該音樂,如果形參為空,則只播放一次該音樂。這裡在主程式迴圈中需要設定使用者退出操作,當檢測到使用者按下介面的關閉按鈕時(×),程式將呼叫pygame.quit()和sys.exit()完成退出。注意如果不設定這個操作,將會導致程式無法正常關閉(一般表現為程式無法響應)。在螢幕繪製方面,Python採用了一種雙緩衝的螢幕重新整理機制,即先通過blit()函式將一個圖片(統稱為surface物件)繪製在記憶體中,最後統一用pygame.display.flip()函式將繪製好的surface物件一次全部重新整理到螢幕上。至於什麼是surface物件,可以暫時理解為Python世界中的所有的圖形影象吧。ok,第一部分就先介紹這些。