python飛機(jī)大戰(zhàn)pygame游戲之?dāng)硻C(jī)出場(chǎng)實(shí)現(xiàn)方法詳解
本文實(shí)例講述了python飛機(jī)大戰(zhàn)pygame游戲之?dāng)硻C(jī)出場(chǎng)實(shí)現(xiàn)方法。分享給大家供大家參考,具體如下:
目標(biāo)
使用 定時(shí)器 添加敵機(jī)
- 設(shè)計(jì) Enemy 類
01. 使用定時(shí)器添加敵機(jī)
運(yùn)行 備課代碼,觀察 敵機(jī)的 出現(xiàn)規(guī)律:
- 游戲啟動(dòng)后,每隔 1 秒 會(huì) 出現(xiàn)一架敵機(jī)
- 每架敵機(jī) 向屏幕下方飛行,飛行 速度各不相同
- 每架敵機(jī)出現(xiàn)的 水平位置 也不盡相同
- 當(dāng)敵機(jī) 從屏幕下方飛出,不會(huì)再飛回到屏幕中
1.1 定時(shí)器
- 在 pygame 中可以使用 pygame.time.set_timer() 來添加 定時(shí)器
- 所謂 定時(shí)器,就是 每隔一段時(shí)間,去 執(zhí)行一些動(dòng)作
set_timer(eventid, milliseconds) -> None
- set_timer 可以創(chuàng)建一個(gè) 事件
- 可以在 游戲循環(huán) 的 事件監(jiān)聽 方法中捕獲到該事件
- 第 1 個(gè)參數(shù) 事件代號(hào) 需要基于常量 pygame.USEREVENT 來指定
- USEREVENT 是一個(gè)整數(shù),再增加的事件可以使用 USEREVENT + 1 指定,依次類推…
- 第 2 個(gè)參數(shù)是 事件觸發(fā) 間隔的 毫秒值
定時(shí)器事件的監(jiān)聽
- 通過 pygame.event.get() 可以獲取當(dāng)前時(shí)刻所有的 事件列表
- 遍歷列表 并且判斷 event.type 是否等于 eventid,如果相等,表示 定時(shí)器事件 發(fā)生
1.2 定義并監(jiān)聽創(chuàng)建敵機(jī)的定時(shí)器事件
pygame 的 定時(shí)器 使用套路非常固定:
- 定義 定時(shí)器常量 —— eventid
- 在 初始化方法 中,調(diào)用 set_timer 方法 設(shè)置定時(shí)器事件
- 在 游戲循環(huán) 中,監(jiān)聽定時(shí)器事件
1) 定義事件
- 在 plane_sprites.py 的頂部定義 事件常量
# 敵機(jī)的定時(shí)器事件常量 CREATE_ENEMY_EVENT = pygame.USEREVENT
在 PlaneGame 的 初始化方法 中 創(chuàng)建用戶事件
# 4. 設(shè)置定時(shí)器事件 - 每秒創(chuàng)建一架敵機(jī) pygame.time.set_timer(CREATE_ENEMY_EVENT, 1000)
2) 監(jiān)聽定時(shí)器事件
- 在 __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("敵機(jī)出場(chǎng)...")
02. 設(shè)計(jì) Enemy 類
- 游戲啟動(dòng)后,每隔 1 秒 會(huì) 出現(xiàn)一架敵機(jī)
- 每架敵機(jī) 向屏幕下方飛行,飛行 速度各不相同
- 每架敵機(jī)出現(xiàn)的 水平位置 也不盡相同
- 當(dāng)敵機(jī) 從屏幕下方飛出,不會(huì)再飛回到屏幕中
- 初始化方法
- 指定 敵機(jī)圖片
- 隨機(jī) 敵機(jī)的 初始位置 和 初始速度
- 重寫 update() 方法
- 判斷 是否飛出屏幕,如果是,從 精靈組 刪除
2.1 敵機(jī)類的準(zhǔn)備
- 在 plane_sprites 新建 Enemy 繼承自 GameSprite
- 重寫 初始化方法,直接指定 圖片名稱
- 暫時(shí) 不實(shí)現(xiàn) 隨機(jī)速度 和 隨機(jī)位置 的指定
- 重寫 update 方法,判斷是否飛出屏幕
class Enemy(GameSprite): """敵機(jī)精靈""" def __init__(self): # 1. 調(diào)用父類方法,創(chuàng)建敵機(jī)精靈,并且指定敵機(jī)的圖像 super().__init__("./images/enemy1.png") # 2. 設(shè)置敵機(jī)的隨機(jī)初始速度 # 3. 設(shè)置敵機(jī)的隨機(jī)初始位置 def update(self): # 1. 調(diào)用父類方法,讓敵機(jī)在垂直方向運(yùn)動(dòng) super().update() # 2. 判斷是否飛出屏幕,如果是,需要將敵機(jī)從精靈組刪除 if self.rect.y >= SCREEN_RECT.height: print("敵機(jī)飛出屏幕...")
2.2 創(chuàng)建敵機(jī)
演練步驟
- 在 __create_sprites,添加 敵機(jī)精靈組
- 敵機(jī)是 定時(shí)被創(chuàng)建的,因此在初始化方法中,不需要?jiǎng)?chuàng)建敵機(jī)
- 在 __event_handler,創(chuàng)建敵機(jī),并且 添加到精靈組
- 調(diào)用 精靈組 的 add 方法可以 向精靈組添加精靈
- 在 __update_sprites,讓 敵機(jī)精靈組 調(diào)用 update 和 draw 方法
演練代碼
- 修改 plane_main 的 __create_sprites 方法
# 敵機(jī)組 self.enemy_group = pygame.sprite.Group()
修改 plane_main 的 __update_sprites 方法
self.enemy_group.update() self.enemy_group.draw(self.screen)
定時(shí)出現(xiàn)敵機(jī)
elif event.type == CREATE_ENEMY_EVENT: self.enemy_group.add(Enemy())
2.3 隨機(jī)敵機(jī)位置和速度
- 導(dǎo)入模塊
- 在導(dǎo)入模塊時(shí),建議 按照以下順序?qū)?/li>
1. 官方標(biāo)準(zhǔn)模塊導(dǎo)入 2. 第三方模塊導(dǎo)入 3. 應(yīng)用程序模塊導(dǎo)入
修改 plane_sprites.py 增加 random 的導(dǎo)入
import random
- 隨機(jī)位置
使用 pygame.Rect 提供的 bottom 屬性,在指定敵機(jī)初始位置時(shí),會(huì)比較方便
- bottom = y + height
- y = bottom - height
- 代碼實(shí)現(xiàn)
- 修改 初始化方法,隨機(jī)敵機(jī)出現(xiàn) 速度 和 位置
def __init__(self): # 1. 調(diào)用父類方法,創(chuàng)建敵機(jī)精靈,并且指定敵機(jī)的圖像 super().__init__("./images/enemy1.png") # 2. 設(shè)置敵機(jī)的隨機(jī)初始速度 1 ~ 3 self.speed = random.randint(1, 3) # 3. 設(shè)置敵機(jī)的隨機(jī)初始位置 self.rect.bottom = 0 max_x = SCREEN_RECT.width - self.rect.width self.rect.x = random.randint(0, max_x)
2.4 移出屏幕銷毀敵機(jī)
- 敵機(jī)移出屏幕之后,如果 沒有撞到英雄,敵機(jī)的歷史使命已經(jīng)終結(jié)
- 需要從 敵機(jī)組 刪除,否則會(huì)造成 內(nèi)存浪費(fèi)
檢測(cè)敵機(jī)被銷毀
- del 內(nèi)置方法會(huì)在對(duì)象被銷毀前調(diào)用,在開發(fā)中,可以用于 判斷對(duì)象是否被銷毀
def __del__(self): print("敵機(jī)掛了 %s" % self.rect)
代碼實(shí)現(xiàn)
判斷敵機(jī)是否飛出屏幕,如果是,調(diào)用 kill() 方法從所有組中刪除
def update(self): super().update() # 判斷敵機(jī)是否移出屏幕 if self.rect.y >= SCREEN_RECT.height: # 將精靈從所有組中刪除 self.kill()
更多關(guān)于Python相關(guān)內(nèi)容可查看本站專題:《Python游戲開發(fā)技巧總結(jié)》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python Socket編程技巧總結(jié)》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python入門與進(jìn)階經(jīng)典教程》及《Python文件與目錄操作技巧匯總》
希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。
- Pygame實(shí)戰(zhàn)練習(xí)之飛機(jī)大戰(zhàn)游戲
- python之pygame模塊實(shí)現(xiàn)飛機(jī)大戰(zhàn)完整代碼
- Pygame框架實(shí)現(xiàn)飛機(jī)大戰(zhàn)
- pygame實(shí)現(xiàn)飛機(jī)大戰(zhàn)
- python飛機(jī)大戰(zhàn)pygame碰撞檢測(cè)實(shí)現(xiàn)方法分析
- python飛機(jī)大戰(zhàn)pygame游戲框架搭建操作詳解
- python pygame模塊編寫飛機(jī)大戰(zhàn)
- pygame實(shí)現(xiàn)簡(jiǎn)易飛機(jī)大戰(zhàn)
- Pygame庫200行代碼實(shí)現(xiàn)簡(jiǎn)易飛機(jī)大戰(zhàn)
相關(guān)文章
python環(huán)境下OPenCV處理視頻流局部區(qū)域像素值
這篇文章主要為大家介紹了python環(huán)境下OPenCV處理視頻流局部區(qū)域像素值的實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-11-11Python協(xié)程 yield與協(xié)程greenlet簡(jiǎn)單用法示例
這篇文章主要介紹了Python協(xié)程 yield與協(xié)程greenlet簡(jiǎn)單用法,簡(jiǎn)要講述了協(xié)程的概念、原理,并結(jié)合實(shí)例形式分析了Python協(xié)程 yield與協(xié)程greenlet基本使用方法,需要的朋友可以參考下2019-11-11python實(shí)現(xiàn)文本界面網(wǎng)絡(luò)聊天室
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)文本界面網(wǎng)絡(luò)聊天室,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12Python并行庫joblib之delayed函數(shù)與Parallel函數(shù)詳解
這篇文章主要介紹了Python并行庫joblib之delayed函數(shù)與Parallel函數(shù)詳解,Joblib就是一個(gè)可以簡(jiǎn)單地將Python代碼轉(zhuǎn)換為并行計(jì)算模式的軟件包,它可非常簡(jiǎn)單并行我們的程序,從而提高計(jì)算速度,需要的朋友可以參考下2023-08-08詳解python模塊pychartdir安裝及導(dǎo)入問題
這篇文章主要介紹了python模塊pychartdir導(dǎo)入問題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10Ranorex通過Python將報(bào)告發(fā)送到郵箱的方法
這篇文章主要介紹了Ranorex通過Python將報(bào)告發(fā)送到郵箱的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01