久久精品国产亚洲高清|精品日韩中文乱码在线|亚洲va中文字幕无码久|伊人久久综合狼伊人久久|亚洲不卡av不卡一区二区|精品久久久久久久蜜臀AV|国产精品19久久久久久不卡|国产男女猛烈视频在线观看麻豆

千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機(jī)構(gòu)

手機(jī)站
千鋒教育

千鋒學(xué)習(xí)站 | 隨時隨地免費學(xué)

千鋒教育

掃一掃進(jìn)入千鋒手機(jī)站

領(lǐng)取全套視頻
千鋒教育

關(guān)注千鋒學(xué)習(xí)站小程序
隨時隨地免費學(xué)習(xí)課程

當(dāng)前位置:首頁  >  技術(shù)干貨  > python的新手指南

python的新手指南

來源:千鋒教育
發(fā)布人:xqq
時間: 2023-11-06 22:44:43 1699281883

Pygame是SDL的一個python封裝,由PeteShinners編寫。使用pygame,你可以用Python寫游戲或其它的多媒體應(yīng)用程序,它們將穩(wěn)定地運行在SDL支持的任何平臺上(Windows,Unix,Mac,beOS和其它等等)。

Pygame容易學(xué)習(xí),但是圖形編程的世界對于新來者來說,可能是相當(dāng)混亂的。我寫這篇文章的目的是試圖提煉出我過去那些年來所獲得的或使用pygame的得到的那些有用的知識。Pygame的前身是pySDL。我是按照這些問題的重要性的次序來排列的,但是這些心得對你的幫助程序取決于你自己的知識背景和你的項目的情況。

1、熟練使用python

如果你使用你不熟悉的語言進(jìn)行圖形編程的話,學(xué)起來會比較復(fù)雜的。用Python寫一些量不大的非圖形化程序——分析一些文本文件,寫一些競猜類游戲或記帳類程序或其它等等。輕松地處理字符串和列表——知道如何去分離(split),切片(slice)和合并字符串和列表。知道如何導(dǎo)入(import)——試著寫一個程序,該程序的代碼分散在幾個源文件中。寫你自己的函數(shù),并練習(xí)處理數(shù)字和字符;知道如何在二者之間作轉(zhuǎn)換。要記住使用列表和字典的語法——你不會想每次需要對一個列表進(jìn)行切片或?qū)σ惶钻P(guān)鍵字分類時再去查看相應(yīng)的文檔。當(dāng)你遇到麻煩時,盡量不要去訪問郵件列表或聊天室。相反,應(yīng)該運行python的解釋器并對問題進(jìn)行幾個小時的調(diào)試。經(jīng)常翻閱相應(yīng)Python版的手冊。

當(dāng)然這些聽起來可能相當(dāng)?shù)目菰?,但是通過你對python的熟悉,當(dāng)你再用它寫你的游戲時,你會感到非常的有把握。并可大大提高工作效率。

2、明白自己真正需要pygame的哪些部分。

面對著pygame文檔索引頂部的那些混雜的類,可能讓人感到糊涂。但是你應(yīng)該認(rèn)識到,我們只需要這些功能的一小部分就可以完成大量的處理任務(wù)了。有許多的類,你可能幾乎都不會用到。

3、知道surface是什么

pygame的最重要的部分就是surface。只需要把一個surface看作一頁白紙就行了。你可以使用一個surface做很多的事情——你可以在其上繪制線條,在它上面的部分區(qū)域填充顏色,拷貝圖像到它上面和拷貝它上面圖像,設(shè)置或讀取它上面單個像素的顏色。一個surface可以是任意大小的尺寸(合理的),并且你想要多少surface,就可以創(chuàng)建多少個surface(同樣,要合理)。有一個surface是比較特殊的——你只能使用pygame.display.set_mode()創(chuàng)建僅一個。這個“displaysurface”代表屏幕;你對它所做的一切都將顯示在用戶的屏幕上。

那么如何創(chuàng)建surface呢?如上所述,你可以使用pygame.display.set_mode()來創(chuàng)建這個特殊的“displaysurface”。你可以通過使用image.load()來創(chuàng)建一個包含一個圖像的surface,你可以使用font.render()創(chuàng)建包含文本的一個surface。你甚至可以使用Surface()創(chuàng)建一個什么也不包含的surface。

surface的大多數(shù)的函數(shù)都不是關(guān)鍵性的,你只需要學(xué)習(xí)blit(),fill(),set_at(),get_at()就很好了。

4、使用surface.convert()

當(dāng)我第一次閱讀surface.convert()的文檔的時候,我并沒有在意它。我當(dāng)時所想的是“我只使用png格式,所以我所做的都將使用相同的格式。因此我不需要convert()”。結(jié)果我是非常錯誤的。

convert()指的格式不是文件格式(如png,jpeg,gif),它是指“像素格式”。是指surface記錄一個特定像素中的單個顏色的特殊方法。如果surface格式與顯示器格式不同,那么SDL將不得不對每個blit在傳輸過程中作出轉(zhuǎn)換——很明顯,這是一個耗時的過程。對于這些解釋你不必考慮太多;如果你想提高你的blit速度,那么只需記住必須使用convert()就可以了。

如何使用convert()?只需要在使用image.load()函數(shù)創(chuàng)建了一個surface后調(diào)用它就可以了。使用surface=pygame.image.load('foo.png').convert()來替換surface=pygame.image.load('foo.png')。

這很容易。當(dāng)你從磁盤載入一個圖像時,你只需要對每個surface調(diào)用convert()一次。你會得到滿意的結(jié)果;blit的速度得到大大的提高。

只有在你真正需要絕對控制一個圖像的內(nèi)在的格式時,你才不想使用convert()——比如說你正在寫一個圖像轉(zhuǎn)換程序或什么,并且你需要確保所輸出的文件與輸入的文件有相同的像素格式。如果你是在寫一個游戲,那么你需要的是速度。請使用convert()。

5、繪制rect(矩形區(qū)域)動畫

在pygame程序中,產(chǎn)生不恰當(dāng)?shù)膸l率的原因是對pygame.display.update()函數(shù)的不理解。使用pygame,僅僅繪制一些東西到“displaysurface”不會導(dǎo)致立即顯示到屏幕上——你需要調(diào)用pygame.display.update()。調(diào)用該函數(shù)有三種方法:

*pygame.display.update()——這將更新整個窗口(對于全屏顯示來說,將更新整個屏幕)。

*pygame.display.flip()——這個做相同的事情,并且如果你在使用雙緩沖硬件加速的話,它也會做正確的處理。

*pygame.display.update(矩形或矩形的列表)——這只更新你指定的屏幕區(qū)域。

多數(shù)圖形編程的新手都使用第一個方案——它們對于每幀都更新整個屏幕。緩慢的速度這一問題就產(chǎn)生了,大多數(shù)人對于這一速度是不可接受的。在我的機(jī)器上,調(diào)用update()要花35毫秒,聽起來也沒花多少時間呀,除非你認(rèn)識到1000/35=28,就是說最快每秒28幀。這不符合游戲的邏輯,難道就不blit,不輸入,不進(jìn)行音頻輸入?我其它什么也不做,就在哪里更新屏幕,這樣才能達(dá)到最大的幀頻28。啊...暈!

解決之道就是所謂的“繪制區(qū)域動畫”。代替每幀更新整個屏幕,我們只對幀所導(dǎo)致的部分區(qū)域的改變作更新。我通過跟蹤一個列表中的那些矩形來實現(xiàn)這個,然后在結(jié)束時調(diào)用update。對于移動子畫面(sprite)的具體描述如下:

1、blit(傳送)一塊背景到子畫面(sprite)對象的當(dāng)前位置上,使用這塊背景來抹去(覆蓋)當(dāng)前位置的子畫面。

2、把該子畫面的當(dāng)前位置矩形添加到一個所謂“待更新矩形”的列表中。

3、移動子畫面對象。

4、將子畫面繪制到它的新的位置

5、將子畫面的新位置添加到“待更新矩形”的列表中。

6、調(diào)用display.update(待更新矩形列表)。

這與以前在速度上的區(qū)別是令人驚訝的。

有兩種情況,你不會使用這種技術(shù)。首先就是每幀都要更新整個窗口和屏幕的情況下——考慮面對像一個實時空中戰(zhàn)略類的游戲或滾動條這類的平滑過度,你怎么做呢?簡短的回答是:不用pygame寫這類游戲。長點答案是我們可以一次移動幾個像素的距離;用不著使過度十分地平滑。這不會影響到玩家的游戲感覺。

最后要說明的是——不是每個游戲都要求高的幀頻。一個戰(zhàn)略類的戰(zhàn)爭游戲可能通過每秒僅作少量的更新就可容易地得到——在這種情況下,局部的更新所帶來的復(fù)雜性是沒有必要的。

6、硬件surface的麻煩性多于它們的使用價值

如果你已經(jīng)注意到了使用pygame.display.set_mode()可用到的各種標(biāo)記,你可能會有這樣的想法:“嘿,HWSURFACE!嗯,我喜歡——誰不喜歡硬件加速。哦...雙緩沖;嗯,聽起來感覺一定很快,我想我也想要!”這不是你的錯誤;我也曾經(jīng)在多年的三維游戲制作中相信硬件加速比較好,軟件表現(xiàn)較慢。

不幸的是,硬件表現(xiàn)帶來了一系列的缺點:

*它僅在某些平臺上工作。Windows的機(jī)器通??梢缘玫接布urfaces,如果你需要的話。其它大多數(shù)的平臺則不行。例如Linux,如果X4被安裝了,如果DGA2工作正常,如果可能能夠提供硬件surface,如果moons正確地對齊了,那么有可能能夠提供硬件surface。如果一個硬件surface是無效的,那么sdl將默默地使用一個軟件surface來代替。

*它只能工作在全屏狀態(tài)下。

*它使得每個像素的訪問復(fù)雜化了。如果你有一個硬件surface,那么在其上寫或讀單個像素值之前,你需要鎖住這個surface。如果你不這樣做,將發(fā)生壞的情況。之后,在操作系統(tǒng)整個混亂之前,你又需要迅速地解鎖。在pygame中這個過程大部是自動的,但還需要考慮剩下的部分。

*你失去了鼠標(biāo)指針。如果你批定HWSURFACE(并且實際的得到了它),你的鼠標(biāo)指針通常將立即消失(或時隱時現(xiàn)的狀態(tài))。你將需要創(chuàng)建一個子畫面來作為手工的鼠標(biāo)指針,并且你必須考慮指針的加速和靈敏度。活受罪。

*它可能會更慢。許多的驅(qū)動程序是沒有被加速的,并且由于所有的東西必須通過視頻總線傳送(除非你能夠?qū)⒛愕脑磗urface放入視頻儲存器),這可能導(dǎo)致比軟件訪問更慢。

硬件表現(xiàn)有它的地方。在Windows下它工作的十分可靠,所以如果你對跨平臺不感興趣,那么它可能給你帶來速度上的巨大的提高。然而,它也更加的令人頭痛和復(fù)雜。最好是堅持使用可靠的SWSURFACE,除非你確信知道你正在做什么。

7、不要因枝節(jié)問題而分心。

有時候,新的游戲程序員在對他們的游戲的成功方面不是真正關(guān)鍵的問題上花費了太多的時間。想要解決這些問題的心態(tài)是可理解的,但在一個游戲的創(chuàng)建過程中,還為之尚早,你甚至無法知道重要問題是什么,更何談你應(yīng)該做何選擇。結(jié)果可能是白費工夫。

例如,考慮如何組織你的圖形文件的問題。每個幀或子畫面都應(yīng)該考慮它自己的圖形文件嗎?或許所有的圖形都應(yīng)該被壓縮到一個文件?大量的時間被浪費在向郵件列表詢問問題,辨論答案上了。這是次要的問題,花在這些問題上的時間應(yīng)該用在編寫游戲代碼上。

8、Rect是你的朋友

雖然PeteShinners的包(Pygame)有酷的alpha效果和快速的blit速度,但是我必須得承認(rèn),我所喜歡的是它的Rect類(一個較低級的部分)。rect是一個簡單的矩形——僅由它的左上角和它的寬高所定義。許多pygame的函數(shù)都要求rect或矩形的序列作為參數(shù)。因些,如果我需要一個大小為左上角坐標(biāo)(10,20)和寬40,高50的矩形區(qū)域,我可以如下來得到:

rect=pygame.Rect(10,20,30,30)

rect=pygame.Rect((10,20,30,30))

rect=pygame.Rect((10,20),(30,30))

rect=(10,20,30,30)

rect=((10,20,30,30))

然而如果你使用上面前三個的任一個,你將可以通過rect訪問rect的實用的功能。這包括移動、縮小或增大rect(矩形)、發(fā)現(xiàn)兩個rect(矩形)相交、和各種碰撞檢測功能。

例如,假設(shè)我想得到所有包含點(x,y)的子畫面(sprite)的一個列表——或許玩家在此點敲擊了,或許該點是一個子彈的當(dāng)前位置。如果每個子畫面(sprite)都有一個.rect成員的話,就簡單了,我可以就這么實現(xiàn):

sprites_clicked=[spriteforspriteinall_my_sprites_listifsprite.rect.collidepoint(x,y)]

實際上除了你可以使用rect作為surface或圖形函數(shù)的參數(shù)以外,rect與surface或圖形函數(shù)沒有其它的關(guān)系。在某些與圖形無關(guān)的地方,你也可以使用rect,但是它們?nèi)匀恍枰欢x為矩形。對于rect用處很少的項目,我不會考慮使用它們。

9、不要考慮對全部的像素做碰撞檢測。

如果你已經(jīng)實現(xiàn)了子畫面的移動,你需要知道它們是否碰撞到了一起。那么你很有可能像下面這樣做:

1、檢查rect是否相撞。如果沒有就忽略。

2、對于在重疊區(qū)域中的每個像素,檢查兩個子畫面中的對應(yīng)像素是不是不透明的。如果是,則產(chǎn)生了碰撞。

也有其它的檢測方法,可以對子畫面的遮罩作與運算等等,但是在pygame中你所使用的這些方法,處理起來可能太慢。對于大多數(shù)游戲,或許只作一個子區(qū)域碰撞會更好——為每個子畫面(sprite)創(chuàng)建一個比實際圖像更小的rect(矩形),以用來作碰撞。這樣檢測會更快,雖然不太精確。

10、管理事件子系統(tǒng)

Pygame的事件系統(tǒng)是機(jī)智的。有兩種不同的方法用來發(fā)現(xiàn)哪個輸入設(shè)備(鍵盤、鼠標(biāo)或操縱桿)正在動作。第一種是通過直接檢查設(shè)備的狀態(tài)。你可以通過調(diào)用pygame.mouse.get_pos()或pygame.key.get_pressed()來實現(xiàn)。這將告訴你相關(guān)設(shè)備在函數(shù)(如pygame.mouse.get_pos()或pygame.key.get_pressed())調(diào)用時的狀態(tài)。

第二種方法是使用SDL事件隊列。該隊列是事件的一個列表——當(dāng)事件被檢測到時事件被添加到該列表,當(dāng)事件被從隊列中讀取后,該事件將被刪除。

每個系統(tǒng)都有優(yōu)點和缺點。狀態(tài)檢查(system1)讓你可以準(zhǔn)確地知道給定輸入設(shè)備的狀態(tài)——如果mouse.get_pressed([0])是1,意思就是此刻鼠標(biāo)左按鍵被按下了。事件隊列只報告鼠標(biāo)在過去某時被按下;如果你經(jīng)常均等機(jī)會地檢查事件隊列,那么還可以,但是使用額外的代碼檢查會有延遲。狀態(tài)檢查系統(tǒng)的另一個好處是容易檢測“chording”,也就是同時產(chǎn)生的幾個狀態(tài)。如果你想知道t和f鍵是否被同時按下,只需要如下檢查:

if(key.get_pressed[K_t]andkey.get_pressed[K_f]):

print"Yup!"

然而在隊列系統(tǒng)中,每個按鍵動作在隊列中是作為一個完全分離的事件的,因此,在檢查f鍵時,你需要去記住t鍵是否被按下了,并且還沒有恢復(fù)。有點復(fù)雜。

然而,狀態(tài)系統(tǒng)有一個很大的缺點。它只報告設(shè)備在函數(shù)調(diào)用時刻的狀態(tài);如果用戶在調(diào)用mouse.get_pressed()之前敲擊并釋放了鼠標(biāo),那么函數(shù)返回0——get_pressed()完全忽視了鼠標(biāo)的按下。然而對于隊列系統(tǒng),這兩個MOUSEBUTTONDOWN和MOUSEBUTTONUP事件仍將存于事件隊列中,等待被獲取和處理。

這個教訓(xùn)就是:選擇適合你的要求的事件系統(tǒng)。如果在你的循環(huán)中,你沒有太多的事情——就是說,你只是待在一個'while1'循環(huán)中,等待輸入,那么可以使用get_pressed()或另外的狀態(tài)函數(shù)。在另一方面,如果按鍵動作是不間斷的,延遲不太重要——比如你的用戶正在一個編輯框中鍵入一些東西,可以使用事件隊列,因為它們最終都會被處理。

一個要注意的是,event.poll()與event.wait()的比較——poll()可能更好一些,因為它在等待輸入時不會阻塞你的程序去做另外的事情——而wait()會將程序掛起直到一個事件被接受。然而poll()在運行時將用掉全部可用的cpu時間,并且它將使用NOEVENTS來填充事件隊列。使用set_blocked()來只選擇你感興趣的事件類型——你的隊列將容易維護(hù)的多。

11、Colorkey與Alpha的比較

圍繞著這兩種技術(shù),有很多不太清楚的地方,大多是因為術(shù)語的關(guān)系。

'Colorkeyblitting'意味著告訴pygame,在某個圖像中有著某種顏色的所有像素都是透明,取代了它們將是什么顏色。當(dāng)圖像的其余部分被blit時,這些透明的像素不被blit,并且因些不掩蓋背景。這就是我們?nèi)绾问棺赢嬅?sprite)不是矩形的方法。簡單地調(diào)用surface.set_colorkey(color),這里的color是一個rgb元組——比如(0,0,0)。這將使用源圖像的黑色的像素變成透明的。

'Alpha'不同,它有兩種。'Imagealpha'適用于整個圖像,并且大概也是你想要的。它用于設(shè)置不透明度。如果你設(shè)置一個surface的alpha為192,然后把它blit到一個背景上,那么每個像素顏色的3/4來自于源圖像,1/4取自背景。Alpha的值的范圍是255~0,0是完全透明,255是完全不透明。注意,colorkey和alpha在blit時可以被合并——這導(dǎo)致一個圖像在一些點是完全透明的,而別處是半透明的。

'Per-pixelalpha'是alpha的另一種,它更復(fù)雜。源圖像中的每個像素都有它自己的alpha值,從0到255。因此,當(dāng)每個像素被blit到一個背景上時可以有不同的不透明度。這種alpha不能與colorkey合并blit,并且它覆蓋單位圖像的alpha。'Per-pixelalpha'很少用在游戲中,要使用它,你必須在你的一個圖形編輯器中使用一個特殊的alphachannel來保存你的源圖像。它比較復(fù)雜——根本不要使用它。

12、工作的方式。

Pygame是一個優(yōu)秀的輕量級的SDL包。如果你已經(jīng)按我上面提及的方法做了,但是你的代碼的速度仍然慢,那么問題就在于你用python處理數(shù)據(jù)的方法。某些慣用的作法只會降低你的速度,不管你做什么。所以我們也可以作一些改變,雖然代碼可能看上去很笨拙,但有可能會提高速度。至于如何提高代碼的速度,你可以看一下相關(guān)的主題。過早的優(yōu)化是所有不好的結(jié)果的根源;如果代碼只是不足夠快,那么就不要再費力地想讓它更快了。

以上內(nèi)容為大家介紹了python的新手指南,希望對大家有所幫助,如果想要了解更多Python相關(guān)知識,請關(guān)注IT培訓(xùn)機(jī)構(gòu):千鋒教育。http://m.2667701.com/

聲明:本站稿件版權(quán)均屬千鋒教育所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
10年以上業(yè)內(nèi)強(qiáng)師集結(jié),手把手帶你蛻變精英
請您保持通訊暢通,專屬學(xué)習(xí)老師24小時內(nèi)將與您1V1溝通
免費領(lǐng)取
今日已有369人領(lǐng)取成功
劉同學(xué) 138****2860 剛剛成功領(lǐng)取
王同學(xué) 131****2015 剛剛成功領(lǐng)取
張同學(xué) 133****4652 剛剛成功領(lǐng)取
李同學(xué) 135****8607 剛剛成功領(lǐng)取
楊同學(xué) 132****5667 剛剛成功領(lǐng)取
岳同學(xué) 134****6652 剛剛成功領(lǐng)取
梁同學(xué) 157****2950 剛剛成功領(lǐng)取
劉同學(xué) 189****1015 剛剛成功領(lǐng)取
張同學(xué) 155****4678 剛剛成功領(lǐng)取
鄒同學(xué) 139****2907 剛剛成功領(lǐng)取
董同學(xué) 138****2867 剛剛成功領(lǐng)取
周同學(xué) 136****3602 剛剛成功領(lǐng)取
相關(guān)推薦HOT