飛機大戰小遊戲
安裝pygame模組
pip install pygame
測試是否安裝成功
python -m pygame.examples.aliens
使用pygame建立圖形視窗
pygame.init() 匯入並初始化所有 pygame 模組,使用其他模組之前,必須先呼叫 init 方法
pygame.quit()
import pygame pygame.init() # 遊戲程式碼... pygame.quit()
遊戲中的座標系
原點在左上角(0,0)
x軸水平方向向右,逐漸增加
y軸垂直方向向下,逐漸增加
pygame專門提供一個類pygame.Rect 用於描述矩形區域
Rect(x, y, width, height) -> Rect
import pygame hero_rect = pygame.Rect(100, 500, 120, 125) print("英雄的原點 %d %d" % (hero_rect.x, hero_rect.y))#英雄的原點 100 500 print("英雄的尺寸 %d %d" % (hero_rect.width, hero_rect.height))#英雄的尺寸 120 125 #size屬性返回矩形區域的(寬,高)元組形式 print("%d %d" % hero_rect.size)#120 125
遊戲主視窗
pygame.display 用於建立,管理遊戲視窗
pygame.display.set_mode() 初始化遊戲顯示視窗
pygame.display.update() 重新整理螢幕內容顯示
set_mode方法
set_mode(resolution = (0,0), flags = 0, depth = 0) -> Surface
resolution 指螢幕的寬和高,預設視窗就是你螢幕的大小
flags 指螢幕的附加選項,是否全屏
depth 指顏色的位數,預設自動匹配
為了做到遊戲啟動後不會立即退出,通常在遊戲程式中加遊戲迴圈
遊戲迴圈就是一個無限迴圈
import pygame pygame.init() # 建立遊戲的視窗 480 * 700 screen = pygame.display.set_mode((480, 700)) #遊戲迴圈 while True: pass pygame.quit()
影象的繪製
看到某一個影象的內容有三個步驟:
1.使用pygame.image.load() 載入影象的資料
2.使用遊戲螢幕的物件,呼叫blit方法將影象繪製到指定位置
3.呼叫pygame.display.update() 方法更新螢幕的顯示
繪製背景圖片
import pygame pygame.init() # 建立遊戲的視窗 480 * 700 screen = pygame.display.set_mode((480, 700)) # 繪製背景影象 # 1> 載入影象資料 bg = pygame.image.load("./images/background.png") # 2> blit 繪製圖像 screen.blit(bg, (0, 0)) # 3> update 更新螢幕顯示 pygame.display.update() while True: pass pygame.quit()
繪製遊戲圖片
import pygame pygame.init() # 建立遊戲的視窗 480 * 700 screen = pygame.display.set_mode((480, 700)) # 繪製背景影象 # 1> 載入影象資料 bg = pygame.image.load("./images/background.png") # 2> blit 繪製圖像 screen.blit(bg, (0, 0)) # 3> update 更新螢幕顯示 pygame.display.update() # 繪製英雄的飛機 hero = pygame.image.load("./images/me1.png") screen.blit(hero, (150, 300)) pygame.display.update() while True: pass pygame.quit()
png格式的圖片是支援透明的,下方已有的內會透過透明區域顯示出來
update方法的作用
pygame.display.update 可以在最後統一呼叫
display.set_mode() 建立 screen 物件是一個記憶體中螢幕資料物件
screen.blit 方法可以繪製很多影象
display.update() 把最終結果繪製到螢幕上,可以提高螢幕繪製效率,增加遊戲流暢度
遊戲時鐘
動畫的實現原理
快速的在螢幕上繪製圖像,每秒繪製60次,就可以的達到非常連續高質量的動畫效果
每次繪製的結果被稱為幀 Frame
pygame.time.Clock() 可以非常方便的設定螢幕繪製速度---- 重新整理幀率
tick 方法會根據上次被呼叫的時間,自動設定遊戲迴圈中的延遲
import pygame # 遊戲的初始化 pygame.init() # 建立遊戲的視窗 480 * 700 screen = pygame.display.set_mode((480, 700)) # 繪製背景影象 bg = pygame.image.load("./images/background.png") screen.blit(bg, (0, 0)) # pygame.display.update() # 繪製英雄的飛機 hero = pygame.image.load("./images/me1.png") screen.blit(hero, (150, 300)) # 可以在所有繪製工作完成之後,統一呼叫update方法 pygame.display.update() # 建立時鐘物件 clock = pygame.time.Clock() # 遊戲迴圈 -> 意味著遊戲的正式開始! i = 0 while True: # 可以指定迴圈體內部的程式碼執行的頻率 clock.tick(60) print(i) i += 1 pygame.quit()
英雄簡單動畫實現
pygame.Rect記錄英雄的初始位置
y - 1 向上移動
import pygame # 遊戲的初始化 pygame.init() # 建立遊戲的視窗 480 * 700 screen = pygame.display.set_mode((480, 700)) # 繪製背景影象 bg = pygame.image.load("./images/background.png") screen.blit(bg, (0, 0)) # pygame.display.update() # 繪製英雄的飛機 hero = pygame.image.load("./images/me1.png") screen.blit(hero, (150, 300)) # 可以在所有繪製工作完成之後,統一呼叫update方法 pygame.display.update() # 建立時鐘物件 clock = pygame.time.Clock() # 1. 定義rect記錄飛機的初始位置 hero_rect = pygame.Rect(150, 300, 102, 126) # 遊戲迴圈 -> 意味著遊戲的正式開始! while True: # 可以指定迴圈體內部的程式碼執行的頻率 clock.tick(60) # 2. 修改飛機的位置 hero_rect.y -= 1 # 判斷飛機的位置 if hero_rect.y <= 0: hero_rect.y = 700 # 3. 呼叫blit方法繪製圖像 screen.blit(bg, (0, 0)) screen.blit(hero, hero_rect) # 4. 呼叫update方法更新顯示 pygame.display.update() pygame.quit()
監聽事件
事件 event
使用者對遊戲的操作 關閉按鈕,滑鼠點選,按下鍵盤...
監聽
在遊戲中判斷使用者的具體操作
pygame.event.get()可以獲取當前使用者的所有動作的事件列表
import pygame # 遊戲的初始化 pygame.init() # 建立遊戲的視窗 480 * 700 screen = pygame.display.set_mode((480, 700)) # 繪製背景影象 bg = pygame.image.load("./images/background.png") screen.blit(bg, (0, 0)) # pygame.display.update() # 繪製英雄的飛機 hero = pygame.image.load("./images/me1.png") screen.blit(hero, (150, 300)) # 可以在所有繪製工作完成之後,統一呼叫update方法 pygame.display.update() # 建立時鐘物件 clock = pygame.time.Clock() # 1. 定義rect記錄飛機的初始位置 hero_rect = pygame.Rect(150, 300, 102, 126) # 遊戲迴圈 -> 意味著遊戲的正式開始! while True: # 可以指定迴圈體內部的程式碼執行的頻率 clock.tick(60) # 監聽事件 for event in pygame.event.get(): # 判斷事件型別是否是退出事件 if event.type == pygame.QUIT: print("遊戲退出...") # quit 解除安裝所有的模組 pygame.quit() # exit() 直接終止當前正在執行的程式 exit() # 2. 修改飛機的位置 hero_rect.y -= 1 # 判斷飛機的位置 if hero_rect.y <= 0: hero_rect.y = 700 # 3. 呼叫blit方法繪製圖像 screen.blit(bg, (0, 0)) screen.blit(hero, hero_rect) # 4. 呼叫update方法更新顯示 pygame.display.update() pygame.quit()
精靈和精靈組
pygame.sprite.Sprite 儲存影象資料image和位置rect的物件
pygame.sprite.Group