设定游戏背景和英雄登场
生活随笔
收集整理的這篇文章主要介紹了
设定游戏背景和英雄登场
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、游戲背景
文章目錄
- 一、游戲背景
- 01. 背景交替滾動的思路確定
- 1.1 實現思路分析
- 1.2 設計背景類
- 02. 顯示游戲背景
- 2.1 背景精靈的基本實現
- 2.2 在 `plane_main.py` 中顯示背景精靈
- 2.3 利用初始化方法,簡化背景精靈創建
- 二、英雄登場
- 01. 設計 **英雄** 和 **子彈** 類
- 英雄需求
- 子彈需求
- Hero —— 英雄
- Bullet —— 子彈
- 02. 創建英雄
- 2.1 準備英雄類
- 2.2 繪制英雄
- 代碼實現
- 03. 移動英雄位置
- 3.1 移動英雄位置
- 3.2 控制英雄運動邊界
- 04. 發射子彈
- 需求回顧 —— 英雄需求
- 4.1 添加發射子彈事件
- 4.2 定義子彈類
- 需求回顧 —— 子彈需求
- Bullet —— 子彈
- 定義子彈類
- 4.3 發射子彈
- 一次發射三枚子彈
01. 背景交替滾動的思路確定
運行 備課代碼,觀察 背景圖像的顯示效果:
- 游戲啟動后,背景圖像 會 連續不斷地 向下方 移動
- 在 視覺上 產生英雄的飛機不斷向上方飛行的 錯覺 —— 在很多跑酷類游戲中常用的套路
- 游戲的背景 不斷變化
- 游戲的主角 位置保持不變
1.1 實現思路分析
解決辦法
- 第 1 張 完全和屏幕重合
- 第 2 張在 屏幕的正上方
- self.rect.y += self.speed
- rect.y = -rect.height
1.2 設計背景類
- 初始化方法
- 直接指定 背景圖片
- is_alt 判斷是否是另一張圖像
- False 表示 第一張圖像,需要與屏幕重合
- True 表示 另一張圖像,在屏幕的正上方
- update() 方法
- 判斷 是否移動出屏幕,如果是,將圖像設置到 屏幕的正上方,從而實現 交替滾動
繼承 如果父類提供的方法,不能滿足子類的需求:
- 派生一個子類
- 在子類中針對特有的需求,重寫父類方法,并且進行擴展
02. 顯示游戲背景
2.1 背景精靈的基本實現
- 在 plane_sprites 新建 Background 繼承自 GameSprite
2.2 在 plane_main.py 中顯示背景精靈
__create_sprites 方法
def __create_sprites(self):# 創建背景精靈和精靈組bg1 = Background("./images/background.png")bg2 = Background("./images/background.png")bg2.rect.y = -bg2.rect.heightself.back_group = pygame.sprite.Group(bg1, bg2)__update_sprites 方法
def __update_sprites(self):self.back_group.update()self.back_group.draw(self.screen)2.3 利用初始化方法,簡化背景精靈創建
思考 —— 上一小結完成的代碼存在什么樣的問題?能否簡化?
- 在主程序中,創建的兩個背景精靈,傳入了相同的圖像文件路徑
- 創建 第二個 背景精靈 時,在主程序中,設置背景精靈的圖像位置
思考 —— 精靈 初始位置 的設置,應該 由主程序負責?還是 由精靈自己負責?
答案 —— 由精靈自己負責
-
根據面向對象設計原則,應該將對象的職責,封裝到類的代碼內部
-
盡量簡化程序調用一方的代碼調用
-
初始化方法
- 直接指定 背景圖片
- is_alt 判斷是否是另一張圖像
- False 表示 第一張圖像,需要與屏幕重合
- True 表示 另一張圖像,在屏幕的正上方
在 plane_sprites.py 中實現 Background 的 初始化方法
def __init__(self, is_alt=False):image_name = "./images/background.png"super().__init__(image_name)# 判斷是否交替圖片,如果是,將圖片設置到屏幕頂部if is_alt:self.rect.y = -self.rect.height- 修改 plane_main 的 __create_sprites 方法
二、英雄登場
01. 設計 英雄 和 子彈 類
英雄需求
子彈需求
Hero —— 英雄
- 初始化方法
- 指定 英雄圖片
- 初始速度 = 0 —— 英雄默認靜止不動
- 定義 bullets 子彈精靈組 保存子彈精靈
- 重寫 update() 方法
- 英雄需要 水平移動
- 并且需要保證不能 移出屏幕
- 增加 bullets 屬性,記錄所有 子彈精靈
- 增加 fire 方法,用于發射子彈
Bullet —— 子彈
- 初始化方法
- 指定 子彈圖片
- 初始速度 = -2 —— 子彈需要向上方飛行
- 重寫 update() 方法
- 判斷 是否飛出屏幕,如果是,從 精靈組 刪除
02. 創建英雄
2.1 準備英雄類
- 在 plane_sprites 新建 Hero 類
- 重寫 初始化方法,直接指定 圖片名稱,并且將初始速度設置為 0
- 設置 英雄的初始位置
- centerx = x + 0.5 * width
- centery = y + 0.5 * height
- bottom = y + height
2.2 繪制英雄
- 后續要針對 英雄 做 碰撞檢測 以及 發射子彈
- 所以 英雄 需要 單獨定義成屬性
代碼實現
- 修改 __create_sprites 方法如下:
- 修改 __update_sprites 方法如下:
03. 移動英雄位置
在 pygame 中針對 鍵盤按鍵的捕獲,有 兩種 方式
-
第一種方式 判斷 event.type == pygame.KEYDOWN
-
第二種方式
- 首先使用 pygame.key.get_pressed() 返回 所有按鍵元組
- 通過 鍵盤常量,判斷元組中 某一個鍵是否被按下 —— 如果被按下,對應數值為 1
提問 這兩種方式之間有什么區別呢?
- 第一種方式
- 第二種方式
結論
- 第一種方式 event.type 用戶 必須要抬起按鍵 才算一次 按鍵事件,操作靈活性會大打折扣
- 第二種方式 用戶可以按住方向鍵不放,就能夠實現持續向某一個方向移動了,操作靈活性更好
3.1 移動英雄位置
演練步驟
- 用 速度 speed 和 英雄 rect.x 進行疊加
- 不需要調用父類方法 —— 父類方法只是實現了單純的垂直運動
- 向右 => speed = 2
- 向左 => speed = -2
- 其他 => speed = 0
代碼演練
- 在 Hero 類,重寫 update() 方法,根據速度水平移動 英雄的飛機
- 調整鍵盤按鍵代碼
3.2 控制英雄運動邊界
-
在 Hero 類的 update() 方法判斷 英雄 是否超出 屏幕邊界
-
right = x + width 利用 right 屬性可以非常容易的針對右側設置精靈位置
04. 發射子彈
需求回顧 —— 英雄需求
4.1 添加發射子彈事件
pygame 的 定時器 使用套路非常固定:
代碼實現
- 在 Hero 中定義 fire 方法
- 在 plane_main.py 的頂部定義 發射子彈 事件常量
- 在 __init__ 方法末尾中添加 發射子彈 事件
- 在 __event_handler 方法中讓英雄發射子彈
4.2 定義子彈類
需求回顧 —— 子彈需求
Bullet —— 子彈
- 初始化方法
- 指定 子彈圖片
- 初始速度 = -2 —— 子彈需要向上方飛行
- 重寫 update() 方法
- 判斷 是否飛出屏幕,如果是,從 精靈組 刪除
定義子彈類
- 在 plane_sprites 新建 Bullet 繼承自 GameSprite
- 重寫 初始化方法,直接指定 圖片名稱,并且設置 初始速度
- 重寫 update() 方法,判斷子彈 飛出屏幕從精靈組刪除
4.3 發射子彈
演練步驟
- 創建子彈精靈
- 設置初始位置 —— 在 英雄的正上方
- 將 子彈 添加到精靈組
代碼實現
- 初始化方法
- 修改 fire() 方法
一次發射三枚子彈
- 修改 fire() 方法,一次發射三枚子彈
總結
以上是生活随笔為你收集整理的设定游戏背景和英雄登场的全部內容,希望文章能夠幫你解決所遇到的問題。