日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

敌机登场和碰撞检测

發(fā)布時間:2024/4/11 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 敌机登场和碰撞检测 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、敵機出場

文章目錄

  • 一、敵機出場
    • 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.1 定時器

    • 在 pygame 中可以使用 pygame.time.set_timer() 來添加 定時器
    • 所謂 定時器,就是 每隔一段時間,去 執(zhí)行一些動作
    set_timer(eventid, milliseconds) -> None
    • 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 的 定時器 使用套路非常固定:

  • 定義 定時器常量 —— 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 秒出現一架敵機
  • 每架敵機 向屏幕下方飛行,飛行 速度各不相同
  • 每架敵機出現的 水平位置 也不盡相同
  • 當敵機 從屏幕下方飛出,不會再飛回到屏幕中
    • 初始化方法
      • 指定 敵機圖片
      • 隨機 敵機的 初始位置初始速度
    • 重寫 update() 方法
      • 判斷 是否飛出屏幕,如果是,從 精靈組 刪除

    2.1 敵機類的準備

    • 在 plane_sprites 新建 Enemy 繼承自 GameSprite
    • 重寫 初始化方法,直接指定 圖片名稱
    • 暫時 不實現 隨機速度隨機位置 的指定
    • 重寫 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 方法
  • [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-x6ko10oe-1588827509150)(media/15025309517247/006_pygame.SpriteII.png)]

    演練代碼

    • 修改 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

    2) 隨機位置

    使用 pygame.Rect 提供的 bottom 屬性,在指定敵機初始位置時,會比較方便

    • bottom = y + height
    • y = bottom - height

    3) 代碼實現

    • 修改 初始化方法,隨機敵機出現 速度位置
    def __init__(self):# 1. 調用父類方法,創(chuàng)建敵機精靈,并且指定敵機的圖像super().__init__("./images/enemy1.png")# 2. 設置敵機的隨機初始速度 1 ~ 3self.speed = random.randint(1, 3)# 3. 設置敵機的隨機初始位置self.rect.bottom = 0max_x = SCREEN_RECT.width - self.rect.widthself.rect.x = random.randint(0, max_x)

    2.4 移出屏幕銷毀敵機

    • 敵機移出屏幕之后,如果 沒有撞到英雄,敵機的歷史使命已經終結
    • 需要從 敵機組 刪除,否則會造成 內存浪費

    檢測敵機被銷毀

    • __del__ 內置方法會在對象被銷毀前調用,在開發(fā)中,可以用于 判斷對象是否被銷毀
    def __del__(self):print("敵機掛了 %s" % self.rect)

    代碼實現

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

    二、碰撞檢測

    01. 了解碰撞檢測方法

    • pygame 提供了 兩個非常方便 的方法可以實現碰撞檢測:

    pygame.sprite.groupcollide()

    • 兩個精靈組所有的精靈 的碰撞檢測
    groupcollide(group1, group2, dokill1, dokill2, collided = None) -> Sprite_dict
    • 如果將 dokill 設置為 True,則 發(fā)生碰撞的精靈將被自動移除
    • collided 參數是用于 計算碰撞的回調函數
      • 如果沒有指定,則每個精靈必須有一個 rect 屬性

    pygame.sprite.spritecollide()

    • 判斷 某個精靈指定精靈組 中的精靈的碰撞
    spritecollide(sprite, group, dokill, collided = None) -> Sprite_list
    • 如果將 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()

    總結

    以上是生活随笔為你收集整理的敌机登场和碰撞检测的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。