首頁 > 軟體

python遊戲庫pygame經典教學(推薦!)

2022-12-07 14:00:47

一.Pygame程式基本搭建過程

Pygame搭建遊戲視窗主要為如下幾步

1.初始化化程式

在使用Pygame程式設計之前,我們要對程式進行初始化,程式碼如下

pygame.init()

該程式碼是整個程式的第一句程式碼,它的作用是自動檢測Pygame軟體包是否正常,並完成包括display(顯示卡模組),font(字型模組),mixer(聲音模組),cursors(遊標控制模組)等的模組的初始化

2.建立Surface物件

Surface是Pygame程式設計的視窗介面,類似畫布,影象和文字可以顯示在Surface上,建立方式主要有以下方式

(1)建立Surface物件:

#也可以叫做screen物件,本質上是一個Surface物件
screen = pygame.display.set_mode(400,400)

(2)建立一個帶文字的Surface物件:

#建立一個包含文字的Surface物件
text = f.render("小馬哥不馬虎",True,(255,255,255),(0,0,0))
#通過blit方法將其繪製出來,textRect表示位置座標
screen.blit(text,textRect)

(3)建立一個包含影象的Surface物件:

surface_image = pygame.image.load("圖片路徑")

3.事件監聽

一個好的遊戲少不了遊戲與人的互動,通過事件,人按自己的想法對遊戲進行互動

如下是一個關閉遊戲的簡單互動:

#所有get()獲取事件
for event in pygame.event.get():
    #判斷事件型別
    if event.type == pygame.QUIT:
        pygame.quit()

4.遊戲迴圈 

程式碼:

while True:
    for event in pymage.event.get():
        if event.type == pygame.QUIT:
            pymage.quit()
            sys.exit()
    #更新並繪製螢幕內容
    pygame.display.flip()

二.Pygame Display顯示模組詳解

Pygame使用pygame.display顯示模組中的方法建立遊戲的主視窗:

格式:

screen = pygame.display.set_mode(size=(),flags=0)

·size:用來設定視窗的大小

·flags:功能標誌位,表示建立的主視窗樣式,flags引數如下:

flags引數

標誌位功能
pygame.FULLSCREEN建立一個全螢幕視窗
pygame.HWSURFACE建立一個硬體加速視窗,必須和FULLSCREEN同時使用
pygame.OPENGL建立一個OPENGL渲染視窗
pygame.RESIZABLE建立一個可以改變大小的視窗
pygame.DOUBLEBUF建立一個雙緩衝視窗,建議在HWSURFACE或OPENGL時使用
pygame.NOFRAME建立一個沒有邊框的視窗

1.將Surface物件貼上至主視窗上

程式碼:

scrren.blit(source,dest,area=None,special_flage=0)

·source:表示要貼上的Surface物件

·dest:主視窗一個標識的座標位置

·area:接受一個Rect物件,預設為None,如果提供該引數則相當於摳圖操作,即在螢幕的指定位置顯示想要的內容

·special_flags:可選引數,用於指定對應位置顏色的混合方式

2.設定視窗主視窗

screen = pygame.display.set_mode(400,400)

3.填充主視窗背景,引數值RGB

screen.fill((156,156,156))

4.設定視窗標題

pygame.display.set.caption('小馬哥不馬虎')

5.更新螢幕內容

pygame.display.flip()

6.pygame.display其他方法

方法名稱說明
pygame.display.get_surface()獲取當前顯示的Surface物件
pygame.display.flip()更新整個待顯示的Surface物件到螢幕上
pygame.display.update()更新部分軟體介面顯示
pygame.display.lnfo()產生一個VideInfo物件,包含了顯示介面的相關資訊
pygame.display.set_icon()設定左上角的遊戲圖示,圖示尺寸大小為32*32
pygame.display.iconify()將顯示的主視窗即Surface物件最小化,或者隱藏
pygame.display.get_active()當前顯示介面顯示在螢幕上時返回True,如果視窗被隱藏和最小化時則返回False

三.Pygame Surface建立影象

1.Surface模組建立影象

語法格式:

Surface=pygame.Surface(size=(width,height),flags,depth)

·size:表示Surface物件的矩形區域大小

·flage:功能標誌位,有兩個可選引數值HWSURFACE和SPCALPHA,前者代表將建立的Surface物件存放於視訊記憶體中,後者表示讓影象的每一個畫素包含一個alpha通道

·depth:指定畫素的顏色深度,預設為自適應模式,由Pygame自動調節

程式碼範例:

import pygame
import sys
 
pygame.init()
#設定主視窗
screen = pygame.display.set_mode((400,400))
screen.fill('blue')
#設定視窗標題
pygame.display.set_caption('小馬哥不馬虎')
#建立一個影象
face = pygame.Surface((60,60),flags=pygame.HWSURFACE)
#填充影象
face.fill(color='pink')
while True:
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            pygame.quit()
            sys.exit()
    #將影象新增到主螢幕上
    screen.blit(face,(100,100))
    #更新螢幕內容
    pygame.display.flip()

效果:

2.Surface從外部載入影象

語法格式:

pygame.image.load('圖片路徑').convert()

程式碼範例:

import pygame
import sys
 
pygame.init()
#設定主視窗
screen = pygame.display.set_mode((400,400))
screen.fill('white')
#設定視窗標題
pygame.display.set_caption('小馬哥不馬虎')
#載入圖片
image_surface = pygame.image.load('C:/Users/myun/Pictures/不知火舞.jpg')
image_surface.fill((0,0,255),rect=(100,100,100,50),special_flags=0)
image_surface.scroll(100,60)  #移動圖片
while True:
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            pygame.quit()
            sys.exit()
    #將影象新增到主螢幕上
    screen.blit(image_surface,(0,0))
    #更新螢幕內容
    pygame.display.flip()

效果圖:

Surface模組處理影象方法:

方法說明
pygame.Surface.blit()將一個影象繪製到另一個影象上
pygame.Surface.convert()修改影象的格式
pygame.Surface.fill()使用純色填充Surface影象
pygame.Surface.scroll()複製並移動Surface物件
pygame.Surface.set_alpha()設定整個影象的透明度
pygame.Surface.get_at()獲取一個畫素的顏色值
pygame.Surface.set_at()設定一個畫素的顏色值
pygame.Surface.get_palette()獲取Surface物件8位元索引的調色盤
pygame.Surface.map_rgb()將一個RGBA顏色轉換為對映的顏色值
pygame.Surface.set_clip()設定該Surface物件的剪下區域
pygame.Surface.subsurface()根據父物件建立一個新的子Surface物件
pygame.Surface.get_offset()獲取子Surface物件在父物件中的偏移量
pygame.Surface.get_size()獲取Surface物件的大小

四.Pygame Transform影象變形 

Transform方法

方法說明
pygame.transform.scale()將圖片縮放至指定的大小,並返回一個新的Surface物件
pygame.transform.rotate()將圖片旋轉至指定角度
pygame.transform.rotozoom()以角度旋轉影象,同時將影象縮小或放大至指定的倍數

五.Pygame Time時間控制

1.遊戲暫停

Pygame.time模組提供以下常用方法

方法說明
pygam.time.get_ticks()以毫秒為單位獲取時間
pygame.time.wait()使程式暫停一段時間
pygame.time.set_time()建立一個定時器,即每隔一段時間就去執行一些動作
pygame.time.Clock()建立一個時間物件來幫助我們確定遊戲要以多大的幀數執行

程式碼範例:

import pygame
pygame.init()
screen =pygame.display.set_mode((500,400))
pygame.display.set_caption('時間設定')
#獲取時間
t=pygame.time.get_ticks()
#暫停遊戲3000毫秒
t1=pygame.time.wait(3000)
print(t1)
image_surface=pygame.image.load('C:/Users/myun/Pictures/不知火舞.jpg')
while True:
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            exit()
        screen.blit(image_surface,(0,0))
        pygame.display.update()

效果:三秒後載入圖片

2.設定遊戲的幀數率(FPS)

Clock()方法可以實現對遊戲幀數的設定

方法說明
pygame.time.Clock.tick()更新clock物件
pygame.time.Clock.get_time()獲取上一個tick中的時間
pygame.time.Clock.get_fps()計算clock物件的幀數

程式碼範例:

import pygame
pygame.init()
screen =pygame.display.set_mode((500,400))
pygame.display.set_caption('時間設定')
#獲取時間
t=pygame.time.get_ticks()
#暫停遊戲3000毫秒
t1=pygame.time.wait(3000)
print(t1)
image_surface=pygame.image.load('C:/Users/myun/Pictures/不知火舞.jpg')
#建立時間物件
clock = pygame.time.Clock()
while True:
    #通過時間物件指定迴圈幀數,每秒迴圈60次
    clock.tick(60)
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            exit()
        screen.blit(image_surface,(0,0))
        pygame.display.update()

注:遊戲幀數中在動態圖時才顯現出來

六.Pygame Rect區域位置

Rect()方法建立一個指定位置,指定大小的矩形區域

語法格式:

Rect=pygame.Rect(left,top,width,height)

程式碼範例: 

import pygame
pygame.init()
screen = pygame.display.set_mode((500,300))
pygame.display.set_caption('小馬哥不馬虎')
image_surface = pygame.image.load("C:/Users/myun/Pictures/bg.jpg")
rect1 = pygame.Rect(50,50,100,100)
# 在原圖的基礎上建立一個新的子圖(surface物件)
image_child= image_surface.subsurface(rect1)
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            exit()
    #在螢幕上顯示子圖的區域
    screen.blit(image_child,rect1)
    pygame.display.update()

效果:在圖片上擷取了一個和Rect1同樣大小的矩形區域

Rect對其他常用方法:

方法說明
pygame.Rect.copy()複製矩形
pygame.Rect.move()移動矩形區域,接受一個列表引數
pygame.Rect.move_ip()移動矩形(無返回)
pygame.Rect.inflate()增大或縮小矩形
pygame.Rect.clamp()將矩形移動到另一個矩形內
pygame.Rect.union()返回兩個矩形合併後的矩形
pygame.Rect.fit()按橫縱比調整矩形或移動矩形
pygame.Rect.contains()測試一個矩形是否在另個矩陣內
pygame.Rect.collidepoint()測試點是否在矩形中
pygame.Rect.colliderect()測試兩個矩形是否重疊

七.Pygame Event事件模組 

1.事件型別

通過事件型別,可以有序的,逐一的處理使用者的操作

事件

事件型別描述成員屬性
        QOUIT使用者按下視窗的關閉按鈕none
ATIVEEVENTPygame被啟用或者隱藏

gain,state

 KEYDOWN鍵盤按下unicode,key,mod
KEYUP鍵盤釋放key,mod
MOUSEMOTION滑鼠移動pos,rel,button
MOUSEBUTTONDOWN滑鼠按下pos,button
MOUSEBUTTONUP滑鼠放開pos,button
JOYAXISMOTION遊戲手柄(Joystick or pad)移動joy,axis,value
JOYBALLMOTION遊戲球(Joy  ball)移動joy,axis,value
JOYHATMOTION遊戲手柄(Joystick)移動joy,axis,value
JOYBUTTONDOWN遊戲手柄按下joy,button
JOYBUTTONUP遊戲手柄放開joy,button
VIDEORESIZEpygame視窗縮放size,w,h
VIDEOEXPOSEPygame視窗部分公開none
USEREVENT觸發一個使用者事件事件程式碼

2.事件處理方法

Pygam.event模組提供了處理事件的常用方法,如下:

方法說明
pygame.event.get()從事件佇列獲取一個事件,並在事件佇列中刪除該事件
pygame.event.wait()阻塞直至事件發生才會繼續執行,若沒有事件發生將一直處於阻塞狀態
pygame.event.set_blocked()控制哪些事件禁止進入佇列,如果引數值為None,則表示禁止所有事件進入
pygame.event.pump()呼叫該方法後,Pygame會自動處理事件佇列
pygame.event.poll()會根據實際情況返回一個真實的事件,或者一個None
pygame.event.peek()檢測某類事件是否在佇列中
pygame.event.clear()從佇列中清除所有的事件
pygame.event.get_blocked()檢測某一型別的事件是否被禁止進入佇列
pygame.event.post()放置一個新的事件在佇列中
pygame.event.Event()建立一個使用者自定義的事件
pygame.event.set_allowed()控制哪些事件允許進入佇列

3.處理鍵盤事件

鍵盤事件通過一個key屬性,通過該屬性可以獲取鍵盤的按鍵,如下是鍵盤按鍵的常數:

常數名描述
K_BACKSPACE

退格鍵(Backspace)

K_TAB製表鍵(Tab)
K_CLEAR清除鍵(Clear)
K_RETURN確認鍵(Enter)
K_PAUSE暫停鍵(Pause)
K_ESCAPE退出鍵(Escape)
K_SPACE

空格鍵(Space)

K_0~K_90~9
K_a~k_za~z
K_DELETE

刪除鍵(delete)

K_KP0~K_KP9

小鍵盤的0~9

K_F1~K_F15F1~F15
K_UP向上箭頭
K_DOWN向下箭頭
K_RIGHT向右箭頭
K_LEFT向左箭頭
KMOD_ALT同時按下Alt鍵

4.處理滑鼠事件

事件說明
MOUSEMOTION滑鼠按下
MOUSEBUTTONDOWN滑鼠釋放
MOUDEBUTTONUP滑鼠釋放
import pygame
from random import randint
# 初始化程式
pygame.init()
screen = pygame.display.set_mode((450,400))
# 更新顯示
pygame.display.flip()
while True:
    #等待事件發生
    event = pygame.event.wait()
    if event.type == pygame.QUIT:
        exit("成功退出")
    if event.type == pygame.MOUSEBUTTONDOWN:
        # pos 獲取滑鼠當前位置
        print('滑鼠按下',event.pos)
        mx,my = event.pos
        # 呼叫 pygame.draw 模組畫圓
        pygame.draw.circle(screen,(255,255,0),(mx,my),50)
        # 處理完,更新顯示
        pygame.display.update()
    if event.type == pygame.MOUSEBUTTONUP:
        print('滑鼠彈起')
        pass
    if event.type == pygame.MOUSEMOTION:
        print('滑鼠移動')
        mx, my = event.pos
        # 隨機生成 RGB 顏色值
        r = randint(0,255)
        g = randint(0,255)
        b = randint(0,255)
        pygame.draw.circle(screen, (r,g,b,),(mx, my), 50)
        # 處理完,更新顯示
        pygame.display.update()

八.Pygame Dra繪圖函數

1.繪製矩形

語法格式:

pygame.draw.rect(surface,color,rect,width)

·surface:指主視窗

·color:該引數用於圖形著色

·rect:繪製圖形的位置和大小

·width:可選引數,指定邊框的寬度,預設為0,表示填充該矩形區域

注:當width>0時,表示線框的寬度,而width<0時,此時不會繪製任何圖形

2.繪製多邊形

語法格式:

pygame.draw.polygon(surface,color,points,width)

其餘引數與上面相同,points表示組成多邊形的多個(x,y)座標

3.繪製圓形

語法格式:

pygame.circle(surface,color,pos,radius,width=0)

·pos:該引數用來指定圓心的位置

·radius:用來指定圓的半徑

4.繪製橢圓形

語法格式:

pygame.draw.ellipse(surface,Rect,width=0)

5.繪製圓弧曲線

語法格式:

pygame.draw.arc(Surface,color,Rect,start_angle,stop_angle,width=1)

·start_angle:該段該段圓弧的起始角度

·stop_angle:終止角度

6.繪製直線

語法格式:

一條直線:

pygame.draw.line(surface,color,start_pos,end_pos,width=1)

·start_pos和end_pos:表示線段的起始位置和結束位置(x,y)

·width=1:表示直線的寬度,預設為1

一條消除鋸齒的平滑線:

pygame.aaline(surface,color,start_pos,end_pos,blend=1)

多條直線:

pygame.line(surface,color,closed,pointlist,width=1)

·pointlist:參數列,包含了一些列點座標的列表

·closed:布林引數,如果設定為True,表示直線的第一個端點和直線的最後一個端點要首尾相連

多條抗鋸齒直線:

pygame.draw.aalines(surface,color,closed,pointlist,blend=1)

繪圖方法總彙:

pygame.draw模組繪圖方法

方法說明
pygame.draw.rect()繪製矩陣
pygame.draw.polygon()繪製多邊形
pygame.draw.circle()根據圓心和半徑繪製圓形
pygame.draw.ellipse()繪製一個橢圓形
pygame.draw.arc()繪製弧線
pygame.draw.line()繪製線段
pygame.draw.ines()繪製多條連續的線段
pygame.draw.aaline()繪製一條平滑的線段(抗鋸齒)
pygame.draw.aalines()繪製多條連續的線段

程式碼範例:

import pygame
from math import pi
#初始化
pygame.init()
# 設定主螢幕大小
size = (500, 450)
screen = pygame.display.set_mode(size)
# 設定一個控制主迴圈的變數
done = False
#建立時鐘物件
clock = pygame.time.Clock()
while not done:
    # 設定遊戲的fps
    clock.tick(10)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True  # 若檢測到關閉視窗,則將done置為True
    # 繪製一條寬度為 3 的紅色對角線
    pygame.draw.line(screen, (0, 255, 0), [0, 0], (500, 450), 3)
    # 繪製多條藍色的直線(連續直線,非抗鋸齒),False 表示首尾不相連
    pygame.draw.lines(screen, (0, 0, 255), False, [[0, 80], [50, 90], [200, 80], [220, 30]], 1)
    # 繪製一個灰色的矩形區域,以灰色填充區域
    pygame.draw.rect(screen, (155, 155, 155), (75, 10, 50, 20), 0)
    # 繪製一個線框寬度為2的矩形區域
    pygame.draw.rect(screen, (0, 0, 0), [150, 10, 50, 20],2)
    # 繪製一個橢圓形,其線寬為2
    pygame.draw.ellipse(screen, (255, 0, 0), (225, 10, 50, 20), 2)
    # 繪製一個實心的紅色橢圓形
    pygame.draw.ellipse(screen, (255, 0, 0), (300, 10, 50, 20))
    # 繪製一個綠色邊框(寬度為2)三角形
    pygame.draw.polygon(screen, (100, 200, 45), [[100, 100], [0, 200], [200, 200]], 2)
    # 繪製一個藍色實心的圓形,其中[60,250]表示圓心的位置,40為半徑,width預設為0
    pygame.draw.circle(screen, (0, 0, 255), [60, 250], 40)
    # 繪製一個圓弧,其中0表示弧線的開始位置,pi/2表示弧線的結束位置,2表示線寬
    pygame.draw.arc(screen, (255, 10, 0), (210, 75, 150, 125), 0, pi / 2, 2)
    # 重新整理顯示螢幕
    pygame.display.flip()
# 點選關閉,退出pygame程式
pygame.quit()

效果圖:

九.字型繪製

font模組可以繪製字型

·pygame.font.Font(filename,size):獲取字型

·pygame.font.Font.render(text,antialias,color,background=None):顯示字型

·get_rect():獲取座標物件

範例:

import pygame,sys
from pygame.locals import *
 
pygame.init()
 
surface = pygame.display.set_mode((500, 400), 0, 32)
pygame.display.set_caption("文字繪製")
surface.fill((255, 255, 255))
 
# 獲取字型物件,可以獲取系統自帶的,也可以自定義字型
fonts = pygame.font.get_fonts()
fonts = 'fonts/ARBERKLEY.ttf'
basicFont = pygame.font.SysFont(fonts, 50)
 
# surface物件
text = basicFont.render('這是一串字元', True, (255,255,255), (0,255,0))
 
# 設定文字位置
textRect = text.get_rect()
 
textRectObj.center = (250, 200)
 
# 將渲染的surface物件更新到螢幕上
surface.blit(text,textRect)
 
# 程式主迴圈
while True:
 
  # 獲取事件
  for event in pygame.event.get():
    # 判斷事件是否為退出事件
    if event.type == QUIT:
      # 退出pygame
      pygame.quit()
      # 退出系統
      sys.exit()
 
  # 繪製螢幕內容
  pygame.display.update()

十.音訊播放

mixer音訊模組

·pygame.mixer.Sound(filename):播放特效音

·pygame.mixer.music.load(filename):載入背景音樂

程式碼範例:

import pygame, sys
from pygame.locals import *
 
# 初始化pygame
pygame.init()
 
# 設定視窗的大小,單位為畫素
screen = pygame.display.set_mode((500, 400))
 
# 設定視窗的標題
pygame.display.set_caption('音訊播放')
 
# 設定背景
screen.fill((255, 255, 255))
 
# 載入並播放一個特效音訊檔
sound = pygame.mixer.Sound('C:/Users/myun/Music/狙擊槍.wav')
sound.play()
 
# 載入背景音樂檔案
pygame.mixer.music.load('C:/Users/myun/Music/Oh The Larceny - Light That Fire.mp3')
 
# 播放背景音樂,第一個引數為播放的次數(-1表示無限迴圈),第二個引數是設定播放的起點(單位為秒)
pygame.mixer.music.play(-1, 0.0)
 
# 程式主迴圈
while True:
    # 獲取事件
    for event in pygame.event.get():
        # 判斷事件是否為退出事件
        if event.type == QUIT:
            # 停止播放背景音樂
            pygame.mixer.music.stop()
            # 退出pygame
            pygame.quit()
            # 退出系統
            sys.exit()
 
    # 繪製螢幕內容
    pygame.display.update()

總結

到此這篇關於python遊戲庫pygame經典教學的文章就介紹到這了,更多相關python遊戲庫pygame內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com