(四)詳解pygame中的精靈和精靈組


python飛機大戰系列文章(按順序)
(一)通過pygame 將自己的圖像添加到遊戲中
(二)通過pygame讓遊戲人物 動起來
(三)通過pygame處理用戶的鼠標鍵盤操作(事件和監聽
(四)詳解pygame中的精靈和精靈組
(五)通過pygame搭建遊戲框架
(六)通過pygame讓遊戲背景圖像實現交替滾動
(七)通過pygame來設置飛機大戰中 敵機 的速度、位置等
(八)通過pygame來操控遊戲人物的移動
(九)通過pygame使遊戲人物發射子彈
(十)通過pygame來進行碰撞檢測


精靈和精靈組

在之前的例子中,對於一個小遊戲的圖像加載、圖像的位置變換、繪製圖像都需要程序員編寫代碼來一個個地處理,但是如果我們的遊戲需要處理很多張圖像,那麼代碼內部將會非常複雜 ,因爲我們要在每一個遊戲循環中,一個圖像移動一次就需要寫一次代碼。那麼需要如何解決這個問題呢??—精靈和精靈組

爲了簡化開發遊戲的步驟,pygame提供了兩個類

  • pygame.sprite.Sprite —儲存圖像數據image和位置rect的對象
  • pygame.sprite.Group
精靈類(需要派生子類)
屬性:①image 記錄圖像數據 ;②rect 記錄在屏幕上的位置
方法:①update(*args)更新精靈位置 ; ②kill()從所有組中刪除

【爲什麼需要派生子類】:因爲不同的遊戲角色在遊戲中的運動方式是不一樣的,所以需要根據不同的遊戲角色來派生出不同的遊戲子類
在遊戲開發中,可以根據不同的遊戲角色,派生出不同的子類,再在每一個子類中,分別重寫各自的update方法


精靈組
__init__(self, *精靈):
add(*sprites): 向組中增加精靈
sprites():返回所有精靈列表
update(*args):讓組中所有精靈調用各自的update方法
draw(Surface):將組中所有精靈的image,繪製到Surface的rect位置

使用多值參數 *精靈:一次性處理精靈組中包含的所有精靈

在這裏插入圖片描述

派生精靈子類

  1. 新建一個名爲plane_sprites.py的文件
  2. 定義GameSprite繼承自pygam.sprite.Sprite

注意:

  • 如果一個類的父類不是object基類,那麼在重寫初始化方法的時候,一定要先主動的super()一下父類的__init__方法,來保證父類中實現的__init__代碼能夠正常的執行,要是不主動地
    super().__init__() 就沒有辦法享受到父類中已經封裝好的初始化代碼了

在這裏插入圖片描述

屬性:

  • image 精靈圖像,使用image_name加載
  • rect 精靈大小,默認使用圖像大小
  • speed 精靈移動速度,默認爲1

方法:

  • update 每次更新屏幕時在遊戲循環內調用,讓精靈的self.rect.y += self.speed

提示:

  • image的get_rect()方法,可以返回pygame.Rect(0,0,圖圖像寬,圖像高)的對象

代碼爲:

import pygame


class GameSprite(pygame.sprite.Sprite):
    """飛機大戰遊戲精靈"""
    def __init__(self, image_name, speed=1):

        #調用父類的初始化方法
        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. 導入plane_sprites模塊
  2. 在 遊戲初始化 創建 精靈對象 和 精靈對象組
  3. 在遊戲循環中,讓精靈組分別調用update()和draw(screen)方法

職責:
精靈:
①封裝圖像image、位置rect、速度speed
②提供update()方法,根據遊戲需求,更新位置rect

精靈組:
①包含多個精靈對象
②update方法,讓精靈組中的所有精靈調用update方法更新位置
③draw(screen)方法,在screen上繪製精靈組中的所有精靈

代碼如下:

import pygame
from plane_sprites import *


pygame.init()
#創建遊戲窗口 大小爲480 * 700
#繪製背景圖像
screen = pygame.display.set_mode((480,700))
#加載圖像數據
bg = pygame.image.load(r'.\images\background.png')
#通過blit來繪製圖像,從遊戲窗口screen的(0,0)處開始繪製
screen.blit(bg, (0,0))

#繪製自己的小飛機
hero = pygame.image.load(r'.\images\me1.png')
screen.blit(hero, (150,300))

#在繪製完所有圖像後,再統一調用update方法
pygame.display.update()

#創建時鐘對象
clock = pygame.time.Clock()

#定義rect記錄飛機的初始位置,102,126分別爲飛機圖片的寬高
hero_rect = pygame.Rect(150, 300, 102, 126)

#創建敵機的精靈
enemy = GameSprite("./images/enemy1.png")

#創建敵機的精靈組
enemy_group = pygame.sprite.Group(enemy)

#遊戲循環,意味着遊戲正式開始
while True:

    clock.tick(60)
    #監聽事件
    for event in pygame.event.get():
        #判斷事件類型是否是退出事件
        if event.type == pygame.QUIT:
            print("遊戲退出...")
            #quit卸載所有的模塊
            pygame.quit()
            #exit()退出程序
            exit()

    #修改飛機的位置
    hero_rect.y -= 1

    #判斷飛機位置
    if hero_rect.y <= 0:
        hero_rect.y = 700

    #調用blit方法繪製圖像
    screen.blit(bg, (0,0))#在每次繪製飛機之前,再將背景繪製一下
    screen.blit(hero, hero_rect)

    #讓精靈組調用兩個方法
    #update :讓組中的所有的精靈更新位置
    enemy_group.update()
    #draw :在screen 上繪製所有的精靈
    enemy_group.draw(screen)

    #調用update方法更新顯示
    pygame.display.update()

pygame.quit()

運行:
在這裏插入圖片描述

可以看到 有一個敵機在往下運動了,那麼再添加敵機也很簡單 :使用GameSprite再添加敵機,並且只需在精靈組的參數中,多加一個敵機就好了,並不需要在遊戲循環中再修改任何代碼,代碼如下:

import pygame
from plane_sprites import *


pygame.init()
#創建遊戲窗口 大小爲480 * 700
#繪製背景圖像
screen = pygame.display.set_mode((480,700))
#加載圖像數據
bg = pygame.image.load(r'.\images\background.png')
#通過blit來繪製圖像,從遊戲窗口screen的(0,0)處開始繪製
screen.blit(bg, (0,0))

#繪製自己的小飛機
hero = pygame.image.load(r'.\images\me1.png')
screen.blit(hero, (150,300))

#在繪製完所有圖像後,再統一調用update方法
pygame.display.update()

#創建時鐘對象
clock = pygame.time.Clock()

#定義rect記錄飛機的初始位置,102,126分別爲飛機圖片的寬高
hero_rect = pygame.Rect(150, 300, 102, 126)

#創建敵機的精靈
enemy = GameSprite("./images/enemy1.png")
#再創建速度爲2的敵機
enemy2 = GameSprite("./images/enemy1.png",2)

#創建敵機的精靈組
enemy_group = pygame.sprite.Group(enemy,enemy2)

#遊戲循環,意味着遊戲正式開始
while True:

    clock.tick(60)
    #監聽事件
    for event in pygame.event.get():
        #判斷事件類型是否是退出事件
        if event.type == pygame.QUIT:
            print("遊戲退出...")
            #quit卸載所有的模塊
            pygame.quit()
            #exit()退出程序
            exit()

    #修改飛機的位置
    hero_rect.y -= 1

    #判斷飛機位置
    if hero_rect.y <= 0:
        hero_rect.y = 700

    #調用blit方法繪製圖像
    screen.blit(bg, (0,0))#在每次繪製飛機之前,再將背景繪製一下
    screen.blit(hero, hero_rect)

    #讓精靈組調用兩個方法
    #update :讓組中的所有的精靈更新位置
    enemy_group.update()
    #draw :在screen 上繪製所有的精靈
    enemy_group.draw(screen)

    #調用update方法更新顯示
    pygame.display.update()

pygame.quit()

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章