首頁 > 軟體

Python pygame派生精靈和精靈組建立敵機

2022-08-18 14:02:10

派生精靈子類程式碼實現

本案例需求的類圖如下所示:三個屬性,兩個方法

本文所要開發的遊戲精靈,是繼承自pygame的精靈子類

GameSprite
imagerectspeed
init(self, image_name, speed = 1):update(self):

實現思路:

想實現遊戲精靈這個子類程式碼。首先,讓遊戲精靈繼承自pygame的精靈類,在初始化方法中,我們先呼叫了一下父類別的初始化方法。然後,按照需求,依次定義了三個屬性,分別是影象(image),位置(rect),以及速度(speed)。並且,重寫了一下父類別的update方法,在update方法中,我們對rect的y值做了一個修改,讓y值加上速度speed,這樣,我們就可以讓遊戲精靈按照垂直方向進行移動了。

擴充套件補充

注意:在我們開發子類的時候,如果子類的父類別不是object這個基礎類別,我們在初始化方法中,需要主動呼叫一下父類別的初始化方法。因為,不主動呼叫父類別的初始化方法,我們就沒辦法享受到父類別中已經封裝好的初始化方法。

程式碼演示

按照需求所完成的具體程式碼演示如下所示:

  • 先給類起了個名字GameSprite,在括號中指定一下游戲精靈的父類別pygame.sprite.Sprite。
  • 初始化方法中,增加兩個形參,image_name和speed。使用super呼叫父類別的初始化方法。
  • 初始化方法中定義三個屬性(影象、位置、速度)
  • image呼叫get.rect方法返回影象大小
  • 定義speed,把形參的speed載入進來
  • 定義update方法
  • update方法中,使精靈在螢幕的垂直方向移動,移動距離為1
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
        pass
    def update(self):
        # 在螢幕的垂直方向上移動
        self.rect.y += self.speed

飛機大戰遊戲簡介

首先回顧一下,我們的專案實戰內容:

本專案主要想使用pygame模組開發一款飛機大戰遊戲,從而強化物件導向程式設計,遊戲能夠使玩家控制英雄飛機,消滅敵機,根據使用者的互動或其他情況,移動這些影象,產生動畫效果。

然後根據影象之間是否發生重疊,判斷敵機是否被摧毀等其他情況。

使用遊戲精靈和精靈組建立敵機

案例需求:

使用上一小節中剛剛派生的遊戲精靈精靈組建立敵機並且實現敵機動畫。

實現步驟:

  • 使用from匯入plane_sprites模組
    • from匯入的模組可以直接使用
    • import匯入的模組需要通過模組名.來使用
  • 在遊戲初始化建立精靈物件和精靈組物件
  • 在遊戲迴圈中,讓精靈組分別呼叫update()(更新組中所有精靈的位置)和draw(screen)(把組中所有的精靈全部繪製在螢幕上)方法

職責:

  • 精靈物件職責:

    • 封裝影象image、位置rect和速度speed
    • 提供update()方法,根據遊戲需求,更新位置rect
  • 精靈組物件職責:

    • 包含多個精靈物件
    • update方法,讓精靈組中的所有精靈呼叫update方法更新位置
    • draw(screen)方法,在screen上繪製精靈組中所有精靈

程式碼演示

案例中對應的具體程式碼演示如下所示:

  • 使用GameSprite類建立了兩個敵機物件
  • 把兩個敵機物件新增到精靈組enemy_group中
  • 讓精靈組呼叫兩個方法(分別為update和draw)
  • update- 讓組中的所有精靈更新位置
  • draw- 在screen上繪製所有的精靈
import pygame
from plane_sprites import *
pygame.init()
# 建立遊戲的視窗 640*642
screen = pygame.display.set_mode((640, 642))
# 繪製背景影象
bg = pygame.image.load("./飛機大戰資料包/images/background1.jpg")
screen.blit(bg, (0, 0))
# 繪製英雄的飛機
hero = pygame.image.load("./飛機大戰資料包/images/me1.png")
screen.blit(hero, (280, 500))
# 可以在所有繪製工作完成之後,統一呼叫update方法
pygame.display.update()
# 建立時鐘物件
clock = pygame.time.Clock()
# 遊戲迴圈->意味著遊戲的正式開始
# 1. 定義rect記錄飛機的初始位置
hero_rect = pygame.Rect(280, 500, 102, 126)
# 建立敵機的精靈,使用類建立物件
enemy = GameSprite("./飛機大戰資料包/images/enemy1.png")
enemy1 = GameSprite("./飛機大戰資料包/images/enemy1.png", 2)
# 建立敵機的精靈組
enemy_group = pygame.sprite.Group(enemy, enemy1)
# 遊戲迴圈->意味著遊戲的正式開始
while True:
    # 希望無限迴圈內部的程式碼每秒鐘重複迴圈60次
    # 可以指定迴圈體內部的程式碼執行的頻率
    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 <= -126:
        hero_rect.y = 642
    # 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()

執行結果

程式碼執行結果如下圖所示:可以看出有兩j架敵機向下飛行,實際結果為動畫效果。

以上就是Python pygame派生精靈和精靈組建立敵機的詳細內容,更多關於Python pygame精靈精靈組的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com