等等,我們好像只是繪制了一動的張圖
專案原始碼
不知道你有沒有發現,我們現在好像只是繪制了一張動的圖,只是一張!!!就這么多代碼了,如果有100張 10000+張?那我們這么高?
別擔心,pygame給我們提供了解決方案------精靈還有精靈組
精靈?精靈組?藍精靈?皮卡丘?
精靈
在游戲開發中 顯示影像的物件 就是精靈
- 別著急我們先來看一下,它確實是一個類,這里是它的類圖

- 作用:
pygame.sprite.Sprite—— 存盤 影像資料 image 和 位置 rect 的 **物件- pygame.sprite.Group,用來儲存之前 pygame.sprite.Sprite創建出來的物件,統一在視窗主程式中的進行繪制
- 分析一下這個類的構成
- 精靈 需要 有 兩個重要的屬性
image要顯示的影像,rect影像要顯示在螢屏的位置- 默認的
update()方法什么事情也沒做,子類可以重寫此方法,在每次重繪螢屏時,更新精靈位置
- 小心有坑!
pygame.sprite.Sprite并沒有提供image和rect兩個屬性- 需要程式員從
pygame.sprite.Sprite派生子類 - 并在 子類 的 初始化方法 中,設定
image和rect屬性
精靈組
- 一個 精靈組 可以包含多個 精靈 物件
- 呼叫 精靈組 物件的
update()方法- 可以 自動 呼叫 組內每一個精靈 的
update()方法
- 可以 自動 呼叫 組內每一個精靈 的
- 呼叫 精靈組 物件的
draw(螢屏物件)方法- 可以將 組內每一個精靈 的
image繪制在rect位置
- 可以將 組內每一個精靈 的
- 總的來說就是統一指揮 統一行動,但是每一個項又有自己的獨立的運動方法和屬性
Group(*sprites) -> Group
實體代碼:
# 1. 新建 `plane_sprites.py` 檔案
# 2. 定義 `GameSprite` 繼承自 `pygame.sprite.Sprite`
import pygame
# 3.寫在括號里的意思是繼承父類
class GameSprite(pygame.sprite.Sprite):
"""飛機大戰中的游戲精靈,根據設計的UML撰寫代碼"""
#注意這里要重寫init方法,我們在init初始化方法(行函式)傳參
def __init__(self, image_name, speed=1):
# 呼叫父類的初始化方法,當我們的父類不是object基類的時候一定要呼叫super()物件來呼叫父類的初始化inint方法
super().__init__()
# 定義物件的屬性,它們分別記錄著精靈的圖片位置速度還有運動方式
# 加載影像
self.image = pygame.image.load(image_name)
# 設定尺寸
self.rect = self.image.get_rect()
# 記錄速度
self.speed = speed
def update(self):
# 在螢屏的垂直方向上移動
self.rect.y += self.speed
如何在我們之前的主程式中使用他們?
什么?你不知道我們的主程式是什么?好吧,是我忘記告訴你了,我們的主程式就是我們之前寫的 繪制視窗的那個程式,
其實這也非常的簡單 ,你只需要在游戲主程式中匯入包
如何完成添加“敵機”精靈,并且讓它動起來,再把它們放到游戲回圈里面就行了
- 注意:
我們先來明確一下精靈還有精靈組的分工
1. 精靈
* 封裝 **影像 image**、**位置 rect** 和 **速度 speed**
* 提供 `update()` 方法,根據游戲需求,**更新位置 rect**
2. 精靈組
* 包含 **多個** **精靈物件**
* `update` 方法,讓精靈組中的所有精靈呼叫 `update` 方法更新位置
* `draw(screen)` 方法,在 `screen` 上繪制精靈組中的所有精靈
- 完整的代碼實體
import pygame
# 你需要匯入 form和import 使用inprom匯入的時候需要.來使用 使用form的時候 直接使用模塊提供的工具就行了,
# 它們都是實作了匯入模塊的功能
from plane_sprites import *
# 游戲的初始化
pygame.init()
# 創建游戲的視窗 480 * 700
screen = pygame.display.set_mode((480, 700))
# 繪制背景影像
bg = pygame.image.load("./images/background.png")
screen.blit(bg, (0, 0))
# pygame.display.update()
# 繪制英雄的飛機
hero = pygame.image.load("./images/me1.png")
screen.blit(hero, (150, 300))
# 可以在所有繪制作業完成之后,統一呼叫update方法
pygame.display.update()
# 創建時鐘物件
clock = pygame.time.Clock()
# 1. 定義rect記錄飛機的初始位置
hero_rect = pygame.Rect(150, 300, 102, 126)
# 開始我們的業務邏輯
# 創建敵機的精靈
# 敵人的戰斗機物件
enemy = GameSprite("./images/enemy1.png")
enemy1 = GameSprite("./images/enemy1.png", 2)
# 創建敵機的精靈組,我們可以使用多值的方式傳遞精靈組合,有了這個精靈組,我們就可以直接使用精靈的方法了,一次性的繪制所有的影像
enemy_group = pygame.sprite.Group(enemy, enemy1)
# # 讓精靈組呼叫兩個方法
# # update - 讓組中的所有精靈更新位置,這個是更新位置
# enemy_group.update()
# # draw - 在screen上繪制所有的精靈,這個是繪制
# enemy_group.draw(screen)
# 我們只是呼叫一次,現在我們把它丟到我們的游戲回圈里面去
# 游戲回圈 -> 意味著游戲的正式開始!
while True:
# 可以指定回圈體內部的代碼執行的頻率
clock.tick(60)
# 監聽事件
for event in pygame.event.get():
# 判斷事件型別是否是退出事件
if event.type == pygame.QUIT:
print("游戲退出...")
# quit 卸載所有的模塊
pygame.quit()
# exit() 直接終止當前正在執行的程式
exit()
# 2. 修改飛機的位置
hero_rect.y -= 1
# 判斷飛機的位置
if hero_rect.y <= 0:
hero_rect.y = 700
# 3. 呼叫blit方法繪制影像
screen.blit(bg, (0, 0))
screen.blit(hero, hero_rect)
# 讓精靈組呼叫兩個方法
# update - 讓組中的所有精靈更新位置,這個是更新位置
enemy_group.update()
# draw - 在screen上繪制所有的精靈,這個是繪制
enemy_group.draw(screen)
# 4. 呼叫update方法更新顯示
pygame.display.update()
pygame.quit()
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/166982.html
標籤:Python
