1. 程式人生 > >Python - - 項目實戰 -- 遊戲框架搭建

Python - - 項目實戰 -- 遊戲框架搭建

部分 sta align tab 判斷 數字 game 向上 通過

目標 -- 使用 面向對象 設計 飛機大戰遊戲類

目標

  • 明確主程序職責
  • 實現主程序類
  • 準備遊戲精靈組

01,明確主程序職責

  • 回顧 快速入門案例 ,一個遊戲主程序的 職責 可以分為兩個部分
    • 遊戲初始化
    • 遊戲循環
  • 根據明確的職責,設計 PlaneGame 類如下:

技術分享圖片

提示 根據 職責 封裝私有方法,可以避免某一個方法的代碼寫得太過冗長;如果某一個方法編寫的太長,既不好閱讀,也不好維護

  • 遊戲初始化 - - __init__() 會調用一下方法:
方法 職責
__event_handler(self) 事件監聽
__check_collide(self) 碰撞檢測 - - 子彈銷毀敵機、敵機撞毀英雄
__update_sprites(self) 精靈組更新和繪制
__game_over() 遊戲結束

02,實現飛機大戰主遊戲類

2.1 明確文件職責

技術分享圖片

  • plane_main
    • 1,封裝 主遊戲類
    • 2,創建 遊戲對象
    • 3,啟動遊戲
  • plane_sprites
    • 封裝遊戲中 所有 需要使用的 精靈子類
    • 提供遊戲的 相關工具

代碼實現

  • 新建 plane_main.py 文件,並且設置為可執行
  • 編寫 基礎代碼

import pygame
from Aircraft_War.plane_sprites import *

class PlaneGame(object):
    """飛機大戰主遊戲"""

    def __init__(self):
        print("遊戲初始化")
        # 1,創建遊戲的窗口
        self.screen = pygame.display.set_mode((480, 700))

        # 2,創建遊戲的時鐘
        self.clock = pygame.time.Clock()

        # 3,調用私有方法, 精靈和精靈組的創建
        self.__create_sprites()

    def __create_sprites(self):
        pass

    def start_game(self):
        print("遊戲開始...")


if __name__ == ‘__main__‘:
    # 創建遊戲對象
    game = PlaneGame()

    # 啟動遊戲
    game.start_game()

使用 常量 代替固定的數值

  • 常量 - - 不變化的量
  • 變量 - - 可以變化的量

應用場景

  • 在開發時,可能會需要使用 固定的數值,例如 屏幕的高度700
  • 這個時候,建議 不要 直接使用固定數值,而應該使用 常量
  • 在開發時,為了保證代碼的可維護性,盡量不要使用 魔法數字

常量的定義

  • 定義 常量 和 定義 變量 的語法完全一樣,都是使用 賦值語句
  • 常量命令 應該是 所有字母都是大寫,單詞與單詞之間使用下劃線

常量的好處

  • 閱讀代碼時,通過 常量名 見名之意,不需要猜測數字的含義
  • 如果需要 調整值,只需要 修改常量定義 就可以實現 統一修改

提示: Python 中並沒有真正意義的常量,只是通過命名的約定 - - 所有字母都是大寫的及時常量,開發時不要輕易的修改!

代碼調整

  • plane_sprites.py 中增加常量的定義

plane_sprites.py


import pygame

# 屏幕大小的常量
SCREEN_RECT = pygame.Rect(0, 0, 480, 700)
# 刷新的幀率
FRAME_PER_SEC = 60
class GameSprite(pygame.sprite.Sprite):
    """飛機大戰遊戲精靈"""

    def __init__(self, image_name, speed=1):
        # 調用父類的初始化方法
        super().__init__()

        # 定義對象的屬性
        self.image = pygame.image.load(image_name)
        self.rect = self.image.get_rect()
        self.speed = speed

    def update(self, *args):
        # 在屏幕的垂直方向上移動
        self.rect.y += self.speed

plan_main.py


import pygame
from Aircraft_War.plane_sprites import *

class PlaneGame(object):
    """飛機大戰主遊戲"""

    def __init__(self):
        print("遊戲初始化")
        # 1,創建遊戲的窗口
        # self.screen = pygame.display.set_mode((480, 700))
        self.screen = pygame.display.set_mode(SCREEN_RECT.size)

        # 2,創建遊戲的時鐘
        self.clock = pygame.time.Clock()

        # 3,調用私有方法, 精靈和精靈組的創建
        self.__create_sprites()

    def __create_sprites(self):
        pass

    def start_game(self):
        print("遊戲開始...")

        while True:
            # 1,設置刷新幀率
            self.clock.tick(FRAME_PER_SEC)

            # 2,事件監聽
            self.__event_handler()

            # 3,碰撞檢測
            self.__check_collide()

            # 4,更新/繪制精靈組
            self.__update_sprites()

            # 5,更新顯示
            pygame.display.update()


    def __event_handler(self):

        for event in pygame.event.get():
            # 判斷是否退出遊戲
            if event.type == pygame.QUIT:
                PlaneGame.__game_over()

    def __check_collide(self):
        pass

    def __update_sprites(self):
        pass

    @staticmethod
    def __game_over():
        print("遊戲結束")

        pygame.QUIT()
        exit()


if __name__ == ‘__main__‘:
    # 創建遊戲對象
    game = PlaneGame()

    # 啟動遊戲
    game.start_game()

Python - - 項目實戰 -- 遊戲框架搭建