博客剛開,打算做一個Pygame的系列,翻譯自Will McGugan的《Beginning Game Development with Python and Pygame –From Novice to Professional》,有興趣的朋友可以搜一下,有英文版的PDF可以下載。其實也不是翻譯,把精華摘出來,共同學習。
看這個系列需要有Python的基礎知識,雖然一開始想寫一篇Python概要的,實在是很龐雜,而且有那麼多好的Python基礎教程,自己就不多插一腳了吧。入門的話,有Python入門,詳盡的話,可以看看Python核心編程或者Python編程金典,然後IBM上的“可愛的Python”系列也很不錯,可以擴展一下思維。
OK,讓我們開始吧~
Pygame的歷史
Pygame是一個利用SDL庫的寫就的遊戲庫,SDL呢,全名Simple DirectMedia Layer,是一位叫做Sam Lantinga的大牛寫的,據說他爲了讓Loki(致力於向Linux上移植Windows的遊戲的一家大好人公司,可惜已經倒閉,唉好人不長命啊……)更有效的工作,創造了這個東東。
SDL是用C寫的,不過它也可以使用C++進行開發,當然還有很多其它的語言,Pygame就是Python中使用它的一個庫。Pygame已經存在很多時間了,許多優秀的程序員加入其中,把Pygame做得越來越好。
安裝Pygame
你可以從www.pygame.org下載Pygame,選擇合適你的操作系統和合適的版本,然後安裝就可以了(什麼,你連Python都沒有?您可能是不適合看這個系列了,不過如果執意要學,很好!快去www.python.org下載吧!)。 一旦你安裝好,你可以用下面的方法確認下有沒有安裝成功:
Python
1 2 3 |
>>> import pygame >>> print pygame.ver 1.9.1release |
你的版本可能和我不同,這沒關係。我所翻譯的這本書上的版本還是1.7.1的……所以如果有些過時的不合時宜的東西,千萬不要客氣請指出來!
若說爲什麼要介紹這麼一個“過時”的東西,真正的知識是不會過時的,只有技術纔會。這裏主要是依靠Pygame來介紹的遊戲開發的方方面面,並不是說咱就可以靠這個做出什麼偉大的遊戲了(當然也不是說不可以)!
另外說一下,就產品而言,Pygame更致力於2D遊戲的開發,也就是說,你可以用Pygame寫一個植物大戰殭屍,但是寫一個魔獸世界則相當困難……請不要做出鄙夷的目光,底層的東西永遠是相通的,而且對於新手而言,從簡單的2D入手纔是正途。
使用Pygame
Pygame有很多的模塊,下面是一張一覽表:
模塊名 | 功能 |
---|---|
pygame.cdrom | 訪問光驅 |
pygame.cursors | 加載光標 |
pygame.display | 訪問顯示設備 |
pygame.draw | 繪製形狀、線和點 |
pygame.event | 管理事件 |
pygame.font | 使用字體 |
pygame.image | 加載和存儲圖片 |
pygame.joystick | 使用遊戲手柄或者 類似的東西 |
pygame.key | 讀取鍵盤按鍵 |
pygame.mixer | 聲音 |
pygame.mouse | 鼠標 |
pygame.movie | 播放視頻 |
pygame.music | 播放音頻 |
pygame.overlay | 訪問高級視頻疊加 |
pygame | 就是我們在學的這個東西了…… |
pygame.rect | 管理矩形區域 |
pygame.sndarray | 操作聲音數據 |
pygame.sprite | 操作移動圖像 |
pygame.surface | 管理圖像和屏幕 |
pygame.surfarray | 管理點陣圖像數據 |
pygame.time | 管理時間和幀信息 |
pygame.transform | 縮放和移動圖像 |
有些模塊可能在某些平臺上不存在,你可以用None來測試一下。
Python
1 2 3 |
if pygame.font is None: print "The font module is not available!" exit() |
新的Hello World
學程序一開始我們總會寫一個Hello world程序,但那只是在屏幕上寫了兩個字,現在我們來點更帥的!寫好以後會是這樣的效果:
Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
#!/usr/bin/env python
background_image_filename = 'sushiplate.jpg' mouse_image_filename = 'fugu.png' #指定圖像文件名稱
import pygame #導入pygame庫 from pygame.locals import * #導入一些常用的函數和常量 from sys import exit #向sys模塊借一個exit函數用來退出程序
pygame.init() #初始化pygame,爲使用硬件做準備
screen = pygame.display.set_mode((640, 480), 0, 32) #創建了一個窗口 pygame.display.set_caption("Hello, World!") #設置窗口標題
background = pygame.image.load(background_image_filename).convert() mouse_cursor = pygame.image.load(mouse_image_filename).convert_alpha() #加載並轉換圖像
while True: #遊戲主循環
for event in pygame.event.get(): if event.type == QUIT: #接收到退出事件後退出程序 exit()
screen.blit(background, (0,0)) #將背景圖畫上去
x, y = pygame.mouse.get_pos() #獲得鼠標位置 x-= mouse_cursor.get_width() / 2 y-= mouse_cursor.get_height() / 2 #計算光標的左上角位置 screen.blit(mouse_cursor, (x, y)) #把光標畫上去
pygame.display.update() #刷新一下畫面 |
這個程序需要兩張圖片,你可以在這篇文章最後的地方找到下載地址,雖然你也可以隨便找兩張。爲了達到最佳效果,背景的 sushiplate.jpg應要有640×480的分辨率,而光標的fugu.png大約應爲80×80,而且要有Alpha通道(如果你不知道這是 什麼,還是下載吧……)。
注意:代碼中的註釋我使用的是中文,如果執行報錯,可以直接刪除。
遊戲中我已經爲每一行寫了註釋,另外如果打算學習,強烈建議自己動手輸入一遍而不是複製粘貼!
稍微講解一下比較重要的幾個部分:
set_mode會返回一個Surface對象,代表了在桌面上出現的那個窗口,三個參數第一個爲元祖,代表分 辨率(必須);第二個是一個標誌位,具體意思見下表,如果不用什麼特性,就指定0;第三個爲色深。
標誌位 | 功能 |
---|---|
FULLSCREEN | 創建一個全屏窗口 |
DOUBLEBUF | 創建一個“雙緩衝”窗口,建議在HWSURFACE或者OPENGL時使用 |
HWSURFACE | 創建一個硬件加速的窗口,必須和FULLSCREEN同時使用 |
OPENGL | 創建一個OPENGL渲染的窗口 |
RESIZABLE | 創建一個可以改變大小的窗口 |
NOFRAME | 創建一個沒有邊框的窗口 |
convert函數是將圖像數據都轉化爲Surface對象,每次加載完圖像以後就應該做這件事件(事實上因爲 它太常用了,如果你不寫pygame也會幫你做);convert_alpha相比convert,保留了Alpha 通道信息(可以簡單理解爲透明的部分),這樣我們的光標纔可以是不規則的形狀。
遊戲的主循環是一個無限循環,直到用戶跳出。在這個主循環裏做的事情就是不停地畫背景和更新光標位置,雖然背景是不動的,我們還是需要每次都畫它, 否則鼠標覆蓋過的位置就不能恢復正常了。
blit是個重要函數,第一個參數爲一個Surface對象,第二個爲左上角位置。畫完以後一定記得用update更新一下,否則畫面一片漆黑。
這是一個最最大概的Pygame程序的印象,接下來我們會學習更多深層次的東西,並且把各條語句都真正讀懂。