1. 程式人生 > >飛機大戰小遊戲

飛機大戰小遊戲

官方網站https://www.pygame.org/

安裝pygame模組

pip install pygame

測試是否安裝成功

python -m pygame.examples.aliens

使用pygame建立圖形視窗

pygame.init() 匯入並初始化所有 pygame 模組,使用其他模組之前,必須先呼叫 init 方法

pygame.quit() 解除安裝所有 pygame 模組,在遊戲結束之前呼叫!

import pygame
pygame.init()

# 遊戲程式碼...

pygame.quit()

遊戲中的座標系

原點在左上角(0,0)

x軸水平方向向右,逐漸增加

y軸垂直方向向下,逐漸增加

pygame專門提供一個類pygame.Rect 用於描述矩形區域

Rect(x, y, width, height) -> Rect

pygame.Rect 是一個比較特殊的類,內部只是封裝了一些數字計算,不執行pygame.init()方法同樣能夠直接使用

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