pygame


關於pygame

PyGame是SDL庫的Python包裝器。SDL是一個跨平台庫,用於訪問計算機多媒體硬件組件(聲音,視頻,輸入等)。SDL是一個非常強大的工具,用於構建各種各樣的東西,但它是用C語言編寫的,C很難,所以我們使用PyGame。

github網址:https://github.com/pygame/pygame

安裝

pip install pygame
C:\Users\huang>pip install pygame
Collecting pygame
Downloading https://files.pythonhosted.org/packages/ed/56/b63ab3724acff69f4080e54c4bc5f55d1fbdeeb19b92b70acf45e88a5908/pygame-1.9.6-cp37-cp37m-win_amd64.whl (4.3MB)
100% |████████████████████████████████| 4.3MB 55kB/s
Installing collected packages: pygame
Successfully installed pygame-1.9.6

基礎對象

屏幕對象

首先,我們需要一張畫布,我們稱之為“屏幕”,它是我們繪畫的平台。為了創建一個屏幕,我們需要調用pygame.display 中的 set_mode 方法,然后向 set_mode() 傳遞包含屏幕窗口寬度和高度的元組(本教程中使用 800x600 尺寸)。

import pygame
from pygame.locals import *

pygame.init()

screen = pygame.display.set_mode((800,600))

運行代碼,出現一個新窗口,隨后消失。

游戲主循環

如果運行上面的代碼,你會看到我們的窗口短暫彈出,然后在程序退出時立即消失。所以要進行循環維持進程。游戲主循環是所有操作發生的地方。在游戲過程中,它不斷的更新游戲狀態,渲染游戲畫面和收集輸入指令。創建循環時,需要確保我們有辦法跳出循環,退出應用。所有的用戶輸入(和我們稍稍后提到的其他事件)都會進入 PyGame 的事件隊列,通過調用 pygame.event.get() 可以訪問該隊列。這將返回一個包含隊列里所有事件的列表,我們將循環這個列表,並根針對相應的事件類型做出反應。現在我們只關心KEYDOWN和QUIT事件:

# 用於保證主循環運行的變量
running = True

# 主循環!
while running:
    # for 循環遍歷事件隊列
    for event in pygame.event.get():
        # 檢測 KEYDOWN 事件: KEYDOWN 是 pygame.locals 中定義的常量,pygame.locals文件開始已經導入
        if event.type == KEYDOWN:
            # 如果按下 Esc 那么主循環終止
            if event.key == K_ESCAPE:
                running = False
         # 檢測 QUIT : 如果 QUIT, 終止主循環
        elif event.type == QUIT:
            running = False

將上述代碼添加到之前的代碼下,並運行。你應該看到一個空的窗口。只有你按下 ESC 鍵 或者觸發一個 QUIT 事,否則這個窗口不會消失。

Surface 和 Rects

Surface和 Rects是 PyGame 中的基本構件。可以將 Surface 看作一張白紙,你可以在上面隨意繪畫。我們的屏幕對象也是一個 Surface 。它們可以包含圖片。Rects 是 Surface 中矩形區域的表示。

讓我們創建一個 50x50 像素的 Surface,然后給它塗色。由於屏幕是黑色的,所以我們使用白色。 我們然后調用 get_rect() 在 Surface上 得到一個矩形區域和 Surface 的 x 軸 和 y 軸。

# 創建Surface 並用原則設定它的長度和寬度
surf = pygame.Surface((50,50))
# 設定Surface的顏色,使其和屏幕分離
surf.fill((255,255,255))
rect = surf.get_rect()

Blit 和 Flip

僅僅只是創建了 Surface 並不能在屏幕上看到它。為此我們需要將這個 Surface 繪制(Blit)到另一個 Surface 上。Blit 是一個專業術語,意思就是繪圖。你僅僅只能從一個Surface Blit 到另一個Surface,我們的屏幕就是一個 Surface 對象。以下是我們如何將 surf 畫到屏幕上:

# 這一行表示:將surf畫到屏幕 x:400.y:300的坐標上
screen.blit(surf,(400,300))
pygame.display.flip() 

blit() 有兩個參數:要畫的 Surface 和 在源 Surface 上的坐標。此處我們使用屏幕的中心,但是當你運行代碼時,你會發現我們的 surf 並沒有出現在屏幕的中心。這是因為 blit() 是從左上角開始畫 surf 。

注意在 blit 之后的 pygame.display.filp() 的調用。Flip將會更新自上次 flip 后的整個屏幕,兩次 flip 之間發生的修改都將在屏幕上顯示。沒有調用flip()那就什么也不會出現。

Sprites

什么是 Sprites ?從編程術語來講,Sprites 是屏幕上事物的二維表達。本質上來講,Sprite 就是一個圖片。Pygame 提供一個叫做 Sprites 的基礎類,它就是用來擴展的,可以包含想要在屏幕上呈現的對象一個或多個圖形表示。我們將會擴展Sprite 類,這樣可以使用它的內建方法。我們稱這個新的對象為 Player 。Plyaer 將擴展 Sprite,現在只有兩個屬性:surf 和 rect。我們也會給 surf 塗色(本教程使用白色),如之前 surface 例子,只是現在 Surface 屬於 Player :

class Player(pygame.sprite.Sprite):
    def __init__(self):
        super(Player,self).__init__()
        self.surf = pygame.Surface((75,25))
        self.surf.fill((255,255,255))
        self.rect = self.surf.get_rect()

現在把上面的代碼整合一下:

# 調用pygame模塊
import pygame

# 調用 pygame.locals 使容易使用關鍵參數
from pygame.locals import *

# 定義Player對象 調用super賦予它屬性和方法    
# 我們畫在屏幕上的surface 現在是player的一個屬性
class  Player(pygame.sprite.Sprite):
    def __init__(self):
        super(Player,self).__init__()
        self.surf = pygame.Surface((75,25))
        self.surf.fill((255,255,255))
        self.rect = self.surf.get_rect()

# 初始化 pygame
pygame.init()

# 創建屏幕對象
# 設定尺寸為 800x600
screen = pygame.display.set_mode((800,600))

# 初始化Player, 現在他僅僅是一個矩形
player = Player()

# 控制主循環的進行的變量
running = True

# 主循環
while running:
     # 事件隊列中的循環
    for event in pygame.event.get():
        # check for KEYDOWN event: KEYDOWN is a constant defined in pygame.locals,which we imported earlier
            if event.type == KEYDOWN:
                # if the Esc KEY has been pressed set running to false to exit the main loop
                if event.key == K_ESCAPE:
                    running = False
                # check for QUIT event: if QUIT, set running to false
            elif event.type == QUIT:
                running = False


    # 這一行表示:將surf畫到屏幕 x:400.y:300的坐標上
    screen.blit(player.surf,(400,300))
    # 更新
    pygame.display.flip()

運行上述代碼,你將會在屏幕中心看到一個白色的矩形:

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM