實作遊戲循環還有事件的監聽
在上一講中 你需要完成這樣的這樣的效果, 如果你還沒有完成,請不要繼續往下閱讀!!切記切記切記。,重要的事情說三遍
我們來看一下什麼是遊戲循環
所謂的遊戲循環很好的了解 就是 ,什麼時候遊戲會退出,注意啊,我們是反向的了解 遊戲不退出,那麼遊戲就沒有結束,沒有結束,就說明遊戲正在運作中,是運作的狀态
- 它保證遊戲持續的運作 不會直接的退出
- 對圖像的繪制有很大的幫助
- 不斷的檢查使用者互動的事件...
把我們的遊戲循環寫出來
++++
# 遊戲循環
while True:
print(i)
i += 1
++++
我們看一下目前的遊戲子產品
我們一步一步的來,現在我們去設定遊戲的時鐘
所謂的遊戲時鐘 實際上指的就是重新整理率
- 在python中定義了一個專門的類 '
可以非常友善的設定螢幕繪制速度 —— 重新整理幀率'pygame.time.Clock
- 如何使用它?你隻需要兩步
- 在 遊戲初始化 建立一個 時鐘對象
- 在 遊戲循環 中讓時鐘對象調用
方法tick(幀率)
- 說明:
tick
方法會根據 上次被調用的時間,自動設定 遊戲循環 中的延時
你可以這樣的來搞它
# 1. 建立遊戲時鐘對象-你不需要導入包,這個是python自帶的,就像js裡面的定時器
clock = pygame.time.Clock()
i = 0
# 遊戲循環
while True:
# 設定螢幕重新整理幀率
clock.tick(60)
print(i)
i += 1
現在我們來實作第一個主戰飛機的動畫
需求分析:我們需要讓飛機動起來。實作的原理就是在每一次的繪制中。把圖檔的位置進行變化,這樣就完成了我們的 動 的效果
- 代碼邏輯分析
- 在 遊戲初始化 定義一個
的變量記錄英雄的初始位置pygame.Rect
- 在 遊戲循環 中每次讓 英雄 的
—— 向上移動y - 1
-
将英雄移動到螢幕的底部y <= 0
- 注意:每一次調用
方法之前,需要把 所有的遊戲圖像都重新繪制一遍而且應該 最先 重新繪制 背景圖像,如果你不聽我的建議,後果自負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号的時候退出遊戲
- 代碼分析:
- 這裡需要我們用到事件(event);
- 遊戲一旦啟動我們就需要不斷的去監聽發生的互動事件
- 一旦判斷到有 ‘退出’事件的時候就結束我們的遊戲 解除安裝我們的包
-
中通過pygame
可以獲得 使用者目前所做動作 的 **事件清單,我們在可以寫一個函數擷取到這些事件其中的一個 ‘退出’事件 ,根據它來退出遊戲pygame.event.get()
- 注意以下的代碼非常的固定,幾乎每一個pygame遊戲都有這樣的一行代碼,它們的實作原理都是一樣的,别擔心 這并不難
- 代碼的實作
+++++(上面還有好多代碼就忽略了,我們專注我們的核心業務需求)
while True:
# 設定螢幕重新整理幀率
clock.tick(60)
# 1.事件監聽
for event in pygame.event.get():
# 2.判斷使用者是否點選了關閉按鈕
if event.type == pygame.QUIT:
print("退出遊戲...")
# 解除安裝所有的依賴包
pygame.quit()
# 直接退出系統
exit()