python飛機大戰(zhàn)pygame游戲之敵機出場實現(xiàn)方法詳解
本文實例講述了python飛機大戰(zhàn)pygame游戲之敵機出場實現(xiàn)方法。分享給大家供大家參考,具體如下:
目標
使用 定時器 添加敵機
- 設計 Enemy 類
01. 使用定時器添加敵機
運行 備課代碼,觀察 敵機的 出現(xiàn)規(guī)律:
- 游戲啟動后,每隔 1 秒 會 出現(xiàn)一架敵機
- 每架敵機 向屏幕下方飛行,飛行 速度各不相同
- 每架敵機出現(xiàn)的 水平位置 也不盡相同
- 當敵機 從屏幕下方飛出,不會再飛回到屏幕中
1.1 定時器
- 在 pygame 中可以使用 pygame.time.set_timer() 來添加 定時器
- 所謂 定時器,就是 每隔一段時間,去 執(zhí)行一些動作
set_timer(eventid, milliseconds) -> None
- set_timer 可以創(chuàng)建一個 事件
- 可以在 游戲循環(huán) 的 事件監(jiān)聽 方法中捕獲到該事件
- 第 1 個參數(shù) 事件代號 需要基于常量 pygame.USEREVENT 來指定
- USEREVENT 是一個整數(shù),再增加的事件可以使用 USEREVENT + 1 指定,依次類推…
- 第 2 個參數(shù)是 事件觸發(fā) 間隔的 毫秒值
定時器事件的監(jiān)聽
- 通過 pygame.event.get() 可以獲取當前時刻所有的 事件列表
- 遍歷列表 并且判斷 event.type 是否等于 eventid,如果相等,表示 定時器事件 發(fā)生
1.2 定義并監(jiān)聽創(chuàng)建敵機的定時器事件
pygame 的 定時器 使用套路非常固定:
- 定義 定時器常量 —— eventid
- 在 初始化方法 中,調用 set_timer 方法 設置定時器事件
- 在 游戲循環(huán) 中,監(jiān)聽定時器事件
1) 定義事件
- 在 plane_sprites.py 的頂部定義 事件常量
# 敵機的定時器事件常量 CREATE_ENEMY_EVENT = pygame.USEREVENT
在 PlaneGame 的 初始化方法 中 創(chuàng)建用戶事件
# 4. 設置定時器事件 - 每秒創(chuàng)建一架敵機 pygame.time.set_timer(CREATE_ENEMY_EVENT, 1000)
2) 監(jiān)聽定時器事件
- 在 __event_handler 方法中增加以下代碼:
def __event_handler(self):
for event in pygame.event.get():
# 判斷是否退出游戲
if event.type == pygame.QUIT:
PlaneGame.__game_over()
elif event.type == CREATE_ENEMY_EVENT:
print("敵機出場...")
02. 設計 Enemy 類
- 游戲啟動后,每隔 1 秒 會 出現(xiàn)一架敵機
- 每架敵機 向屏幕下方飛行,飛行 速度各不相同
- 每架敵機出現(xiàn)的 水平位置 也不盡相同
- 當敵機 從屏幕下方飛出,不會再飛回到屏幕中

- 初始化方法
- 指定 敵機圖片
- 隨機 敵機的 初始位置 和 初始速度
- 重寫 update() 方法
- 判斷 是否飛出屏幕,如果是,從 精靈組 刪除
2.1 敵機類的準備
- 在 plane_sprites 新建 Enemy 繼承自 GameSprite
- 重寫 初始化方法,直接指定 圖片名稱
- 暫時 不實現(xiàn) 隨機速度 和 隨機位置 的指定
- 重寫 update 方法,判斷是否飛出屏幕
class Enemy(GameSprite):
"""敵機精靈"""
def __init__(self):
# 1. 調用父類方法,創(chuàng)建敵機精靈,并且指定敵機的圖像
super().__init__("./images/enemy1.png")
# 2. 設置敵機的隨機初始速度
# 3. 設置敵機的隨機初始位置
def update(self):
# 1. 調用父類方法,讓敵機在垂直方向運動
super().update()
# 2. 判斷是否飛出屏幕,如果是,需要將敵機從精靈組刪除
if self.rect.y >= SCREEN_RECT.height:
print("敵機飛出屏幕...")
2.2 創(chuàng)建敵機
演練步驟
- 在 __create_sprites,添加 敵機精靈組
- 敵機是 定時被創(chuàng)建的,因此在初始化方法中,不需要創(chuàng)建敵機
- 在 __event_handler,創(chuàng)建敵機,并且 添加到精靈組
- 調用 精靈組 的 add 方法可以 向精靈組添加精靈
- 在 __update_sprites,讓 敵機精靈組 調用 update 和 draw 方法

演練代碼
- 修改 plane_main 的 __create_sprites 方法
# 敵機組 self.enemy_group = pygame.sprite.Group()
修改 plane_main 的 __update_sprites 方法
self.enemy_group.update() self.enemy_group.draw(self.screen)
定時出現(xiàn)敵機
elif event.type == CREATE_ENEMY_EVENT: self.enemy_group.add(Enemy())
2.3 隨機敵機位置和速度
- 導入模塊
- 在導入模塊時,建議 按照以下順序導入
1. 官方標準模塊導入 2. 第三方模塊導入 3. 應用程序模塊導入
修改 plane_sprites.py 增加 random 的導入
import random
- 隨機位置

使用 pygame.Rect 提供的 bottom 屬性,在指定敵機初始位置時,會比較方便
- bottom = y + height
- y = bottom - height
- 代碼實現(xiàn)
- 修改 初始化方法,隨機敵機出現(xiàn) 速度 和 位置
def __init__(self):
# 1. 調用父類方法,創(chuàng)建敵機精靈,并且指定敵機的圖像
super().__init__("./images/enemy1.png")
# 2. 設置敵機的隨機初始速度 1 ~ 3
self.speed = random.randint(1, 3)
# 3. 設置敵機的隨機初始位置
self.rect.bottom = 0
max_x = SCREEN_RECT.width - self.rect.width
self.rect.x = random.randint(0, max_x)
2.4 移出屏幕銷毀敵機
- 敵機移出屏幕之后,如果 沒有撞到英雄,敵機的歷史使命已經終結
- 需要從 敵機組 刪除,否則會造成 內存浪費
檢測敵機被銷毀
- del 內置方法會在對象被銷毀前調用,在開發(fā)中,可以用于 判斷對象是否被銷毀
def __del__(self):
print("敵機掛了 %s" % self.rect)
代碼實現(xiàn)

判斷敵機是否飛出屏幕,如果是,調用 kill() 方法從所有組中刪除
def update(self):
super().update()
# 判斷敵機是否移出屏幕
if self.rect.y >= SCREEN_RECT.height:
# 將精靈從所有組中刪除
self.kill()
更多關于Python相關內容可查看本站專題:《Python游戲開發(fā)技巧總結》、《Python數(shù)據(jù)結構與算法教程》、《Python Socket編程技巧總結》、《Python函數(shù)使用技巧總結》、《Python字符串操作技巧匯總》、《Python入門與進階經典教程》及《Python文件與目錄操作技巧匯總》
希望本文所述對大家Python程序設計有所幫助。
相關文章
淺談python requests 的put, post 請求參數(shù)的問題
今天小編就為大家分享一篇淺談python requests 的put, post 請求參數(shù)的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-01-01
Python報錯:TypeError:?‘xxx‘?object?is?not?subscriptable解決
這篇文章主要給大家介紹了關于Python報錯:TypeError:?‘xxx‘?object?is?not?subscriptable的解決辦法,TypeError是Python中的一種錯誤,表示操作或函數(shù)應用于不合適類型的對象時發(fā)生,文中將解決辦法介紹的非常詳細,需要的朋友可以參考下2024-08-08
Python利用docx模塊實現(xiàn)快速操作word文件
這篇文章主要為大家詳細介紹了Python如何利用docx模塊實現(xiàn)快速操作word文件,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下2022-09-09
用Python的pandas框架操作Excel文件中的數(shù)據(jù)教程
這篇文章主要介紹了用Python的pandas框架操作Excel文件中的數(shù)據(jù)教程,包括單位格式轉換、分類匯總等基本操作,需要的朋友可以參考下2015-03-03
python調用chrome實現(xiàn)網頁自動操作過程
這篇文章主要介紹了python調用chrome實現(xiàn)網頁自動操作,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧2023-11-11

