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

原文鏈接:https://eyehere.net/2011/python-pygame-novice-professional-1/

 

博客剛開,打算做一個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程序的印象,接下來我們會學習更多深層次的東西,並且把各條語句都真正讀懂。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章