Python?pygame派生精靈和精靈組創(chuàng)建敵機
派生精靈子類代碼實現(xiàn)
本案例需求的類圖如下所示:三個屬性,兩個方法
本文所要開發(fā)的游戲精靈,是繼承自pygame的精靈子類
| GameSprite | ||
|---|---|---|
| image | rect | speed |
| init(self, image_name, speed = 1): | update(self): |
實現(xiàn)思路:
想實現(xiàn)游戲精靈這個子類代碼。首先,讓游戲精靈繼承自pygame的精靈類,在初始化方法中,我們先調(diào)用了一下父類的初始化方法。然后,按照需求,依次定義了三個屬性,分別是圖像(image),位置(rect),以及速度(speed)。并且,重寫了一下父類的update方法,在update方法中,我們對rect的y值做了一個修改,讓y值加上速度speed,這樣,我們就可以讓游戲精靈按照垂直方向進行移動了。
擴展補充
注意:在我們開發(fā)子類的時候,如果子類的父類不是object這個基類,我們在初始化方法中,需要主動調(diào)用一下父類的初始化方法。因為,不主動調(diào)用父類的初始化方法,我們就沒辦法享受到父類中已經(jīng)封裝好的初始化方法。
代碼演示
按照需求所完成的具體代碼演示如下所示:
- 先給類起了個名字
GameSprite,在括號中指定一下游戲精靈的父類pygame.sprite.Sprite。 - 初始化方法中,增加兩個形參,image_name和speed。使用super調(diào)用父類的初始化方法。
- 初始化方法中定義三個屬性(圖像、位置、速度)
- image調(diào)用get.rect方法返回圖像大小
- 定義speed,把形參的speed加載進來
- 定義update方法
- update方法中,使精靈在屏幕的垂直方向移動,移動距離為1
import pygame
class GameSprite(pygame.sprite.Sprite):
"""飛機大戰(zhàn)游戲精靈"""
def __init__(self, image_name, speed=1):
# 調(diào)用父類的初始化方法
super().__init__()
# 定義對象的屬性
self.image = pygame.image.load(image_name)
self.rect = self.image.get_rect()
self.speed = speed
pass
def update(self):
# 在屏幕的垂直方向上移動
self.rect.y += self.speed飛機大戰(zhàn)游戲簡介
首先回顧一下,我們的項目實戰(zhàn)內(nèi)容:
本項目主要想使用pygame模塊開發(fā)一款飛機大戰(zhàn)游戲,從而強化面向?qū)ο蟪绦蛟O(shè)計,游戲能夠使玩家控制英雄飛機,消滅敵機,根據(jù)用戶的交互或其他情況,移動這些圖像,產(chǎn)生動畫效果。
然后根據(jù)圖像之間是否發(fā)生重疊,判斷敵機是否被摧毀等其他情況。
使用游戲精靈和精靈組創(chuàng)建敵機
案例需求:
使用上一小節(jié)中剛剛派生的游戲精靈和精靈組創(chuàng)建敵機并且實現(xiàn)敵機動畫。
實現(xiàn)步驟:
- 使用from導(dǎo)入plane_sprites模塊
from導(dǎo)入的模塊可以直接使用import導(dǎo)入的模塊需要通過模塊名.來使用
- 在游戲初始化創(chuàng)建精靈對象和精靈組對象
- 在游戲循環(huán)中,讓精靈組分別調(diào)用
update()(更新組中所有精靈的位置)和draw(screen)(把組中所有的精靈全部繪制在屏幕上)方法
職責:
精靈對象職責:
- 封裝圖像image、位置rect和速度speed
- 提供update()方法,根據(jù)游戲需求,更新位置rect
精靈組對象職責:
- 包含多個精靈對象
update方法,讓精靈組中的所有精靈調(diào)用update方法更新位置draw(screen)方法,在screen上繪制精靈組中所有精靈
代碼演示
案例中對應(yīng)的具體代碼演示如下所示:
- 使用GameSprite類創(chuàng)建了兩個敵機對象
- 把兩個敵機對象添加到精靈組enemy_group中
- 讓精靈組調(diào)用兩個方法(分別為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("./飛機大戰(zhàn)資料包/images/background1.jpg")
screen.blit(bg, (0, 0))
# 繪制英雄的飛機
hero = pygame.image.load("./飛機大戰(zhàn)資料包/images/me1.png")
screen.blit(hero, (280, 500))
# 可以在所有繪制工作完成之后,統(tǒng)一調(diào)用update方法
pygame.display.update()
# 創(chuàng)建時鐘對象
clock = pygame.time.Clock()
# 游戲循環(huán)->意味著游戲的正式開始
# 1. 定義rect記錄飛機的初始位置
hero_rect = pygame.Rect(280, 500, 102, 126)
# 創(chuàng)建敵機的精靈,使用類創(chuàng)建對象
enemy = GameSprite("./飛機大戰(zhàn)資料包/images/enemy1.png")
enemy1 = GameSprite("./飛機大戰(zhàn)資料包/images/enemy1.png", 2)
# 創(chuàng)建敵機的精靈組
enemy_group = pygame.sprite.Group(enemy, enemy1)
# 游戲循環(huán)->意味著游戲的正式開始
while True:
# 希望無限循環(huán)內(nèi)部的代碼每秒鐘重復(fù)循環(huán)60次
# 可以指定循環(huán)體內(nèi)部的代碼執(zhí)行的頻率
clock.tick(60)
# 監(jiān)聽事件
for event in pygame.event.get():
# 判斷事件類型是否是退出事件
if event.type == pygame.QUIT:
print("游戲退出...")
# quit卸載所有的模塊
pygame.quit()
# exit()直接終止當前正在執(zhí)行的程序
exit()
# 2. 修改飛機的位置
hero_rect.y -= 1
# 判斷飛機的位置
if hero_rect.y <= -126:
hero_rect.y = 642
# 3. 調(diào)用blit方法繪制圖像
# 先繪制背景,在繪制飛機,就不會留下殘影(背景把上一次的飛機遮擋)
screen.blit(bg, (0, 0))
screen.blit(hero, hero_rect)
# 讓精靈組調(diào)用兩個方法
# update- 讓組中的所有精靈更新位置
enemy_group.update()
# draw- 在screen上繪制所有的精靈
enemy_group.draw(screen)
# 4. 調(diào)用update方法更新顯示
pygame.display.update()
pygame.quit()
運行結(jié)果
代碼運行結(jié)果如下圖所示:可以看出有兩j架敵機向下飛行,實際結(jié)果為動畫效果。

以上就是Python pygame派生精靈和精靈組創(chuàng)建敵機的詳細內(nèi)容,更多關(guān)于Python pygame精靈精靈組的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
從np.random.normal()到正態(tài)分布的擬合操作
這篇文章主要介紹了從np.random.normal()到正態(tài)分布的擬合操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06
Python實現(xiàn)遠程調(diào)用MetaSploit的方法
這篇文章主要介紹了Python實現(xiàn)遠程調(diào)用MetaSploit的方法,是很有借鑒價值的一個技巧,需要的朋友可以參考下2014-08-08
基于Python實現(xiàn)隨機點名系統(tǒng)的示例代碼
在某些難以抉擇得時候,我們經(jīng)常要用外力來幫助我們做出選擇,比如,梁山出征方臘前沙場點兵,挑選先鋒的場景。所以本文就來用Python做個隨機點名系統(tǒng)吧,需要的可以參考一下2023-04-04
Python實現(xiàn)隨機取一個矩陣數(shù)組的某幾行
今天小編就為大家分享一篇Python實現(xiàn)隨機取一個矩陣數(shù)組的某幾行,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-11-11

