天天看點

Python——項目-小遊戲2-動畫繪制

實作遊戲循環還有事件的監聽

在上一講中 你需要完成這樣的這樣的效果, 如果你還沒有完成,請不要繼續往下閱讀!!切記切記切記。,重要的事情說三遍

Python——項目-小遊戲2-動畫繪制

我們來看一下什麼是遊戲循環

所謂的遊戲循環很好的了解 就是 ,什麼時候遊戲會退出,注意啊,我們是反向的了解 遊戲不退出,那麼遊戲就沒有結束,沒有結束,就說明遊戲正在運作中,是運作的狀态
  • 它保證遊戲持續的運作 不會直接的退出
  • 對圖像的繪制有很大的幫助
  • 不斷的檢查使用者互動的事件...

把我們的遊戲循環寫出來

++++
# 遊戲循環
while True:
    print(i)
    i += 1
++++
           

我們看一下目前的遊戲子產品

我們一步一步的來,現在我們去設定遊戲的時鐘

所謂的遊戲時鐘 實際上指的就是重新整理率

  • 在python中定義了一個專門的類 '

    pygame.time.Clock

    可以非常友善的設定螢幕繪制速度 —— 重新整理幀率'
  • 如何使用它?你隻需要兩步
    1. 在 遊戲初始化 建立一個 時鐘對象
    2. 在 遊戲循環 中讓時鐘對象調用

      tick(幀率)

      方法
    3. 說明:

      tick

      方法會根據 上次被調用的時間,自動設定 遊戲循環 中的延時

      你可以這樣的來搞它

# 1. 建立遊戲時鐘對象-你不需要導入包,這個是python自帶的,就像js裡面的定時器
clock = pygame.time.Clock()
i = 0

# 遊戲循環
while True:

    # 設定螢幕重新整理幀率
    clock.tick(60)

    print(i)
    i += 1

           

現在我們來實作第一個主戰飛機的動畫

需求分析:我們需要讓飛機動起來。實作的原理就是在每一次的繪制中。把圖檔的位置進行變化,這樣就完成了我們的 動 的效果
  • 代碼邏輯分析
    1. 在 遊戲初始化 定義一個

      pygame.Rect

      的變量記錄英雄的初始位置
    2. 在 遊戲循環 中每次讓 英雄 的

      y - 1

      —— 向上移動
    3. y <= 0

      将英雄移動到螢幕的底部
    4. 注意:每一次調用

      update()

      方法之前,需要把 所有的遊戲圖像都重新繪制一遍而且應該 最先 重新繪制 背景圖像,如果你不聽我的建議,後果自負
  • 具體的實作
# 1. 定義英雄的初始位置
++++(在這之前我們已經定于了對象)
# 設定我們的初始化的繪制位置
hero_rect = pygame.Rect(150, 500, 102, 126)

while True:

    # 可以指定循環體内部的代碼執行的頻率
    clock.tick(60)

    # 2.更新英雄位置
    hero_rect.y -= 1

    # 3. 如果移出螢幕,則将英雄的頂部移動到螢幕底部
    if hero_rect.y <= 0:
        hero_rect.y = 700

    # 4.繪制背景圖檔
    screen.blit(bg, (0, 0))
    # 5.繪制英雄圖像
    screen.blit(hero, hero_rect)

    # 6.更新顯示//有關于整個視窗的更新 你需要放在最後
    pygame.display.update()
           

咦?我們的遊戲是不是 卡死 了?

你已經注意到了這一點,業務我們的循環好像是一個無限循環,它沒有結束的條件,
  • 需求分析:我們需要在點選視窗上的x号的時候退出遊戲
  • 代碼分析:
    1. 這裡需要我們用到事件(event);
    2. 遊戲一旦啟動我們就需要不斷的去監聽發生的互動事件
    3. 一旦判斷到有 ‘退出’事件的時候就結束我們的遊戲 解除安裝我們的包
    4. pygame

      中通過

      pygame.event.get()

      可以獲得 使用者目前所做動作 的 **事件清單,我們在可以寫一個函數擷取到這些事件其中的一個 ‘退出’事件 ,根據它來退出遊戲
    5. 注意以下的代碼非常的固定,幾乎每一個pygame遊戲都有這樣的一行代碼,它們的實作原理都是一樣的,别擔心 這并不難
  • 代碼的實作
+++++(上面還有好多代碼就忽略了,我們專注我們的核心業務需求)
while True:

    # 設定螢幕重新整理幀率
    clock.tick(60)

    # 1.事件監聽
    for event in pygame.event.get():

        # 2.判斷使用者是否點選了關閉按鈕
        if event.type == pygame.QUIT:
            print("退出遊戲...")
            # 解除安裝所有的依賴包
            pygame.quit()

            # 直接退出系統
            exit()