91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python飛機大戰pygame游戲之敵機出場實現方法詳解

發布時間:2020-09-18 15:00:48 來源:腳本之家 閱讀:214 作者:小飛俠v科比 欄目:開發技術

本文實例講述了python飛機大戰pygame游戲之敵機出場實現方法。分享給大家供大家參考,具體如下:

目標

使用 定時器 添加敵機

  • 設計 Enemy 類

01. 使用定時器添加敵機

運行 備課代碼,觀察 敵機的 出現規律:

  1. 游戲啟動后,每隔 1 秒 會 出現一架敵機
  2. 每架敵機 向屏幕下方飛行,飛行 速度各不相同
  3. 每架敵機出現的 水平位置 也不盡相同
  4. 當敵機 從屏幕下方飛出,不會再飛回到屏幕中

1.1 定時器

  • 在 pygame 中可以使用 pygame.time.set_timer() 來添加 定時器
  • 所謂 定時器,就是 每隔一段時間,去 執行一些動作
set_timer(eventid, milliseconds) -> None
  • set_timer 可以創建一個 事件
  • 可以在 游戲循環 的 事件監聽 方法中捕獲到該事件
  • 第 1 個參數 事件代號 需要基于常量 pygame.USEREVENT 來指定
    • USEREVENT 是一個整數,再增加的事件可以使用 USEREVENT + 1 指定,依次類推…
  • 第 2 個參數是 事件觸發 間隔的 毫秒值

定時器事件的監聽

  • 通過 pygame.event.get() 可以獲取當前時刻所有的 事件列表
  • 遍歷列表 并且判斷 event.type 是否等于 eventid,如果相等,表示 定時器事件 發生

1.2 定義并監聽創建敵機的定時器事件

pygame 的 定時器 使用套路非常固定:

  1. 定義 定時器常量 —— eventid
  2. 在 初始化方法 中,調用 set_timer 方法 設置定時器事件
  3. 在 游戲循環 中,監聽定時器事件

1) 定義事件

  • 在 plane_sprites.py 的頂部定義 事件常量
# 敵機的定時器事件常量
CREATE_ENEMY_EVENT = pygame.USEREVENT

在 PlaneGame 的 初始化方法 中 創建用戶事件

# 4. 設置定時器事件 - 每秒創建一架敵機
pygame.time.set_timer(CREATE_ENEMY_EVENT, 1000)

2) 監聽定時器事件

  • 在 __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. 游戲啟動后,每隔 1 秒 會 出現一架敵機
  2. 每架敵機 向屏幕下方飛行,飛行 速度各不相同
  3. 每架敵機出現的 水平位置 也不盡相同
  4. 當敵機 從屏幕下方飛出,不會再飛回到屏幕中
    python飛機大戰pygame游戲之敵機出場實現方法詳解
  • 初始化方法
    • 指定 敵機圖片
    • 隨機 敵機的 初始位置 和 初始速度
  • 重寫 update() 方法
    • 判斷 是否飛出屏幕,如果是,從 精靈組 刪除

2.1 敵機類的準備

  • 在 plane_sprites 新建 Enemy 繼承自 GameSprite
  • 重寫 初始化方法,直接指定 圖片名稱
  • 暫時 不實現 隨機速度 和 隨機位置 的指定
  • 重寫 update 方法,判斷是否飛出屏幕
class Enemy(GameSprite):
  """敵機精靈"""
  
  def __init__(self):
    
    # 1. 調用父類方法,創建敵機精靈,并且指定敵機的圖像
    super().__init__("./images/enemy1.png")

    # 2. 設置敵機的隨機初始速度

    # 3. 設置敵機的隨機初始位置
  
  def update(self):
    
    # 1. 調用父類方法,讓敵機在垂直方向運動
    super().update()
    
    # 2. 判斷是否飛出屏幕,如果是,需要將敵機從精靈組刪除
    if self.rect.y >= SCREEN_RECT.height:
      print("敵機飛出屏幕...")  

2.2 創建敵機

演練步驟

  1. 在 __create_sprites,添加 敵機精靈組
    • 敵機是 定時被創建的,因此在初始化方法中,不需要創建敵機
  2. 在 __event_handler,創建敵機,并且 添加到精靈組
    • 調用 精靈組 的 add 方法可以 向精靈組添加精靈
  3. 在 __update_sprites,讓 敵機精靈組 調用 update 和 draw 方法
    python飛機大戰pygame游戲之敵機出場實現方法詳解
    演練代碼
  • 修改 plane_main 的 __create_sprites 方法
# 敵機組
self.enemy_group = pygame.sprite.Group()

修改 plane_main 的 __update_sprites 方法

self.enemy_group.update()
self.enemy_group.draw(self.screen)

定時出現敵機

elif event.type == CREATE_ENEMY_EVENT:
  self.enemy_group.add(Enemy())

2.3 隨機敵機位置和速度

  1. 導入模塊
  • 在導入模塊時,建議 按照以下順序導入
1. 官方標準模塊導入
2. 第三方模塊導入
3. 應用程序模塊導入

修改 plane_sprites.py 增加 random 的導入

import random
  1. 隨機位置
    python飛機大戰pygame游戲之敵機出場實現方法詳解
    使用 pygame.Rect 提供的 bottom 屬性,在指定敵機初始位置時,會比較方便
  • bottom = y + height
  • y = bottom - height
  1. 代碼實現
  • 修改 初始化方法,隨機敵機出現 速度 和 位置
def __init__(self):

  # 1. 調用父類方法,創建敵機精靈,并且指定敵機的圖像
  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 內置方法會在對象被銷毀前調用,在開發中,可以用于 判斷對象是否被銷毀
def __del__(self):
  print("敵機掛了 %s" % self.rect)

代碼實現
python飛機大戰pygame游戲之敵機出場實現方法詳解
判斷敵機是否飛出屏幕,如果是,調用 kill() 方法從所有組中刪除

def update(self):
  super().update()
  
  # 判斷敵機是否移出屏幕
  if self.rect.y >= SCREEN_RECT.height:
    # 將精靈從所有組中刪除
    self.kill()

更多關于Python相關內容可查看本站專題:《Python游戲開發技巧總結》、《Python數據結構與算法教程》、《Python Socket編程技巧總結》、《Python函數使用技巧總結》、《Python字符串操作技巧匯總》、《Python入門與進階經典教程》及《Python文件與目錄操作技巧匯總》

希望本文所述對大家Python程序設計有所幫助。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

泰兴市| 汉川市| 黄浦区| 开江县| 通河县| 遵义县| 上栗县| 宜昌市| 嘉荫县| 陆川县| 固阳县| 崇文区| 蛟河市| 大城县| 方城县| 安图县| 松溪县| 曲周县| 许昌县| 远安县| 宁国市| 长顺县| 五大连池市| 佛坪县| 建瓯市| 扶绥县| 英德市| 济源市| 广宁县| 连云港市| 瓦房店市| 交城县| 田阳县| 漳平市| 凯里市| 闽清县| 湟中县| 金坛市| 屏边| 汉川市| 格尔木市|