敌机登场和碰撞检测
一、敵機(jī)出場(chǎng)
文章目錄
- 一、敵機(jī)出場(chǎng)
- 01. 使用定時(shí)器添加敵機(jī)
- 1.1 定時(shí)器
- 1.2 定義并監(jiān)聽(tīng)創(chuàng)建敵機(jī)的定時(shí)器事件
- 1) 定義事件
- 2) 監(jiān)聽(tīng)定時(shí)器事件
- 02. 設(shè)計(jì) `Enemy` 類
- 2.1 敵機(jī)類的準(zhǔn)備
- 2.2 創(chuàng)建敵機(jī)
- 2.3 隨機(jī)敵機(jī)位置和速度
- 1) 導(dǎo)入模塊
- 2) 隨機(jī)位置
- 3) 代碼實(shí)現(xiàn)
- 2.4 移出屏幕銷毀敵機(jī)
- 檢測(cè)敵機(jī)被銷毀
- 代碼實(shí)現(xiàn)
- 二、碰撞檢測(cè)
- 01. 了解碰撞檢測(cè)方法
- pygame.sprite.groupcollide()
- pygame.sprite.spritecollide()
- 02. 碰撞實(shí)現(xiàn)
01. 使用定時(shí)器添加敵機(jī)
1.1 定時(shí)器
- 在 pygame 中可以使用 pygame.time.set_timer() 來(lái)添加 定時(shí)器
- 所謂 定時(shí)器,就是 每隔一段時(shí)間,去 執(zhí)行一些動(dòng)作
- set_timer 可以創(chuàng)建一個(gè) 事件
- 可以在 游戲循環(huán) 的 事件監(jiān)聽(tīng) 方法中捕獲到該事件
- 第 1 個(gè)參數(shù) 事件代號(hào) 需要基于常量 pygame.USEREVENT 來(lái)指定
- USEREVENT 是一個(gè)整數(shù),再增加的事件可以使用 USEREVENT + 1 指定,依次類推…
- 第 2 個(gè)參數(shù)是 事件觸發(fā) 間隔的 毫秒值
定時(shí)器事件的監(jiān)聽(tīng)
- 通過(guò) pygame.event.get() 可以獲取當(dāng)前時(shí)刻所有的 事件列表
- 遍歷列表 并且判斷 event.type 是否等于 eventid,如果相等,表示 定時(shí)器事件 發(fā)生
1.2 定義并監(jiān)聽(tīng)創(chuàng)建敵機(jī)的定時(shí)器事件
pygame 的 定時(shí)器 使用套路非常固定:
1) 定義事件
- 在 plane_sprites.py 的頂部定義 事件常量
- 在 PlaneGame 的 初始化方法 中 創(chuàng)建用戶事件
2) 監(jiān)聽(tīng)定時(shí)器事件
- 在 __event_handler 方法中增加以下代碼:
02. 設(shè)計(jì) Enemy 類
- 初始化方法
- 指定 敵機(jī)圖片
- 隨機(jī) 敵機(jī)的 初始位置 和 初始速度
- 重寫 update() 方法
- 判斷 是否飛出屏幕,如果是,從 精靈組 刪除
2.1 敵機(jī)類的準(zhǔn)備
- 在 plane_sprites 新建 Enemy 繼承自 GameSprite
- 重寫 初始化方法,直接指定 圖片名稱
- 暫時(shí) 不實(shí)現(xiàn) 隨機(jī)速度 和 隨機(jī)位置 的指定
- 重寫 update 方法,判斷是否飛出屏幕
2.2 創(chuàng)建敵機(jī)
演練步驟
- 敵機(jī)是 定時(shí)被創(chuàng)建的,因此在初始化方法中,不需要?jiǎng)?chuàng)建敵機(jī)
- 調(diào)用 精靈組 的 add 方法可以 向精靈組添加精靈
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-x6ko10oe-1588827509150)(media/15025309517247/006_pygame.SpriteII.png)]
演練代碼
- 修改 plane_main 的 __create_sprites 方法
- 修改 plane_main 的 __update_sprites 方法
- 定時(shí)出現(xiàn)敵機(jī)
2.3 隨機(jī)敵機(jī)位置和速度
1) 導(dǎo)入模塊
- 在導(dǎo)入模塊時(shí),建議 按照以下順序?qū)?/li>
- 修改 plane_sprites.py 增加 random 的導(dǎo)入
2) 隨機(jī)位置
使用 pygame.Rect 提供的 bottom 屬性,在指定敵機(jī)初始位置時(shí),會(huì)比較方便
- bottom = y + height
- y = bottom - height
3) 代碼實(shí)現(xiàn)
- 修改 初始化方法,隨機(jī)敵機(jī)出現(xiàn) 速度 和 位置
2.4 移出屏幕銷毀敵機(jī)
- 敵機(jī)移出屏幕之后,如果 沒(méi)有撞到英雄,敵機(jī)的歷史使命已經(jīng)終結(jié)
- 需要從 敵機(jī)組 刪除,否則會(huì)造成 內(nèi)存浪費(fèi)
檢測(cè)敵機(jī)被銷毀
- __del__ 內(nèi)置方法會(huì)在對(duì)象被銷毀前調(diào)用,在開(kāi)發(fā)中,可以用于 判斷對(duì)象是否被銷毀
代碼實(shí)現(xiàn)
- 判斷敵機(jī)是否飛出屏幕,如果是,調(diào)用 kill() 方法從所有組中刪除
二、碰撞檢測(cè)
01. 了解碰撞檢測(cè)方法
- pygame 提供了 兩個(gè)非常方便 的方法可以實(shí)現(xiàn)碰撞檢測(cè):
pygame.sprite.groupcollide()
- 兩個(gè)精靈組 中 所有的精靈 的碰撞檢測(cè)
- 如果將 dokill 設(shè)置為 True,則 發(fā)生碰撞的精靈將被自動(dòng)移除
- collided 參數(shù)是用于 計(jì)算碰撞的回調(diào)函數(shù)
- 如果沒(méi)有指定,則每個(gè)精靈必須有一個(gè) rect 屬性
pygame.sprite.spritecollide()
- 判斷 某個(gè)精靈 和 指定精靈組 中的精靈的碰撞
- 如果將 dokill 設(shè)置為 True,則 指定精靈組 中 發(fā)生碰撞的精靈將被自動(dòng)移除
- collided 參數(shù)是用于 計(jì)算碰撞的回調(diào)函數(shù)
- 如果沒(méi)有指定,則每個(gè)精靈必須有一個(gè) rect 屬性
- 返回 精靈組 中跟 精靈 發(fā)生碰撞的 精靈列表
02. 碰撞實(shí)現(xiàn)
def __check_collide(self):# 1. 子彈摧毀敵機(jī)pygame.sprite.groupcollide(self.hero.bullets, self.enemy_group, True, True)# 2. 敵機(jī)撞毀英雄enemies = pygame.sprite.spritecollide(self.hero, self.enemy_group, True)# 判斷列表時(shí)候有內(nèi)容if len(enemies) > 0:# 讓英雄犧牲self.hero.kill()# 結(jié)束游戲PlaneGame.__game_over()總結(jié)
- 上一篇: 设定游戏背景和英雄登场
- 下一篇: 小Q购物