1. 介紹
游戲是編程應(yīng)用較多的地方。即使是寫一個(gè)最簡單的游戲,你要熟悉UI制作,數(shù)學(xué),物理學(xué),甚至人工智能。這是一個(gè)練習(xí)編程的非常有趣的方式。
如果你是(或者不是)python語言的粉絲,你對游戲很感興趣,那么pygame是一個(gè)非常棒的游戲編程庫,你需要仔細(xì)的來學(xué)習(xí)它。它可以運(yùn)行在所有的主流平臺(tái)上,提供簡單的工具函數(shù)就能處理復(fù)雜的圖像處理,比如圖像的移動(dòng)、聲音等。
網(wǎng)上有很多pygame的入門教程,但它們很多都是講基本的。甚至Pygame book也屬于介紹性級(jí)別的。為了更進(jìn)一步提高對pygame的掌握,我決定寫一個(gè)我自己的教程,希望能為使用pygame的人提供更進(jìn)一步的合理學(xué)習(xí)。
本教程明確鼓勵(lì)你去改進(jìn)代碼,并強(qiáng)烈推薦做一下后面的練習(xí)題,這些練習(xí)題可以讓你對學(xué)到內(nèi)容有更好的認(rèn)知。
2. 寫在前面
基于以上說的,這個(gè)教程并不適合初學(xué)者。如果你剛開始學(xué)習(xí)pygame,你可以看一下這些教程,推薦看這些基本的介紹教程。
在這里,我認(rèn)為你具備以下知識(shí):
1. Python(你可能不是它的高級(jí)用戶,但也完全不是一個(gè)初學(xué)者)。
2. 數(shù)學(xué)和物理學(xué)的基本知識(shí)(向量,正方形,運(yùn)動(dòng)定律,概率等等)。我會(huì)解釋所有非常見的知識(shí)點(diǎn),但我不會(huì)教你怎么增加向量,等等。
3. 對pygame的認(rèn)知。比如,你已經(jīng)學(xué)習(xí)過我之前提到的介紹性的pygame教程。、
還有要說的是,我之關(guān)注2D游戲,3D游戲會(huì)是更高層次更復(fù)雜,我會(huì)提出一個(gè)不是很完整的3D游戲樣本。
3. 讓我們開始吧
在這個(gè)部分,我們完整寫一個(gè)游戲樣例:模擬爬蟲,一些生物在屏幕上移動(dòng),從墻上彈回來,時(shí)不時(shí)的改變方向。
雖然這稱不上是一個(gè)游戲,但這是我們實(shí)現(xiàn)更多不同想法的好的起點(diǎn)。I’ll leave myself the luxury of postponing the decision of which game it will eventually be, for now.
4. 代碼
第一部分完整的代碼包,包括需要的圖片,可以在這里下載。我建議你下載下來并運(yùn)行它。一遍看教程,一遍看代碼將會(huì)對你非常有好處。我在python2.5.2,pygame1.8.1上測試過了,也可能會(huì)在其它版本上運(yùn)行比較好。
5. pygame的文檔
pygame的API文檔很全。這里有pygame全部模塊,類,常量,函數(shù)的列表,我建議對你不熟悉的類或者方法,多去查找這個(gè)文檔。
6. 爬蟲
好吧,我先明確以下該部分的目標(biāo):
那么爬蟲是什么?
爬蟲是一張圖片,在pygame的驅(qū)動(dòng)下,能夠移動(dòng)或者旋轉(zhuǎn)。由于圖片的制作超出我的能力,我只讓爬蟲能夠向左右上下移動(dòng),而45度方向移動(dòng)無法實(shí)現(xiàn)。
爬蟲的圖片包含在下載包中的小的.png文件中。
注意到所有的爬蟲圖片頭部方向都是一致的。
爬蟲是怎么移動(dòng)的?如果你確定讀過一個(gè)基本的pygame教程(沒有嗎?),你會(huì)知道移動(dòng)其實(shí)是一種幻覺。電腦屏幕上沒真正移動(dòng)的東西。其實(shí),程序會(huì)對一系列圖片以比人眼睛快的多的速度進(jìn)行移位。每秒30次或更多次刷新,會(huì)讓圖片看上去更加平滑。為了實(shí)現(xiàn)周期性的刷屏,游戲有一個(gè)"game loop"
7. 游戲循環(huán)
和GUI程序一樣,每個(gè)游戲都有一個(gè)“主循環(huán)”。在pygame中,使用了一個(gè)簡單的循環(huán),如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | # The main game loop # while True : # Limit frame speed to 50 FPS # time_passed = clock.tick( 50 ) for event in pygame.event.get(): if event. type = = pygame.QUIT: exit_game() # Redraw the background screen.fill(BG_COLOR) # Update and redraw all creeps for creep in creeps: creep.update(time_passed) creep.blitme() pygame.display.flip() |
就如我說的,這是一個(gè)基本的python循環(huán)--直到用戶點(diǎn)擊關(guān)閉窗口后,會(huì)給出退出消息,響應(yīng)pygame.QUIT處理退出。
循環(huán)執(zhí)行頻度如何?這要取決于對clock.tick的調(diào)用。clock是pygame.time.Clock的對象,在此之前已經(jīng)創(chuàng)建。調(diào)用tick的意思是:在下一個(gè)1/50秒到來前主循環(huán)休眠。在實(shí)際生活中,這限制了游戲的速度為50FPS,這是有好處的。一方面,我們可以讓游戲更加平滑真實(shí),另一方面,可以使游戲不能占用太多cpu資源。你可以嘗試修改這個(gè)值,比如,當(dāng)此值小于10,那么這個(gè)程序?qū)?huì)是什么樣呢?我們看練習(xí)1和3.
現(xiàn)在是時(shí)候去看看關(guān)于tick的文檔了。
每次循環(huán)都會(huì)重繪背景顏色,并且所有的爬蟲會(huì)更新繪制。最終,整個(gè)屏幕會(huì)使用flip進(jìn)行刷新(你應(yīng)該看看它的文檔了)。
8. 在循環(huán)之前
現(xiàn)在讓我們看看在主循環(huán)之前都做了那些事情:ow let’s see what comes before the main loop:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | # Game parameters SCREEN_WIDTH, SCREEN_HEIGHT = 400 , 400 BG_COLOR = 150 , 150 , 80 CREEP_FILENAMES = [ 'bluecreep.png' , 'pinkcreep.png' , 'graycreep.png' ] N_CREEPS = 20 pygame.init() screen = pygame.display.set_mode( (SCREEN_WIDTH, SCREEN_HEIGHT), 0 , 32 ) clock = pygame.time.Clock() # Create N_CREEPS random creeps. creeps = [] for i in range (N_CREEPS): creeps.append(Creep(screen, choice(CREEP_FILENAMES), ( randint( 0 , SCREEN_WIDTH), randint( 0 , SCREEN_HEIGHT)), ( choice([ - 1 , 1 ]), choice([ - 1 , 1 ])), 0.1 )) |
開始的幾行都是可以自說明的,我認(rèn)為你已經(jīng)了解如何初始化pygame,并且創(chuàng)建display對象。但是爬蟲對象的創(chuàng)建呢?
爬蟲是一系列爬蟲對象的集合,這是整個(gè)游戲的心臟和靈魂。下面是爬蟲類的聲明和其構(gòu)造函數(shù)的定義。
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 | class Creep(Sprite): """ A creep sprite that bounces off walls and changes its direction from time to time. """ def __init__( self , screen, img_filename, init_position, init_direction, speed): """ Create a new Creep. screen: The screen on which the creep lives (must be a pygame Surface object, such as pygame.display) img_filaneme: Image file for the creep. init_position: A vec2d or a pair specifying the initial position of the creep on the screen. init_direction: A vec2d or a pair specifying the initial direction of the creep. Must have an angle that is a multiple of 45 degres. speed: Creep speed, in pixels/millisecond (px/ms) """ |
構(gòu)造函數(shù)的參數(shù)有詳細(xì)的說明文檔,你可以看到它們在爬蟲被創(chuàng)建時(shí)如何匹配的。
1 2 3 4 5 6 7 | creeps.append(Creep(screen, choice(CREEP_FILENAMES), ( randint( 0 , SCREEN_WIDTH), randint( 0 , SCREEN_HEIGHT)), ( choice([ - 1 , 1 ]), choice([ - 1 , 1 ])), 0.1 )) |
首先,我們傳遞screen surface給爬蟲類。爬蟲將使用它判讀如何從墻上反彈回來,如何去繪制自己。
其次,爬蟲可以從圖片列表中任意選擇一個(gè)(choice是一個(gè)標(biāo)準(zhǔn)的python模塊),它有一個(gè)屏幕隨機(jī)位置,隨機(jī)的方向,移動(dòng)速度被設(shè)定為0.1像素/每毫秒,或者說100個(gè)像素/秒。英文原地址 http://eli.thegreenplace.net/2008/12/13/writing-a-game-in-python-with-pygame-part-i/
聯(lián)系客服