最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python游戲開發(fā)之精靈和精靈組

 更新時(shí)間:2023年05月03日 10:15:58   作者:<GOOD?LUCK>  
python作為當(dāng)前非常受歡迎的編程語言,很大一部分原因是擁有豐富的庫,這篇文章主要給大家介紹了關(guān)于Python游戲開發(fā)之精靈和精靈組的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下

1. 基本概念

接下來介紹兩個(gè)pygame中提供的高級(jí)類, 精靈和精靈組.

在介紹這兩個(gè)類之前, 先來共同回顧一下到目前為止掌握的游戲開發(fā)套路.

在游戲初始化,需要加載一下游戲中所有的圖像, 然后呢,在游戲循環(huán)中,需要針對每張圖像來編寫代碼、修改圖像的位置,并且需要用screen對象來調(diào)用一下blit 方法,把所有變化位置的圖像重新做一個(gè)繪制.

那現(xiàn)在假設(shè)開發(fā)的游戲,需要處理100張圖像,意味著游戲循環(huán)內(nèi)部的代碼就會(huì)變得非常的繁瑣.

因?yàn)樾枰谟螒蜓h(huán)中針對每張圖像的位置變化,編寫代碼,然后再讓screen對象調(diào)用blit 方法依次繪制每個(gè)圖像,這樣的代碼呢,就顯得太繁瑣了.

那怎么樣有效的解決這個(gè)問題呢?pygame就提供了兩個(gè)高級(jí)類,一個(gè)是精靈,一個(gè)是精靈組.

精靈這個(gè)詞匯聽起來有些奇怪,可以把精靈理解成一個(gè)對象,在一個(gè)精靈對象中有兩個(gè)重要的屬性,一個(gè)是精靈要顯示的圖像數(shù)據(jù),一個(gè)是精靈要把這個(gè)圖像顯示在屏幕上的位置.

一句話講,包含了圖像數(shù)據(jù)和顯示位置的對象,就可以把它叫做精靈,同時(shí)呢,在精靈類中啊,還提供了一個(gè)非常重要的方法update,

在開發(fā)時(shí), 可以根據(jù)不同的游戲角色派生出不同的游戲子類, 然后在每個(gè)子類中根據(jù)各自的需求分別重寫各自的update 方法, 在update 方法中, 專門來處理一下當(dāng)前這個(gè)游戲角色位置變化的代碼, 這個(gè)就是update方法的作用. 

之所以要派生子類, 是因?yàn)椴煌挠螒蚪巧谄聊簧系倪\(yùn)動(dòng)方式是不一樣的,.

一個(gè)精靈類, 提供了一個(gè)image屬性, 提供了一個(gè)rect 屬性,并且提供了一個(gè)重要的update方法.

這個(gè)就是精靈類最重要的兩個(gè)屬性和一個(gè)方法.

那接下來看一下精靈組,從字面上來看,精靈組是一個(gè)包含了多個(gè)精靈的對象,在創(chuàng)建精靈組的時(shí)候可以使用多值參數(shù)的方式,一次性把精靈組中包含的所有精靈傳入到精靈組內(nèi)部.

當(dāng)有了精靈組之后,當(dāng)創(chuàng)建了一個(gè)精靈組之后,在編寫游戲循環(huán)代碼時(shí),只需要在游戲循環(huán)中,讓精靈組調(diào)用兩個(gè)方法,第一個(gè)方法update,第二個(gè)方法draw.

這兩個(gè)方法有什么作用呢?當(dāng)讓精靈組 調(diào)用update方法時(shí),精靈組,就會(huì)讓組中所有的精靈,各自調(diào)用各自的update方法,精靈組調(diào)用一次update 方法,精靈組中所有的精靈就會(huì)各自調(diào)用各自的update方法.

各自都用各自的update方法,就可以根據(jù)游戲的需求,各自修改各自不同的位置,當(dāng)所有的精靈更新完位置之后,再讓精靈組調(diào)一下draw 方法,同時(shí)呢,把屏幕對象當(dāng)作參數(shù)傳遞給 draw 方法, draw 方法會(huì)把精靈組中所有精靈的image繪制到屏幕上每一個(gè)精靈對應(yīng)的rect 位置。

在精靈中包含有兩個(gè)重要的屬性,一個(gè)是精靈要顯示的圖像數(shù)據(jù),一個(gè)是精靈在屏幕上的位置,而在游戲循環(huán)中,讓精靈組調(diào)用一下draw 方法,就可以一次性的把精靈組所有的精靈圖像,各自繪制到不同的位置上.

這個(gè)就是使用精靈組之后,游戲循環(huán)的代碼能夠得到大大的改善.

但是務(wù)必要注意哦,當(dāng)讓精靈組調(diào)用了draw 方法之后,如果希望在屏幕上看到最終的繪制結(jié)果,同樣是需要調(diào)用一下display模塊兒提供的update的方法,因?yàn)榘?,只有調(diào)用了update的方法,才能夠在屏幕上看到最終的繪制結(jié)果。

簡單介紹了一下pygame中提供的兩個(gè)高級(jí)類,一個(gè)是精靈,一個(gè)是精靈組.

在精靈類中封裝了兩個(gè)重要的屬性,一個(gè)是精靈顯示的圖像數(shù)據(jù)image ,一個(gè)是精靈在屏幕上對應(yīng)的顯示位置rect ,同時(shí),每個(gè)精靈都各自有自己不同的update 方法,在開發(fā)時(shí)可以派生一個(gè)精靈的子類,根據(jù)游戲角色不同,重寫update的方法,在update 方法內(nèi)部,針對當(dāng)前這個(gè)精靈角色編寫代碼、修改精靈的位置就可以,當(dāng)精靈建立完成,就可以建立一個(gè)精靈組,一個(gè)精靈組是可以包含多個(gè)精靈的,當(dāng)有了精靈組之后再編寫游戲循環(huán)的代碼,只需要讓精靈組調(diào)用update的方法,update 方法就可以讓所有的精靈同時(shí)更新位置,然后呢,再調(diào)一下draw 方法,draw 方法就會(huì)把更新位置之后的精靈繪制到屏幕對應(yīng)的位置,這個(gè)就是精靈和精靈組的作用.

2. 自定義精靈子類需求分析

接下來就做一下派生精靈子類的演練,先共同來明確一下派生精靈子類這個(gè)演練的需求與步驟,第一步啊,要在項(xiàng)目中建立一個(gè)plane_sprites.py 的python 文件.

從這一小節(jié)開始,就要正式的進(jìn)入到面向?qū)ο蟪绦蜷_發(fā)了,而在使用面向?qū)ο蟪绦蜷_發(fā)時(shí),給每個(gè)模塊起名都需要有一個(gè)意識(shí),就是起一個(gè)稍微正式一些的名字,而在這一小節(jié)派生出來的精靈子類會(huì)用在后續(xù)的飛機(jī)大戰(zhàn)實(shí)戰(zhàn)中, 所以啊,給他起一個(gè)稍微正式一些的名字,飛機(jī)精靈,然后呢,在這個(gè)模塊中建立一個(gè)Game_Sprites類,讓這個(gè)游戲精靈類繼承自pygame提供的精靈類pygame.sprites.Sprites .

在這里提示一下,在使用pygame時(shí),第一個(gè)點(diǎn)后面通常是模塊的名稱,而第二個(gè)點(diǎn)后面才是類的名稱,回顧一下,在給類起名時(shí),首字母應(yīng)該大寫,所以啊,pygame提供的精靈類準(zhǔn)確的名稱是點(diǎn)兒sprite點(diǎn)兒Sprite.

第一個(gè)sprite是模塊的名稱,第二個(gè)Sprite才是類的名稱.

現(xiàn)在要重點(diǎn)強(qiáng)調(diào)一個(gè)話題,在使用面向?qū)ο箝_發(fā)時(shí),如果某一個(gè)類的父類不是object這個(gè)基類,也就是開發(fā)的這個(gè)類,不是繼承自object基類,那么,在這個(gè)類的初始化方法中, 一定要先調(diào)用一下父類的初始化方法,現(xiàn)在要開發(fā)的游戲精靈類是繼承自pygame的精靈類,那么試想一下,在這個(gè)父類的初始化方法中,是不是很有可能已經(jīng)提前封裝了一部分代碼,那么,如果在子類的初始化方法中不調(diào)用父類的初始化方法,就不能夠享受到父類中原本封裝的代碼.

所以啊,為了保證父類原本封裝的初始化代碼能夠正常的被執(zhí)行,在開發(fā)時(shí)一定要記住,如果開發(fā)的子類不是繼承自object這個(gè)基類,那么,在初始化方法中一定都要主動(dòng)調(diào)用一下父類的初始化方法.

來看一下游戲精靈類的需求,在游戲精靈類中啊,封裝三個(gè)屬性,分別是image, rect 和speed ,speed這個(gè)單詞翻譯過來是速度的意思,現(xiàn)在要做的是飛機(jī)大戰(zhàn)的游戲.

飛機(jī)大戰(zhàn)意味著屏幕上的每一個(gè)精靈都各自擁有不同的飛行速度,所以在這一小節(jié)的演練中,就在游戲精靈這個(gè)類中封裝一個(gè)速度的屬性.

要給對象定義屬性應(yīng)該在初始化方法中定義,那現(xiàn)在再強(qiáng)調(diào)一下,這一小節(jié)要編寫的精靈子類是繼承自pygame的精靈類的,所以啊,必須要在初始化方法中主動(dòng)調(diào)用一下父類的初始化方法,只有這樣才能夠保證父類已經(jīng)封裝好的初始化代碼能夠被正常的執(zhí)行,那現(xiàn)在來看一下初始化方法的參數(shù).

第一個(gè)參數(shù)是image_name,第二個(gè)參數(shù)是speed ,有了image_name這個(gè)參數(shù),就可以在初始化方法中通過image.load來加載出圖像,當(dāng)圖像加載出來之后,怎么樣指定圖像的rect 屬性呢?在這里分享的小技巧,在pygame的image對象,提供了一個(gè)get_rect()方法,

讓圖像調(diào)用一下這個(gè)方法就會(huì)返回一個(gè)矩形對象, 矩形對象的x, y都是0,但是矩形對象的寬和高就是剛剛加載出來的圖像的寬和高.

通過get_rect() 這個(gè)方法,就能夠在初始化方法內(nèi)部非常方便的指令一下圖像精靈的初始位置,然后呢,再使用speed 這個(gè)參數(shù)來指定一下游戲精靈的初始速度,如果在調(diào)用時(shí)不指定速度,就使用默認(rèn)的1 來設(shè)置一下游戲精靈的速度.

這個(gè)就是游戲精靈中,要封裝的三個(gè)屬性,圖像,位置以及速度,那接下來再來看一下update這個(gè)方法,在這一小節(jié)演練中,Update這個(gè)方法,讓圖像精靈的y值跟速度進(jìn)行相加,要修改y值會(huì)讓游戲精靈在屏幕的垂直方向進(jìn)行運(yùn)動(dòng),這個(gè)就是接下來要派生的精靈子類的需求.

一句話講封裝三個(gè)屬性,圖像, 位置以及速度, 重寫一個(gè)update的方法,在update方法中,讓游戲精靈在屏幕上做垂直方向的運(yùn)動(dòng).

3. 派生精靈子類代碼實(shí)現(xiàn)

接下來就參照這張類圖共同實(shí)現(xiàn)一下游戲精靈的子類開發(fā),已經(jīng)提前準(zhǔn)備好了plane_sprites 這個(gè)模塊文件.

在這一小節(jié)要開發(fā)的游戲精靈是繼承自pygame的精靈子類,所以啊,應(yīng)該先在模塊中使用import關(guān)鍵字導(dǎo)入一下pygame這個(gè)模塊兒, 導(dǎo)入之后,就使用class關(guān)鍵字來給類起個(gè)名字,GameSprite,然后在小括號(hào)中指令一下游戲精靈的父類,寫下pygame.sprite,

 第一個(gè)sprite是模塊的名稱,需要再敲一個(gè)點(diǎn)兒,然后輸入大寫的Sprite , 大寫的Sprite才是類的名稱.

 那現(xiàn)在就在類名下方增加一個(gè)文檔注釋, 寫一下飛機(jī)大戰(zhàn)游戲精靈, 文檔注釋增加完成, 再來看一下類圖,

 在游戲精靈類GameSprite中, 需要封裝三個(gè)屬性, 既然要定義對象的屬性, 就應(yīng)該先實(shí)現(xiàn)一下初始化方法.

 在初始化方法的參數(shù)中, 需要傳入圖像的名稱image_name, 以及精靈的初始速度speed.

先使用def 關(guān)鍵字找到__init__ 這個(gè)初始化方法, 然后呢, 然后增加兩個(gè)形參. 初始化方法準(zhǔn)備完成, 先敲一個(gè)pass 占位, 現(xiàn)在一個(gè)簡單的初始化方法就準(zhǔn)備完成了.

pycharm 以深黃色的背景提示初始化方法沒有調(diào)用父類的初始化方法,之前提到過, 當(dāng)在開發(fā)時(shí)某一個(gè)子類的父類不是object基類,一定要在初始化方法中主動(dòng)調(diào)用一下父類的初始化方法.

那現(xiàn)在就增加兩個(gè)注釋, 第一步呢,應(yīng)該調(diào)用父類的初始化方法,調(diào)用完成之后,再來定義對象的屬性,兩個(gè)步驟寫完, 要想調(diào)用父類的方法,應(yīng)該有一個(gè)特殊的對象,可以讓super這個(gè)對象來調(diào)用一下父類的初始化方法.

當(dāng)父類的初始化方法調(diào)用完成, 就可以在下方定義一下游戲精靈的三個(gè)屬性, 分別是圖形, 位置和速度這三個(gè)屬性.

先使用self點(diǎn) 來定義第一個(gè)屬性image, 要想從一個(gè)圖像文件中加載數(shù)據(jù),可以使用pygame點(diǎn)image,然后調(diào)用load 方法,把傳入的image_name 當(dāng)做參數(shù),傳遞給這個(gè)方法,這樣就可以把指定名稱的圖像加載到圖像屬性中了.

圖像屬性定義完成,緊接著定義一個(gè)rect 屬性,這個(gè)rect 屬性, 默認(rèn)大小,如果要是圖像的大小, 可以讓image 調(diào)用一下get_rect 方法,get_rect()方法返回的大小就是剛剛加載出來的圖像大小,同時(shí)x和y都是零.

現(xiàn)在第2個(gè)屬性定義完成,再來定義第3個(gè)屬性速度,

self.speed 就直接把形參的速度傳遞過來,現(xiàn)在三個(gè)屬性定義完成.

就把pass這個(gè)占位符刪除一下,

三個(gè)屬性定義完成,再來看一下類圖, 在這一小節(jié)中,還需要重寫一下父類的update方法,在update方法中,讓游戲的精靈在垂直方向上運(yùn)動(dòng),那現(xiàn)在就使用def 關(guān)鍵字, 然后輸入一個(gè)update小括號(hào).

update方法找到之后, 游戲精靈需要在垂直方向上移動(dòng),那現(xiàn)在增加一個(gè)注釋,在屏幕的垂直方向上移動(dòng),要在屏幕的垂直方向上移動(dòng),就可以修改一下self.rect屬性的y 屬性,讓y屬性來加上當(dāng)前的速度屬性,這樣相加之后意味著在創(chuàng)建對象時(shí)指定的速度不同,那么游戲精靈在屏幕上移動(dòng)的速度也會(huì)不同.

代碼演進(jìn)到這里,就實(shí)現(xiàn)了一下游戲精靈這個(gè)子類的代碼,讓游戲精靈繼承自pygame 的精靈類,同時(shí)在初始化方法中,先調(diào)用了一下父類的初始化方法,然后呢,按照類圖的需求依次定義了三個(gè)屬性,圖像, 位置以及速度,并且重寫了一下父類的update方法,在update的方法中,對rect 的y值做了一個(gè)修改,讓y值加上速度,這樣呢就能夠?qū)崿F(xiàn)讓游戲精靈按照垂直方向進(jìn)行移動(dòng)了.

再強(qiáng)調(diào)一下,因?yàn)樵陂_發(fā)子類的時(shí)候,如果子類的父類不是object這個(gè)基類, 一定要記住,在初始化方法中需要主動(dòng)的調(diào)用父類的初始化方法,因?yàn)椴恢鲃?dòng)調(diào)用父類的初始化方法就沒有辦法享受到父類中已經(jīng)封裝好的初始化代碼了.
 

4. 創(chuàng)建敵機(jī)并且實(shí)現(xiàn)敵機(jī)動(dòng)畫

接下來就使用剛剛派生的游戲精靈這個(gè)類來創(chuàng)建一個(gè)低級(jí)精靈對象,并且實(shí)現(xiàn)一下敵機(jī)的動(dòng)畫效果。在開始動(dòng)手之前,先讓來明確一下這一小節(jié)的演練步驟.

首先使用from這個(gè)關(guān)鍵字,把plane_sprites這個(gè)模塊導(dǎo)入一下,然后呢,在游戲初始化位置來創(chuàng)建一個(gè)敵機(jī)的精靈對象,并且創(chuàng)建一個(gè)敵機(jī)的精靈組對象.

當(dāng)精靈對象和精靈組對象創(chuàng)建完成,就在游戲循環(huán)中,讓精靈組對象分別調(diào)用一下update方法和draw 方法.

在開始演練之前,再強(qiáng)調(diào)一下精靈和精靈組這兩個(gè)對象的職責(zé),精靈對象是負(fù)責(zé)封裝精靈要顯示的圖像以及精靈在屏幕上的位置,并且封裝一下精靈的運(yùn)動(dòng)速度, 同時(shí)精靈這個(gè)對象還要提供一個(gè)update方法,在update方法中根據(jù)游戲的需求來更改自己的位置變化, 這個(gè)是精靈對象的職責(zé).

那么再看一下精靈組對象的職責(zé),精靈組對象可以包含多個(gè)精靈對象,當(dāng)精靈組對象建立完成,就可以在游戲循環(huán)中讓精靈組對象來調(diào)用update 方法和draw 方法,update 方法會(huì)讓精靈組中所有的精靈各自調(diào)用各自的update方法.

調(diào)用之后,精靈組中所有的精靈位置都會(huì)發(fā)生變化, 當(dāng)所有精靈的位置調(diào)整完畢,就讓精靈組再調(diào)用一下draw 方法,調(diào)用draw 方法之后就會(huì)把精靈組中所有的精靈全部繪制在screen這個(gè)屏幕對象上, 這個(gè)就是精靈和精靈組的職責(zé).

明確了演練步驟,并且強(qiáng)調(diào)了一下精靈和精靈組的職責(zé)之后,現(xiàn)在就做一下代碼演練,因?yàn)楝F(xiàn)在看到的代碼是之前一個(gè)小節(jié)完成的監(jiān)聽退出事件的代碼,先運(yùn)行一下程序驗(yàn)證一下現(xiàn)在的代碼執(zhí)行效果.

游戲啟動(dòng)了,

現(xiàn)在點(diǎn)擊叉叉,可以退出游戲.

這個(gè)是之前一個(gè)小節(jié)完成的代碼.

那在這一小結(jié)中,就在之前一個(gè)小節(jié)完成的代碼基礎(chǔ)上, 來實(shí)現(xiàn)一下敵機(jī)精靈的創(chuàng)建,并且實(shí)現(xiàn)一下敵機(jī)的動(dòng)畫效果.

首先把光標(biāo)放在第2行使用from這個(gè)關(guān)鍵字,從plane_sprites這個(gè)模塊來導(dǎo)入一下所有的內(nèi)容,

導(dǎo)入之后, 在開發(fā)時(shí)使用import 導(dǎo)入模塊和from 導(dǎo)入模塊有什么區(qū)別呀?使用import 導(dǎo)入模塊,在使用這個(gè)模塊時(shí),必須要使用模塊點(diǎn)的方式來使用.

而使用from來導(dǎo)入模塊,在使用時(shí)可以直接使用模塊提供的工具,而不再需要輸入模塊的名稱.

現(xiàn)在飛機(jī)精靈的模塊導(dǎo)入之后,就把代碼向下方滾動(dòng),來找到游戲循環(huán),為了看清楚這一小節(jié)完成的代碼,在游戲循環(huán)上方多增加幾個(gè)空行.

現(xiàn)在先增加一個(gè)單行注釋來明確一下這一小節(jié)要演練的重點(diǎn). 在游戲初始化位置應(yīng)該創(chuàng)建敵機(jī)的精靈,創(chuàng)建完精靈之后, 還需要?jiǎng)?chuàng)建敵機(jī)的精靈組,精靈要在初始化位置創(chuàng)建, 精靈組同樣也要在初始化位置創(chuàng)建.

那現(xiàn)在就把光標(biāo)放在31行,先給敵機(jī)的精靈起個(gè)名字叫做enemy ,然后使用上一小節(jié)派生的游戲精靈類來創(chuàng)建一個(gè)精靈對象.

在創(chuàng)建精靈對象時(shí), 第1個(gè)參數(shù)需要指定圖像的名稱,那現(xiàn)在先寫一個(gè)點(diǎn)表示當(dāng)前目錄,然后寫一個(gè)image,那要加載哪一張圖像呢?就把images這個(gè)目錄展開,敵機(jī)的圖像是enemy1,那么就在image 后面寫上enemy1.png ,圖像指定完成,一個(gè)敵機(jī)的精靈也創(chuàng)建完成.

那現(xiàn)在就來創(chuàng)建一下敵機(jī)的精靈組,同樣先給精靈組起個(gè)名字enemy_group,然后呢,使用pygame提供的sprite模塊中提供的Group類來創(chuàng)建一個(gè)精靈組,

在創(chuàng)建精靈組的時(shí)候,可以把多個(gè)精靈以多值參數(shù)的方式傳遞給精靈組, 那么就把剛剛創(chuàng)建的敵機(jī)精靈傳遞給這個(gè)精靈組,現(xiàn)在敵機(jī)的精靈組也創(chuàng)建完成了.

那現(xiàn)在有了精靈,也有了精靈組, 但現(xiàn)在運(yùn)行程序不能夠看到敵機(jī)的畫面.

因?yàn)橐吹綌硻C(jī)的畫面,需要在游戲循環(huán)中讓精靈組調(diào)用draw 方法.

來先運(yùn)行驗(yàn)證一下,游戲啟動(dòng)了,但是只有英雄的飛機(jī)孤孤單單,并沒有敵機(jī)的身影,那現(xiàn)在先停止一下程序.

現(xiàn)在已經(jīng)在游戲初始化位置創(chuàng)建出來了敵機(jī)的精靈, 創(chuàng)建出來了敵機(jī)的精靈組,那接下來應(yīng)該把代碼移動(dòng)到游戲循環(huán)內(nèi)部,在游戲循環(huán)中讓敵機(jī)的精靈組來調(diào)用兩個(gè)方法,那現(xiàn)在就找到update這個(gè)方法,然后多增加幾個(gè)空行,在這里先增加一個(gè)注釋,讓精靈組調(diào)用兩個(gè)方法.

讓精靈組需要調(diào)用哪兩個(gè)方法,第1個(gè)方法是update,第2個(gè)方法是draw.

update 方法可以讓精靈組中所有的精靈對象都執(zhí)行一下update 方法,而draw 方法呢,會(huì)把精靈組中所有精靈的圖像繪制在屏幕上,那現(xiàn)在就使用enemy_group來調(diào)用一下update方法,enemy_group.update(), 調(diào)用完成,再讓enemy_group來調(diào)用一下draw 方法, enemy_group.draw(screen).

在調(diào)用draw 方法的時(shí)候,需要把屏幕對象傳遞給方法,因?yàn)榫`組需要知道把精靈組內(nèi)部的精靈繪制到誰的身上,現(xiàn)在就選中draw 方法,并且把之前創(chuàng)建好的screen 對象傳遞給這個(gè)方法, 又增加了兩行代碼,運(yùn)行一下程序,看看這一次能不能看到敵機(jī)的身影.

程序啟動(dòng)了, 一個(gè)敵人的小飛機(jī),從上向下再運(yùn)動(dòng)了,現(xiàn)在英雄已經(jīng)不再孤單了.

代碼寫到這里, 創(chuàng)建了一個(gè)精靈,創(chuàng)建了一個(gè)精靈組,就已經(jīng)實(shí)現(xiàn)了敵機(jī)的精靈動(dòng)畫.

那么先來看一下游戲循環(huán)內(nèi)部的代碼,在游戲循環(huán)中,只是讓精靈組調(diào)用了一下update方法.

對比一下之前的英雄飛機(jī),之前的英雄飛機(jī),需要在游戲循環(huán)中修改飛機(jī)的位置,并且判斷飛機(jī)的位置,

而有了精靈組之后,直接讓精靈組調(diào)用一個(gè)update 方法,調(diào)用之后精靈組就能夠讓所有的精靈更新位置.

寫一下注釋,讓組中的所有精靈更新位置,這個(gè)是update方法的好處.

那么再來看一下draw 方法,之前在繪制圖像時(shí)都是讓screen 對象調(diào)用blit 方法,然后要指定一下,把這個(gè)圖像繪制到哪里,

而使用精靈組只需要調(diào)用一下draw 方法,并且把屏幕對象傳遞給draw 方法, 精靈組就會(huì)把內(nèi)部的所有精靈全部繪制在屏幕上.

這個(gè)就是draw 方法的好處,再寫下注釋,在screen上繪制所有的精靈,這就是使用精靈和精靈組在開發(fā)游戲時(shí)能夠大大簡化游戲循環(huán)內(nèi)部的代碼.

那現(xiàn)在再看一下之前創(chuàng)建精靈和精靈組的代碼,之前創(chuàng)建了一個(gè)敵機(jī)的精靈,把敵機(jī)的精靈添加到了精靈組中,添加之后, 現(xiàn)在運(yùn)行程序, 屏幕上就有了一個(gè)敵人的飛機(jī).

精靈組中可以包含多少個(gè)精靈?精靈組中可以包含多個(gè)精靈.

那既然可以包含多個(gè)精靈,就對這個(gè)代碼進(jìn)行一個(gè)擴(kuò)展,再來定一個(gè)敵機(jī)的對象,給他起個(gè)名字叫做enemy1,然后同樣使用GameSprite()來創(chuàng)建一個(gè)敵人的飛機(jī),再指定一下圖像位置,image下的enemy1.png,指定完成,在創(chuàng)建游戲精靈時(shí),還可以指定一下精靈的速度.

那現(xiàn)在把第2架飛機(jī)的速度值乘2,這樣呢,可以跟第1架敵機(jī)加以區(qū)分,現(xiàn)在創(chuàng)建了兩架敵機(jī)的精靈,就可以把第2架敵機(jī)同樣也添加到敵機(jī)的精靈組中.

現(xiàn)在就以多值參數(shù)的方式再添加一個(gè)敵機(jī), 代碼改造完成.

現(xiàn)在運(yùn)行一下程序,看一下屏幕上是有幾個(gè)敵機(jī).

游戲啟動(dòng)了,兩個(gè)敵人的小飛機(jī)從上向下持續(xù)飛行,并且飛行的速度各不相同.

再來對比一下現(xiàn)在的代碼,通過一個(gè)簡單的改造再創(chuàng)建一個(gè)敵機(jī)的精靈,把敵機(jī)的精靈添加到精靈組中, 不需要在對游戲循環(huán)的代碼進(jìn)行任何的修改, 輕輕松松就可以在游戲中又增加了一個(gè)敵機(jī)的對象.

在這一小節(jié),就使用之前一個(gè)小節(jié)也派生出來的游戲精靈為創(chuàng)建了兩架敵機(jī),并且實(shí)現(xiàn)了一下敵機(jī)的動(dòng)畫效果.

在這一小節(jié)中,重點(diǎn)是要體會(huì)一下精靈和精靈組的職責(zé),精靈這個(gè)對象負(fù)責(zé)封裝圖像, 位置以及速度并且提供一個(gè)update的方法,update 方法,會(huì)根據(jù)游戲的需求修改精靈自己應(yīng)該更新的位置,這個(gè)是精靈的職責(zé),而精靈組負(fù)責(zé)包含多個(gè)精靈對象, 精靈組只需要在游戲循環(huán)中,分別調(diào)用一下update方法和draw 方法就可以了,update 方法可以更新組中所有精靈的位置,而draw 方法呢會(huì)把組中所有的精靈全部繪制在屏幕對象上.

總結(jié)

到此這篇關(guān)于Python游戲開發(fā)之精靈和精靈組的文章就介紹到這了,更多相關(guān)Python精靈和精靈組內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 一篇文章搞懂python混亂的切換操作與優(yōu)雅的推導(dǎo)式

    一篇文章搞懂python混亂的切換操作與優(yōu)雅的推導(dǎo)式

    這篇文章主要給大家介紹了如何通過一篇文章搞懂python混亂的切換操作與優(yōu)雅的推導(dǎo)式的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2021-08-08
  • 用openCV和Python 實(shí)現(xiàn)圖片對比,并標(biāo)識(shí)出不同點(diǎn)的方式

    用openCV和Python 實(shí)現(xiàn)圖片對比,并標(biāo)識(shí)出不同點(diǎn)的方式

    今天小編就為大家分享一篇用openCV和Python 實(shí)現(xiàn)圖片對比,并標(biāo)識(shí)出不同點(diǎn)的方式,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • Python語言中Tuple的由來分析

    Python語言中Tuple的由來分析

    Tuple在Python中表示一種“大小固定的有序序列”,這篇文章主要介紹了Python語言中Tuple的由來,需要的朋友可以參考下
    2022-09-09
  • scrapy框架中的items文件夾的用法詳解

    scrapy框架中的items文件夾的用法詳解

    這篇文章主要介紹了scrapy框架中的items文件夾的用法詳解,在Scrapy框架中,items文件夾是用來存放定義數(shù)據(jù)模型的Item類的地方,Item類描述了要從網(wǎng)頁中提取的數(shù)據(jù)的結(jié)構(gòu)和字段,通過使用Item類,我們可以更方便地組織和處理爬取到的數(shù)據(jù),需要的朋友可以參考下
    2023-10-10
  • Python 裝飾器原理、定義與用法詳解

    Python 裝飾器原理、定義與用法詳解

    這篇文章主要介紹了Python 裝飾器原理、定義與用法,結(jié)合實(shí)例形式分析了Python裝飾器的概念、定義、實(shí)現(xiàn)方法、應(yīng)用場景及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2019-12-12
  • python批量爬取下載抖音視頻

    python批量爬取下載抖音視頻

    這篇文章主要為大家詳細(xì)介紹了python批量爬取下載抖音視頻,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • 詳解python 支持向量機(jī)(SVM)算法

    詳解python 支持向量機(jī)(SVM)算法

    這篇文章主要介紹了python SVM算法的相關(guān)資料,幫助大家更好的利用python進(jìn)行數(shù)據(jù)分析,感興趣的朋友可以了解下
    2020-09-09
  • python字典根據(jù)key排序的實(shí)現(xiàn)

    python字典根據(jù)key排序的實(shí)現(xiàn)

    本文主要介紹了python字典根據(jù)key排序的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-01-01
  • python自動(dòng)化測試實(shí)例解析

    python自動(dòng)化測試實(shí)例解析

    這篇文章主要介紹了python自動(dòng)化測試實(shí)例,并對實(shí)例中的注意點(diǎn)進(jìn)行了簡單的分析,需要的朋友可以參考下
    2014-09-09
  • Python基礎(chǔ)知識(shí)學(xué)習(xí)之類的繼承

    Python基礎(chǔ)知識(shí)學(xué)習(xí)之類的繼承

    今天帶大家學(xué)習(xí)Python的基礎(chǔ)知識(shí),文中對python類的繼承作了非常詳細(xì)的介紹,對正在學(xué)習(xí)python基礎(chǔ)的小伙伴們很有幫助,需要的朋友可以參考下
    2021-05-05

最新評(píng)論

栖霞市| 新丰县| 阿勒泰市| 三江| 周口市| 明溪县| 古田县| 巴东县| 马尔康县| 望都县| 类乌齐县| 巴马| 普安县| 克拉玛依市| 梓潼县| 喜德县| 舟山市| 都匀市| 政和县| 松阳县| 伊宁市| 东源县| 原平市| 邵阳县| 措美县| 凌海市| 十堰市| 大新县| 新河县| 桦南县| 荥阳市| 平果县| 道孚县| 仁化县| 山阳县| 留坝县| 达孜县| 师宗县| 宁南县| 尤溪县| 霍林郭勒市|