用Pygame和Python做遊戲-從入門到精通(1)

pythontab發表於2012-12-20

這是一個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下載吧!)。 一旦你安裝好,你可以用下面的方法確認下有沒有安裝成功:

import pygame
print pygame.ver
1.9.1release

若說為什麼要介紹這麼一個“過時”的東西,真正的知識是不會過時的,只有技術才會。這裡主要是依靠Pygame來介紹的遊戲開發的方方面面,並不是說我們就可以靠這個做出什麼偉大的遊戲了(當然也不是說不可以)!你的版本可能和我不同,這沒關係。我所翻譯的這本書上的版本還是1.7.1的……所以如果有些過時的不合時宜的東西,千萬不要客氣請指出來!

另外說一下,就產品而言,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來測試一下。

if pygame.font is None:
    print "The font module is not available!"
    exit()

學程式一開始我們總會寫一個Hello world程式,但那只是在螢幕上寫了兩個字,現在我們來點更帥的!寫好以後會是這樣的效果:新的Hello World

#!/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程式的印象,接下來我們會學習更多深層次的東西,並且把各條語句都真正讀懂。

相關文章