Python?pygame派生精靈和精靈組創(chuàng)建敵機(jī)
派生精靈子類代碼實(shí)現(xiàn)
本案例需求的類圖如下所示:三個(gè)屬性,兩個(gè)方法
本文所要開(kāi)發(fā)的游戲精靈,是繼承自pygame的精靈子類
GameSprite | ||
---|---|---|
image | rect | speed |
init(self, image_name, speed = 1): | update(self): |
實(shí)現(xiàn)思路:
想實(shí)現(xiàn)游戲精靈這個(gè)子類代碼。首先,讓游戲精靈繼承自pygame
的精靈類,在初始化方法中,我們先調(diào)用了一下父類的初始化方法。然后,按照需求,依次定義了三個(gè)屬性,分別是圖像(image),位置(rect),以及速度(speed)。并且,重寫了一下父類的update方法,在update方法中,我們對(duì)rect的y值做了一個(gè)修改,讓y值加上速度speed,這樣,我們就可以讓游戲精靈按照垂直方向進(jìn)行移動(dòng)了。
擴(kuò)展補(bǔ)充
注意:在我們開(kāi)發(fā)子類的時(shí)候,如果子類的父類不是object這個(gè)基類,我們?cè)诔跏蓟椒ㄖ?,需要?strong>動(dòng)調(diào)用一下父類的初始化方法。因?yàn)?,不主?dòng)調(diào)用父類的初始化方法,我們就沒(méi)辦法享受到父類中已經(jīng)封裝好的初始化方法。
代碼演示
按照需求所完成的具體代碼演示如下所示:
- 先給類起了個(gè)名字
GameSprite
,在括號(hào)中指定一下游戲精靈的父類pygame.sprite.Sprite。 - 初始化方法中,增加兩個(gè)形參,image_name和speed。使用super調(diào)用父類的初始化方法。
- 初始化方法中定義三個(gè)屬性(圖像、位置、速度)
- image調(diào)用get.rect方法返回圖像大小
- 定義speed,把形參的speed加載進(jìn)來(lái)
- 定義update方法
- update方法中,使精靈在屏幕的垂直方向移動(dòng),移動(dòng)距離為1
import pygame class GameSprite(pygame.sprite.Sprite): """飛機(jī)大戰(zhàn)游戲精靈""" def __init__(self, image_name, speed=1): # 調(diào)用父類的初始化方法 super().__init__() # 定義對(duì)象的屬性 self.image = pygame.image.load(image_name) self.rect = self.image.get_rect() self.speed = speed pass def update(self): # 在屏幕的垂直方向上移動(dòng) self.rect.y += self.speed
飛機(jī)大戰(zhàn)游戲簡(jiǎn)介
首先回顧一下,我們的項(xiàng)目實(shí)戰(zhàn)內(nèi)容:
本項(xiàng)目主要想使用pygame模塊開(kāi)發(fā)一款飛機(jī)大戰(zhàn)游戲,從而強(qiáng)化面向?qū)ο蟪绦蛟O(shè)計(jì),游戲能夠使玩家控制英雄飛機(jī),消滅敵機(jī),根據(jù)用戶的交互或其他情況,移動(dòng)這些圖像,產(chǎn)生動(dòng)畫效果。
然后根據(jù)圖像之間是否發(fā)生重疊,判斷敵機(jī)是否被摧毀等其他情況。
使用游戲精靈和精靈組創(chuàng)建敵機(jī)
案例需求:
使用上一小節(jié)中剛剛派生的游戲精靈和精靈組創(chuàng)建敵機(jī)并且實(shí)現(xiàn)敵機(jī)動(dòng)畫。
實(shí)現(xiàn)步驟:
- 使用from導(dǎo)入plane_sprites模塊
from
導(dǎo)入的模塊可以直接使用import
導(dǎo)入的模塊需要通過(guò)模塊名.
來(lái)使用
- 在游戲初始化創(chuàng)建精靈對(duì)象和精靈組對(duì)象
- 在游戲循環(huán)中,讓精靈組分別調(diào)用
update()
(更新組中所有精靈的位置)和draw(screen)
(把組中所有的精靈全部繪制在屏幕上)方法
職責(zé):
精靈對(duì)象職責(zé):
- 封裝圖像image、位置rect和速度speed
- 提供update()方法,根據(jù)游戲需求,更新位置rect
精靈組對(duì)象職責(zé):
- 包含多個(gè)精靈對(duì)象
update
方法,讓精靈組中的所有精靈調(diào)用update方法更新位置draw(screen)
方法,在screen上繪制精靈組中所有精靈
代碼演示
案例中對(duì)應(yīng)的具體代碼演示如下所示:
- 使用GameSprite類創(chuàng)建了兩個(gè)敵機(jī)對(duì)象
- 把兩個(gè)敵機(jī)對(duì)象添加到精靈組enemy_group中
- 讓精靈組調(diào)用兩個(gè)方法(分別為update和draw)
- update- 讓組中的所有精靈更新位置
- draw- 在screen上繪制所有的精靈
import pygame from plane_sprites import * pygame.init() # 創(chuàng)建游戲的窗口 640*642 screen = pygame.display.set_mode((640, 642)) # 繪制背景圖像 bg = pygame.image.load("./飛機(jī)大戰(zhàn)資料包/images/background1.jpg") screen.blit(bg, (0, 0)) # 繪制英雄的飛機(jī) hero = pygame.image.load("./飛機(jī)大戰(zhàn)資料包/images/me1.png") screen.blit(hero, (280, 500)) # 可以在所有繪制工作完成之后,統(tǒng)一調(diào)用update方法 pygame.display.update() # 創(chuàng)建時(shí)鐘對(duì)象 clock = pygame.time.Clock() # 游戲循環(huán)->意味著游戲的正式開(kāi)始 # 1. 定義rect記錄飛機(jī)的初始位置 hero_rect = pygame.Rect(280, 500, 102, 126) # 創(chuàng)建敵機(jī)的精靈,使用類創(chuàng)建對(duì)象 enemy = GameSprite("./飛機(jī)大戰(zhàn)資料包/images/enemy1.png") enemy1 = GameSprite("./飛機(jī)大戰(zhàn)資料包/images/enemy1.png", 2) # 創(chuàng)建敵機(jī)的精靈組 enemy_group = pygame.sprite.Group(enemy, enemy1) # 游戲循環(huán)->意味著游戲的正式開(kāi)始 while True: # 希望無(wú)限循環(huán)內(nèi)部的代碼每秒鐘重復(fù)循環(huán)60次 # 可以指定循環(huán)體內(nèi)部的代碼執(zhí)行的頻率 clock.tick(60) # 監(jiān)聽(tīng)事件 for event in pygame.event.get(): # 判斷事件類型是否是退出事件 if event.type == pygame.QUIT: print("游戲退出...") # quit卸載所有的模塊 pygame.quit() # exit()直接終止當(dāng)前正在執(zhí)行的程序 exit() # 2. 修改飛機(jī)的位置 hero_rect.y -= 1 # 判斷飛機(jī)的位置 if hero_rect.y <= -126: hero_rect.y = 642 # 3. 調(diào)用blit方法繪制圖像 # 先繪制背景,在繪制飛機(jī),就不會(huì)留下殘影(背景把上一次的飛機(jī)遮擋) screen.blit(bg, (0, 0)) screen.blit(hero, hero_rect) # 讓精靈組調(diào)用兩個(gè)方法 # update- 讓組中的所有精靈更新位置 enemy_group.update() # draw- 在screen上繪制所有的精靈 enemy_group.draw(screen) # 4. 調(diào)用update方法更新顯示 pygame.display.update() pygame.quit()
運(yùn)行結(jié)果
代碼運(yùn)行結(jié)果如下圖所示:可以看出有兩j架敵機(jī)向下飛行,實(shí)際結(jié)果為動(dòng)畫效果。
以上就是Python pygame派生精靈和精靈組創(chuàng)建敵機(jī)的詳細(xì)內(nèi)容,更多關(guān)于Python pygame精靈精靈組的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
從np.random.normal()到正態(tài)分布的擬合操作
這篇文章主要介紹了從np.random.normal()到正態(tài)分布的擬合操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06一篇文章帶你了解python標(biāo)準(zhǔn)庫(kù)--random模塊
這篇文章主要給大家介紹了關(guān)于Python中random模塊常用方法的使用教程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-08-08Python實(shí)現(xiàn)遠(yuǎn)程調(diào)用MetaSploit的方法
這篇文章主要介紹了Python實(shí)現(xiàn)遠(yuǎn)程調(diào)用MetaSploit的方法,是很有借鑒價(jià)值的一個(gè)技巧,需要的朋友可以參考下2014-08-08基于Python實(shí)現(xiàn)隨機(jī)點(diǎn)名系統(tǒng)的示例代碼
在某些難以抉擇得時(shí)候,我們經(jīng)常要用外力來(lái)幫助我們做出選擇,比如,梁山出征方臘前沙場(chǎng)點(diǎn)兵,挑選先鋒的場(chǎng)景。所以本文就來(lái)用Python做個(gè)隨機(jī)點(diǎn)名系統(tǒng)吧,需要的可以參考一下2023-04-04Python實(shí)現(xiàn)隨機(jī)取一個(gè)矩陣數(shù)組的某幾行
今天小編就為大家分享一篇Python實(shí)現(xiàn)隨機(jī)取一個(gè)矩陣數(shù)組的某幾行,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11