最近開始學習Python語言,發現Python有一個神奇的Pygame模塊,在編寫小游戲時顯得非常方便,于是參照教學視頻編寫了一個微信打飛機的小游戲,網上有很多相關的博客,但都不是很詳細,大都是直接貼代碼,于是決定沉下心來把編寫程序的過程記錄下來,與大家分享。
首先聲明一點,這篇博客完全參照了小甲魚的《零基礎入門學習Python》教學視頻,為了尊重原創,特將原作者的視頻地址公布如下:[《零基礎入門學習Python》](http://blog.fishc.com/category/python "零基礎入門學習Python")
Python編譯器和Pygame模塊的安裝網上的教程很多,這里不再贅述,需要強調的一點是,兩者之前不僅要求版本一致,所對應操作系統位數也應該一致,例如32位的Pygame模塊必須對應32位的Python編譯器,我采用的是Python3.4(32位),所用Python的IDE為Pycharm。
在編寫游戲的過程中需要用到大量圖片和聲音資源,如背景圖片、背景音樂等,這里將相關資源統一打包,供大家下載:[《微信打飛機圖片音效資源》](http://download.csdn.net/detail/u013088062/9250515 "《微信打飛機圖片音效資源》")
[Python編寫微信打飛機小游戲(一)](http://blog.csdn.net/u013088062/article/details/49705439)
[Python編寫微信打飛機小游戲(二)](http://blog.csdn.net/u013088062/article/details/49722387)
[Python編寫微信打飛機小游戲(三)](http://blog.csdn.net/u013088062/article/details/49744985)
[Python編寫微信打飛機小游戲(四)](http://blog.csdn.net/u013088062/article/details/49766129)
[Python編寫微信打飛機小游戲(五)](http://blog.csdn.net/u013088062/article/details/49786277)
[Python編寫微信打飛機小游戲(六)](http://blog.csdn.net/u013088062/article/details/49823693)
[Python編寫微信打飛機小游戲(七)](http://blog.csdn.net/u013088062/article/details/49834123)
[Python編寫微信打飛機小游戲(八)](http://blog.csdn.net/u013088062/article/details/49872089)
[Python編寫微信打飛機小游戲(九)](http://blog.csdn.net/u013088062/article/details/49890837)
[Python編寫微信打飛機小游戲(十)](http://blog.csdn.net/u013088062/article/details/49893717)
[Python編寫微信打飛機小游戲(十一)](http://blog.csdn.net/u013088062/article/details/49904363)
[Python編寫微信打飛機小游戲(十二)](http://blog.csdn.net/u013088062/article/details/49907607)
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音頻操作》](http://www.cnblogs.com/xiaowuyi/archive/2012/06/15/2550338.html "Pygame音頻操作")[
](http://www.cnblogs.com/xiaowuyi/archive/2012/06/15/2550338.html "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,第一部分就先介紹這些。
[《Python編寫微信打飛機小游戲(一)》](http://blog.csdn.net/u013088062/article/details/49705439)