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