亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

1. 基本概念

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

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

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

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

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

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

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

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

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

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

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

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

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

當(dāng)有了精靈組之后,當(dāng)創(chuàng)建了一個(gè)精靈組之后,在編寫(xiě)游戲循環(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í)呢,把屏幕對(duì)象當(dāng)作參數(shù)傳遞給 draw 方法, draw 方法會(huì)把精靈組中所有精靈的image繪制到屏幕上每一個(gè)精靈對(duì)應(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é)果。

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

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

2. 自定義精靈子類(lèi)需求分析

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

那么再看一下精靈組對(duì)象的職責(zé),精靈組對(duì)象可以包含多個(gè)精靈對(duì)象,當(dāng)精靈組對(duì)象建立完成,就可以在游戲循環(huán)中讓精靈組對(duì)象來(lái)調(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è)屏幕對(duì)象上, 這個(gè)就是精靈和精靈組的職責(zé).

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

游戲啟動(dòng)了,

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

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

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

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

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

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

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

現(xiàn)在先增加一個(gè)單行注釋來(lái)明確一下這一小節(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é)派生的游戲精靈類(lèi)來(lái)創(chuàng)建一個(gè)精靈對(duì)象.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

寫(xiě)一下注釋?zhuān)尳M中的所有精靈更新位置,這個(gè)是update方法的好處.

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

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

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

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

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

那既然可以包含多個(gè)精靈,就對(duì)這個(gè)代碼進(jìn)行一個(gè)擴(kuò)展,再來(lái)定一個(gè)敵機(jī)的對(duì)象,給他起個(gè)名字叫做enemy1,然后同樣使用GameSprite()來(lái)創(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ù)飛行,并且飛行的速度各不相同.

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

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

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

總結(jié)

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

相關(guān)文章

  • 深入了解Python如何操作MongoDB

    深入了解Python如何操作MongoDB

    MongoDB是由C++語(yǔ)言編寫(xiě)的非關(guān)系型數(shù)據(jù)庫(kù),是一個(gè)基于分布式文件存儲(chǔ)的開(kāi)源數(shù)據(jù)庫(kù)系統(tǒng)。本文主要介紹了如何通過(guò)Python操作MongoDB,需要的可以參考一下
    2022-01-01
  • python循環(huán)神經(jīng)網(wǎng)絡(luò)RNN函數(shù)tf.nn.dynamic_rnn使用

    python循環(huán)神經(jīng)網(wǎng)絡(luò)RNN函數(shù)tf.nn.dynamic_rnn使用

    這篇文章主要為大家介紹了python循環(huán)神經(jīng)網(wǎng)絡(luò)RNN的tf.nn.dynamic_rnn使用示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • python redis連接 有序集合去重的代碼

    python redis連接 有序集合去重的代碼

    這篇文章主要介紹了python redis連接 有序集合去重的代碼,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-08-08
  • Keras搭建Mask?R-CNN實(shí)例分割平臺(tái)實(shí)現(xiàn)源碼

    Keras搭建Mask?R-CNN實(shí)例分割平臺(tái)實(shí)現(xiàn)源碼

    這篇文章主要為大家介紹了Keras搭建Mask?R-CNN實(shí)例分割平臺(tái)實(shí)現(xiàn)源碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • python實(shí)現(xiàn)梯度下降和邏輯回歸

    python實(shí)現(xiàn)梯度下降和邏輯回歸

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)梯度下降和邏輯回歸,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • 深度學(xué)習(xí)環(huán)境配置之Anaconda安裝和pip源方式

    深度學(xué)習(xí)環(huán)境配置之Anaconda安裝和pip源方式

    這篇文章主要介紹了深度學(xué)習(xí)環(huán)境配置之Anaconda安裝和pip源方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • Python利用matplotlib繪制散點(diǎn)圖的新手教程

    Python利用matplotlib繪制散點(diǎn)圖的新手教程

    這篇文章主要給大家介紹了關(guān)于Python利用matplotlib繪制散點(diǎn)圖的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Windows下Python使用Pandas模塊操作Excel文件的教程

    Windows下Python使用Pandas模塊操作Excel文件的教程

    Pandas是一個(gè)強(qiáng)大的Python數(shù)據(jù)分析模塊,這里我們先使用ANACONDA來(lái)幫助獲取Pandas所以來(lái)的一些環(huán)境,然后來(lái)初步學(xué)習(xí)Windows下Python使用Pandas模塊操作Excel文件的教程
    2016-05-05
  • 一文帶你掌握Python內(nèi)置reversed函數(shù)的使用

    一文帶你掌握Python內(nèi)置reversed函數(shù)的使用

    Python作為一門(mén)強(qiáng)大的編程語(yǔ)言,提供了許多內(nèi)置函數(shù)來(lái)處理各種數(shù)據(jù)結(jié)構(gòu)和對(duì)象,本文將詳細(xì)探討reversed函數(shù)的用法、示例代碼以及實(shí)際應(yīng)用場(chǎng)景,需要的可以參考下
    2024-01-01
  • python unix時(shí)間戳轉(zhuǎn)換毫秒的實(shí)現(xiàn)

    python unix時(shí)間戳轉(zhuǎn)換毫秒的實(shí)現(xiàn)

    Unix時(shí)間戳是一種常見(jiàn)的時(shí)間表示方式,本文主要介紹了python unix時(shí)間戳轉(zhuǎn)換毫秒的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01

最新評(píng)論