【轉(zhuǎn)】用Python和Pygame寫游戲-從入門到精通(1)

http://eyehere.net/2011/python-pygame-novice-professional-1/
博客剛開嗓奢,打算做一個Pygame的系列键袱,翻譯自Will McGugan的《Beginning Game Development with Python and Pygame –From Novice to Professional》燎窘,有興趣的朋友可以搜一下,有英文版的PDF可以下載蹄咖。其實也不是翻譯褐健,把精華摘出來,共同學(xué)習(xí)比藻。
看這個系列需要有Python的基礎(chǔ)知識铝量,雖然一開始想寫一篇Python概要的,實在是很龐雜银亲,而且有那么多好的Python基礎(chǔ)教程慢叨,自己就不多插一腳了吧。入門的話务蝠,有Python入門拍谐,詳盡的話,可以看看Python核心編程或者Python編程金典馏段,然后IBM上的“可愛的Python”系列也很不錯轩拨,可以擴(kuò)展一下思維。
OK院喜,讓我們開始吧~
Pygame的歷史

pygame_logo

Pygame是一個利用SDL庫的寫就的游戲庫亡蓉,SDL呢,全名Simple DirectMedia Layer喷舀,是一位叫做Sam Lantinga的大牛寫的砍濒,據(jù)說他為了讓Loki(致力于向Linux上移植Windows的游戲的一家大好人公司,可惜已經(jīng)倒閉硫麻,唉好人不長命啊……)更有效的工作爸邢,創(chuàng)造了這個東東。

SDL是用C寫的拿愧,不過它也可以使用C++進(jìn)行開發(fā)杠河,當(dāng)然還有很多其它的語言,Pygame就是Python中使用它的一個庫。Pygame已經(jīng)存在很多時間了券敌,許多優(yōu)秀的程序員加入其中唾戚,把Pygame做得越來越好。

安裝Pygame
你可以從www.pygame.org下載Pygame陪白,選擇合適你的操作系統(tǒng)和合適的版本颈走,然后安裝就可以了(什么,你連Python都沒有咱士?您可能是不適合看這個系列了立由,不過如果執(zhí)意要學(xué),很好序厉!快去www.python.org下載吧H衲ぁ)。 一旦你安裝好弛房,你可以用下面的方法確認(rèn)下有沒有安裝成功:

>>>import pygame
>>>print pygame.ver
1.9.1release

你的版本可能和我不同道盏,這沒關(guān)系。我所翻譯的這本書上的版本還是1.7.1的……所以如果有些過時的不合時宜的東西文捶,千萬不要客氣請指出來荷逞!
若說為什么要介紹這么一個“過時”的東西,真正的知識是不會過時的粹排,只有技術(shù)才會种远。這里主要是依靠Pygame來介紹的游戲開發(fā)的方方面面,并不是說咱就可以靠這個做出什么偉大的游戲了(當(dāng)然也不是說不可以)顽耳!
另外說一下坠敷,就產(chǎn)品而言,Pygame更致力于2D游戲的開發(fā)射富,也就是說膝迎,你可以用Pygame寫一個植物大戰(zhàn)僵尸,但是寫一個魔獸世界則相當(dāng)困難……請不要做出鄙夷的目光胰耗,底層的東西永遠(yuǎn)是相通的限次,而且對于新手而言,從簡單的2D入手才是正途柴灯。
使用Pygame
Pygame有很多的模塊卖漫,下面是一張一覽表:

模塊名 功能
pygame.cdrom    訪問光驅(qū)
pygame.cursors  加載光標(biāo)
pygame.display  訪問顯示設(shè)備
pygame.draw 繪制形狀、線和點
pygame.event    管理事件
pygame.font 使用字體
pygame.image    加載和存儲圖片
pygame.joystick 使用游戲手柄或者 類似的東西
pygame.key  讀取鍵盤按鍵
pygame.mixer    聲音
pygame.mouse    鼠標(biāo)
pygame.movie    播放視頻
pygame.music    播放音頻
pygame.overlay  訪問高級視頻疊加
pygame  就是我們在學(xué)的這個東西了……
pygame.rect 管理矩形區(qū)域
pygame.sndarray 操作聲音數(shù)據(jù)
pygame.sprite   操作移動圖像
pygame.surface  管理圖像和屏幕
pygame.surfarray    管理點陣圖像數(shù)據(jù)
pygame.time 管理時間和幀信息
pygame.transform    縮放和移動圖像

有些模塊可能在某些平臺上不存在弛槐,你可以用None來測試一下。

Python

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

新的Hello World
學(xué)程序一開始我們總會寫一個Hello world程序依啰,但那只是在屏幕上寫了兩個字乎串,現(xiàn)在我們來點更帥的!寫好以后會是這樣的效果:


pygame_hello_world

Python

#!/usr/bin/env python

background_image_filename = 'sushiplate.jpg'
mouse_image_filename = 'fugu.png'
#指定圖像文件名稱

import pygame
#導(dǎo)入pygame庫
from pygame.locals import *
#導(dǎo)入一些常用的函數(shù)和常量
from sys import exit
#向sys模塊借一個exit函數(shù)用來退出程序

pygame.init()
#初始化pygame,為使用硬件做準(zhǔn)備

screen = pygame.display.set_mode((640, 480), 0, 32)
#創(chuàng)建了一個窗口
pygame.display.set_caption("Hello, World!")
#設(shè)置窗口標(biāo)題

background = pygame.image.load(background_image_filename).convert()
mouse_cursor = pygame.image.load(mouse_image_filename).convert_alpha()
#加載并轉(zhuǎn)換圖像

while True:
#游戲主循環(huán)

    for event in pygame.event.get():
        if event.type == QUIT:
            #接收到退出事件后退出程序
            exit()

    screen.blit(background, (0,0))
    #將背景圖畫上去

    x, y = pygame.mouse.get_pos()
    #獲得鼠標(biāo)位置
    x-= mouse_cursor.get_width() / 2
    y-= mouse_cursor.get_height() / 2
    #計算光標(biāo)的左上角位置
    screen.blit(mouse_cursor, (x, y))
    #把光標(biāo)畫上去

    pygame.display.update()
    #刷新一下畫面

這個程序需要兩張圖片,你可以在這篇文章最后的地方找到下載地址叹誉,雖然你也可以隨便找兩張鸯两。為了達(dá)到最佳效果,背景的 sushiplate.jpg應(yīng)要有640×480的分辨率长豁,而光標(biāo)的fugu.png大約應(yīng)為80×80钧唐,而且要有Alpha通道(如果你不知道這是 什么,還是下載吧……)匠襟。注意:代碼中的注釋我使用的是中文钝侠,如果執(zhí)行報錯,可以直接刪除酸舍。
**游戲中我已經(jīng)為每一行寫了注釋帅韧,另外如果打算學(xué)習(xí),強(qiáng)烈建議自己動手輸入一遍而不是復(fù)制粘貼啃勉!
稍微講解一下比較重要的幾個部分:
set_mode會返回一個Surface對象忽舟,代表了在桌面上出現(xiàn)的那個窗口,三個參數(shù)第一個為元祖淮阐,代表分 辨率(必須)叮阅;第二個是一個標(biāo)志位,具體意思見下表泣特,如果不用什么特性浩姥,就指定0;第三個為色深群扶。

標(biāo)志位 功能
FULLSCREEN  創(chuàng)建一個全屏窗口
DOUBLEBUF   創(chuàng)建一個“雙緩沖”窗口及刻,建議在HWSURFACE或者OPENGL時使用
HWSURFACE   創(chuàng)建一個硬件加速的窗口,必須和FULLSCREEN同時使用
OPENGL  創(chuàng)建一個OPENGL渲染的窗口
RESIZABLE   創(chuàng)建一個可以改變大小的窗口
NOFRAME 創(chuàng)建一個沒有邊框的窗口

convert函數(shù)是將圖像數(shù)據(jù)都轉(zhuǎn)化為Surface對象竞阐,每次加載完圖像以后就應(yīng)該做這件事件(事實上因為 它太常用了缴饭,如果你不寫pygame也會幫你做);convert_alpha相比convert骆莹,保留了Alpha 通道信息(可以簡單理解為透明的部分)颗搂,這樣我們的光標(biāo)才可以是不規(guī)則的形狀。
游戲的主循環(huán)是一個無限循環(huán)幕垦,直到用戶跳出丢氢。在這個主循環(huán)里做的事情就是不停地畫背景和更新光標(biāo)位置,雖然背景是不動的先改,我們還是需要每次都畫它疚察, 否則鼠標(biāo)覆蓋過的位置就不能恢復(fù)正常了。
blit是個重要函數(shù)仇奶,第一個參數(shù)為一個Surface對象貌嫡,第二個為左上角位置。畫完以后一定記得用update更新一下,否則畫面一片漆黑岛抄。
這是一個最最大概的Pygame程序的印象别惦,接下來我們會學(xué)習(xí)更多深層次的東西,并且把各條語句都真正讀懂夫椭。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末掸掸,一起剝皮案震驚了整個濱河市锌畸,隨后出現(xiàn)的幾起案子嘲更,更是在濱河造成了極大的恐慌元镀,老刑警劉巖既棺,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件醋奠,死亡現(xiàn)場離奇詭異鳍寂,居然都是意外死亡搔确,警方通過查閱死者的電腦和手機(jī)杆烁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進(jìn)店門陪竿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來禽翼,“玉大人,你說我怎么就攤上這事族跛∪虻玻” “怎么了?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵礁哄,是天一觀的道長长酗。 經(jīng)常有香客問我,道長桐绒,這世上最難降的妖魔是什么夺脾? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮茉继,結(jié)果婚禮上咧叭,老公的妹妹穿的比我還像新娘。我一直安慰自己烁竭,他們只是感情好菲茬,可當(dāng)我...
    茶點故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著派撕,像睡著了一般婉弹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上终吼,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天镀赌,我揣著相機(jī)與錄音,去河邊找鬼际跪。 笑死商佛,一個胖子當(dāng)著我的面吹牛蛙粘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播威彰,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼穴肘!你這毒婦竟也來了歇盼?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤评抚,失蹤者是張志新(化名)和其女友劉穎豹缀,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體慨代,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡邢笙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了侍匙。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片氮惯。...
    茶點故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖想暗,靈堂內(nèi)的尸體忽然破棺而出妇汗,到底是詐尸還是另有隱情,我是刑警寧澤说莫,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布杨箭,位于F島的核電站,受9級特大地震影響储狭,放射性物質(zhì)發(fā)生泄漏互婿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一辽狈、第九天 我趴在偏房一處隱蔽的房頂上張望慈参。 院中可真熱鬧,春花似錦稻艰、人聲如沸懂牧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽僧凤。三九已至,卻和暖如春元扔,著一層夾襖步出監(jiān)牢的瞬間躯保,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工澎语, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留途事,地道東北人验懊。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像尸变,于是被迫代替她去往敵國和親义图。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,573評論 2 359

推薦閱讀更多精彩內(nèi)容