一、什么是pygame
????????Pygame是一個基于Python的游戲開發(fā)庫,它提供了一系列的工具和接口,使開發(fā)人員能夠輕松地創(chuàng)建各種類型的游戲,包括2D游戲和簡單的3D游戲,主要是為了開發(fā)2D游戲而生。具有免費、開源,支持多種操作系統(tǒng),具有良好的跨平臺性等優(yōu)點。
在開始學(xué)習(xí)Pygame之前,您需要先安裝Pygame庫。您可以通過以下命令在命令行中安裝
pip install pygame
?輸入以下代碼檢測pygame是否安裝成功
import pygame
pygame.ver
二、基本屏幕設(shè)置使用方法
????????pygame基本使用模塊
模塊名 | 功能 |
pygame.cdrom | 訪問光驅(qū) |
pygame.cursors | 加載光標(biāo) |
pygame.display | 訪問顯示設(shè)備 |
pygame.draw | 繪制形狀、線和點 |
pygame.event | 管理事件 |
pygame.font | 使用字體 |
pygame.image | 加載和存儲圖片 |
pygame.joystick | 使用游戲手柄或類似的東西 |
pygame.key | 讀取鍵盤按鍵 |
pygame.mixer | 聲音 |
pygame.mouse | 鼠標(biāo) |
pygame.movie | 播放視頻 |
pygame.music | 播放音樂 |
pygame.overlay | 訪問高級視頻疊加 |
pygame.rect | 管理矩形區(qū)域 |
pygame.sndarray | 操作聲音數(shù)據(jù) |
pygame.sprite | 操作移動圖像 |
pygame.surface | 管理圖像和屏幕 |
pygame.surfarray | 管理點陣圖像數(shù)據(jù) |
pygame.time | 管理時間和幀信息 |
pygame.transform | 縮放和移動圖像 |
????????模塊的具體使用方法
? ? ? ? ?1、pygame概括化使用流程
? ? ? (1)pygame.init()初始化
? ? ? ? ? ? ? ??pygame.init() 是 Pygame 庫中的初始化函數(shù),它用于初始化 Pygame 的各種子模塊和設(shè)置,以準(zhǔn)備創(chuàng)建游戲或圖形應(yīng)用程序。調(diào)用 pygame.init() 的目的是確保 Pygame 環(huán)境正確準(zhǔn)備好,以便在程序中使用 Pygame 的各種功能。
這個函數(shù)通常在程序的開始處調(diào)用,以確保 Pygame 能夠正常工作。在調(diào)用 pygame.init() 之后,你可以使用 Pygame 的各種模塊來處理圖形、音頻、事件等。例如,你可以創(chuàng)建游戲窗口、加載圖像、播放音頻等操作。
一旦初始化完成,你可以開始使用 Pygame 編寫游戲邏輯并啟動游戲循環(huán)。請注意,一旦初始化完成,你也可以通過 pygame.quit() 來清理 Pygame 環(huán)境和資源,通常是在程序結(jié)束時使用,以確保資源被正確釋放。
? ? ? ? ? ? ? ? 初始化時顯示
pygame.init()
????????????????pygame.init():該代碼是整個程序的第一句代碼,它的作用是自動檢測Pygame軟件包是否正常,并完成包括display(顯卡模塊),font(字體模塊),mixer(聲音模塊),cursors(光標(biāo)控制模塊)等的模塊的初始化
????????????????pygame.display.set_mode():創(chuàng)建一個窗口或屏幕,其大小由(width, height)指定,width表示窗口寬度,height代表屏幕高度。這個函數(shù)返回一個Surface對象,代表了整個屏幕。
? ? ? ? ?(2)創(chuàng)建一個Surface對象
? ? ? ? ? ? ? ? ? Surface是Pygame的編程窗口,像一個畫布一樣,能在上面進行顯示,圖像和文本能顯示在Surface上
? ? ? ? ? (1)創(chuàng)建Surface對象
screen = pygame.display.set_mode((800, 600))
? ? ? ? ? ? (2)創(chuàng)建一個帶文本的頁面
# 設(shè)置字體
f = pygame.font.Font(None, 36)
# 創(chuàng)建包含文字的Surface對象
text = f.render("簡單的Pygame窗口", True, (255, 255, 255), (0, 0, 0))
# 獲取文本的大小并創(chuàng)建一個合適的Rect
textRect = text.get_rect()
textRect.topleft = (100, 50) # 設(shè)置文本的左上角位置
# 通過blit方法將其繪制出來
screen.blit(text, textRect)
? ? ? ? ?(3)創(chuàng)建一個帶圖像的畫面
import pygame
pygame.init()
screen = pygame.display.set_mode((800, 600))
image = pygame.image.load('155410.png')
screen.blit(image, (0, 0)) # 圖像左上角在窗口的(0, 0)坐標(biāo)
pygame.display.flip() # 更新整個屏幕的顯示
? ? ? ? ?(4)事件監(jiān)聽
#所有g(shù)et()獲取事件
for event in pygame.event.get():
#判斷事件類型
if event.type == pygame.QUIT:
pygame.quit()
? ? ? ? ? ? ? ? 利用 for event in pygame.event.get對上次調(diào)用后所有事件進行遍歷,其中pygame.envent.get()會獲取pygame事件隊列里面的所有事件,并返回一個事件列表(這些事件可能包括按鍵按下、鼠標(biāo)點擊、窗口關(guān)閉等用戶或系統(tǒng)的交互動作)
????????????????if event.type == pygame.QUIT,此語句是用來檢測當(dāng)前遍歷的事件是否屬于pygame.QUIT類型(pygame.QUIT類型是一種特殊的事件類型,一般當(dāng)用戶點擊窗口關(guān)閉按鈕是pygame會產(chǎn)生該事件)
????????????????pygame.quit是一個很重要的函數(shù),這個函數(shù)用于正確的關(guān)閉pygame庫,并且釋放資源退出程序
? ? ? ? ?(5)游戲循環(huán)
? ? ? ? ? ? ? ? ? ?游戲循環(huán)的作用
while True:
for event in pymage.event.get():
if event.type == pygame.QUIT:
pymage.quit()
sys.exit()
#更新并繪制屏幕內(nèi)容
pygame.display.flip()
????????????????
????????????????while True:?這是一個無限循環(huán),通常用于創(chuàng)建游戲循環(huán)。游戲循環(huán)是一個持續(xù)運行的循環(huán),用于處理游戲邏輯,更新游戲狀態(tài)和繪制圖形。
????????????????for event in pygame.event.get():?這是一個事件處理循環(huán)。它迭代遍歷通過 pygame.event.get() 函數(shù)獲取的所有事件。Pygame 會將各種事件(例如按鍵按下、鼠標(biāo)移動、窗口關(guān)閉等)存儲在一個事件隊列中,通過這個循環(huán)可以處理這些事件。
????????????????if event.type == pygame.QUIT:這是一個條件語句,用于檢查事件的類型是否為窗口關(guān)閉事件。pygame.QUIT 是一個表示窗口關(guān)閉事件的常量。
????????????????pygame.quit():?如果檢測到窗口關(guān)閉事件,這行代碼會調(diào)用 pygame.quit() 函數(shù),用于清理 Pygame 環(huán)境和資源,以確保程序正確退出。這會關(guān)閉 Pygame 窗口并釋放游戲資源。
sys.exit():這是一個用于退出程序的函數(shù)。它會終止程序的執(zhí)行,退出游戲循環(huán),從而結(jié)束程序的運行。
???????????????pygame.display.flip(): 這行代碼用于更新屏幕內(nèi)容。在游戲循環(huán)中,通常會進行游戲狀態(tài)的更新和圖形的繪制,然后使用 pygame.display.flip() 來刷新屏幕,以顯示最新的游戲畫面。
? ? ? ? ? ? ? ? 2.pygame.display顯示模塊具體使用方法
? ? ? ? ? ? ? (1)Pygame使用pygame.display顯示模塊中的方法創(chuàng)建游戲的主窗口:
? ? ? ? ? ? ? ? 函數(shù)書寫格式
#寫法一
window = pygame.display.set_mode(size=(),flags=0)
#size:用來設(shè)置窗口的大小
#flags:功能標(biāo)志位,表示創(chuàng)建的主窗口樣式
#寫法二
window_size = (800, 600)
# 創(chuàng)建游戲窗口
window = pygame.display.set_mode(window_size)
標(biāo)志位 | 功能 |
pygame.FULLSCREEN | 創(chuàng)建一個全屏窗口 |
pygame.HWSURFACE | 創(chuàng)建一個硬件加速窗口,必須和FULLSCREEN同時使用 |
pygame.OPENGL | 創(chuàng)建一個OPENGL渲染窗口 |
pygame.RESIZABLE | 創(chuàng)建一個可以改變大小的窗口 |
pygame.DOUBLEBUF | 創(chuàng)建一個雙緩沖窗口,建議在HWSURFACE或者OPENGL時候使用 |
pygame.NOFRAME | 創(chuàng)建一個沒有邊框的窗口 |
? ? ? ? ? ? ? (2)將Surface對象粘貼至主窗口上:
?
# 導(dǎo)入Pygame庫
import pygame
# 導(dǎo)入sys庫,用于退出程序
import sys
# 初始化Pygame
pygame.init()
# 定義窗口大小和標(biāo)題
screen_width = 1600 # 窗口寬度
screen_height = 1000 # 窗口高度
screen = pygame.display.set_mode((screen_width, screen_height)) # 創(chuàng)建一個游戲窗口
pygame.display.set_caption("簡單的Pygame窗口") # 設(shè)置窗口標(biāo)題
# 加載圖像
image = pygame.image.load("屏幕截圖 2024-01-15 155410.png") # 加載一個圖像文件(請?zhí)鎿Q成你的圖像文件路徑)
# 進入主循環(huán)
while True:
for event in pygame.event.get(): # 獲取Pygame事件
if event.type == pygame.QUIT: # 如果事件類型是窗口關(guān)閉
pygame.quit() # 退出Pygame
sys.exit() # 退出程序
# 在窗口上繪制圖像
screen.blit(image, (0, 0)) # 將加載的圖像繪制到窗口左上角(坐標(biāo) (0, 0))
# 更新屏幕內(nèi)容
pygame.display.flip() # 刷新窗口,顯示最新的游戲畫面
?
這是一個完整的代碼窗口創(chuàng)建流程,其中
# 在窗口上繪制圖像
screen.blit(image, (0, 0)) # 將加載的圖像繪制到窗口左上角(坐標(biāo) (0, 0))
這行代碼是在游戲窗口上繪制一個圖像,且圖像的坐標(biāo)為(0,0),而image是需要導(dǎo)入的Surface對象
? ? ? ? ? ? ? (3)設(shè)置窗口主窗口,以及主窗口的命名:
# 定義窗口大小和標(biāo)題
screen_width = 1600 # 窗口寬度
screen_height = 1000 # 窗口高度
screen = pygame.display.set_mode((screen_width, screen_height)) # 創(chuàng)建一個游戲窗口
pygame.display.set_caption("簡單的Pygame窗口") # 設(shè)置窗口標(biāo)題
? ? ? ? ? ? ? ? 通過定義兩個參數(shù)screen_width = 1600,screen_height = 1000對窗口的大小進行限定;利用screen = pygame.display.set_mode((screen_width, screen_height))來創(chuàng)建窗口;pygame.display.set_caption("簡單的Pygame窗口")來對窗口進行命名
? ? ? ? ? ? ? (4)填充主窗口的背景,并用RGB參數(shù)值的顏色進行填充:
# 填充窗口背景為灰色
screen.fill((156, 156, 156))
? ? ? ? ? ? ? (5)更新屏幕的內(nèi)容:
# 更新屏幕內(nèi)容
pygame.display.flip() # 刷新窗口,顯示最新的游戲畫面
? ? ? ? ? ? ? ? 通過pygame中的display.flip方法來對窗口的內(nèi)容進行更新,以顯示最新的畫面
? ? ? ? ? ? ? (6)pygame.display的其他方法:
方法名稱 | 說明 |
pygame.display.get_surface() | 獲取當(dāng)前顯示的Surface對象 |
pygame.display.flip() | 更新整個待顯示的Surface對象到屏幕上 |
pygame.display.update() | 更新部分軟件界面顯示 |
pygame.display.lnfo() | 產(chǎn)生一個VideInfo對象,包含了顯示界面的相關(guān)信息 |
pygame.display.set_icon() | 設(shè)置左上角的游戲圖標(biāo),圖標(biāo)尺寸大小為32*32 |
pygame.display.iconify() | 將顯示的主窗口即Surface對象最小化,或者隱藏 |
pygame.display.get_active() | 當(dāng)前顯示界面顯示在屏幕上時返回True,如果窗口被隱藏和最小化時則返回False |
? ? ? ? ? ? ? ? 3.利用pygame的Surface來創(chuàng)建圖像
import pygame
import sys
# 初始化Pygame
pygame.init()
# 定義窗口大小和標(biāo)題
screen_width = 1600
screen_height = 1000
screen = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption("簡單的Pygame窗口")
# 創(chuàng)建一個新的Surface對象
width = 200 # 新Surface的寬度
height = 200 # 新Surface的高度
flags = pygame.SRCALPHA # 使用SRCALPHA標(biāo)志以支持Alpha透明度
depth = 32 # 32位顏色深度
new_surface = pygame.Surface((width, height), flags, depth)
# 加載圖像
image = pygame.image.load("屏幕截圖 2024-01-15 155410.png") # 加載一個圖像文件(請?zhí)鎿Q成你的圖像文件路徑)
# 進入主循環(huán)
while True:
for event in pygame.event.get(): # 獲取Pygame事件
if event.type == pygame.QUIT: # 如果事件類型是窗口關(guān)閉
pygame.quit() # 退出Pygame
sys.exit() # 退出程序
# 在新Surface上繪制圖像
new_surface.fill((255, 0, 0)) # 填充新Surface為紅色背景
new_surface.blit(image, (0, 0)) # 將加載的圖像繪制到新Surface的左上角
# 填充窗口背景為灰色
screen.fill((156, 156, 156))
# 在窗口上繪制新Surface
screen.blit(new_surface, (100, 100)) # 將新Surface繪制到窗口的(100, 100)位置
# 更新屏幕內(nèi)容
pygame.display.flip() # 刷新窗口,顯示最新的游戲畫面
? ? ? ? ? ? ? ? (1)Surface模塊創(chuàng)建圖像
# 創(chuàng)建一個新的Surface對象
width = 50 # 新Surface的寬度
height = 50 # 新Surface的高度
flags = pygame.SRCALPHA # 使用SRCALPHA標(biāo)志以支持Alpha透明度
depth = 32 # 32位顏色深度
new_surface = pygame.Surface((width, height), flags, depth)
# 格式 Surface=pygame.Surface(size=(width,height),flags,depth)
# size:表示Surface對象的矩形區(qū)域大小
# flage:功能標(biāo)志位,有兩個可選參數(shù)值HWSURFACE和SPCALPHA,前者代表將創(chuàng)建的Surface對象存放于顯存中,后者表示讓圖像的每一個像素包含一個alpha通道
# depth:指定像素的顏色深度,默認為自適應(yīng)模式,由Pygame自動調(diào)節(jié)
? ? ? ? ? ? ? ?pygame.SRCALPHA?是Pygame庫中的一個特殊標(biāo)志,用于在創(chuàng)建新的Surface對象時指示該Surface具有Alpha透明度支持。具體來說,SRCALPHA表示要為新的Surface分配一個Alpha通道,以便你可以控制每個像素的透明度。
????????Alpha透明度是指圖像的每個像素的透明程度或不透明程度。Alpha通道是圖像中存儲每個像素Alpha透明度值的一種方式。它通常是一個獨立的顏色通道,與紅、綠和藍通道一起組成了一個像素的顏色。每個像素都有一個與之關(guān)聯(lián)的Alpha通道值,用于表示該像素的透明度。
運行結(jié)果示例:
? ? ? ? ? ? ? ? (2)Surface從外部加載圖像
? ? ? ? ? ? ? ? 引入外部圖像的代碼
image_surface = pygame.image.load('E:\超級瑪麗\屏幕截圖 2024-01-15 155410.png')
# 加載一個圖像文件
? ? ??????????????完整代碼:
import pygame # 導(dǎo)入Pygame庫
import sys # 導(dǎo)入sys庫,用于退出程序
pygame.init() # 初始化Pygame
# 設(shè)置主窗口
screen = pygame.display.set_mode((800, 600)) # 創(chuàng)建一個800x600像素的游戲窗口
screen.fill('white') # 填充窗口背景為白色
# 設(shè)置窗口標(biāo)題
pygame.display.set_caption('簡單的Pygame窗口') # 設(shè)置游戲窗口標(biāo)題為'簡單的Pygame窗口'
# 加載圖片
image_surface = pygame.image.load('E:\超級瑪麗\屏幕截圖 2024-01-15 155410.png') # 加載一個圖像文件
# 填充圖片的指定區(qū)域為藍色
image_surface.fill((0, 0, 255), rect=(100, 100, 100, 50), special_flags=0)
# 上面這行代碼的作用是將加載的圖像的指定區(qū)域(矩形區(qū)域,左上角坐標(biāo)為(100, 100),寬度為100像素,高度為50像素)填充為藍色。
image_surface.scroll(100, 60) # 移動圖片
# 上面這行代碼的作用是將加載的圖像向右移動100像素,向下移動60像素。
while True:
for event in pygame.event.get(): # 獲取Pygame事件
if event.type == pygame.QUIT: # 如果事件類型是窗口關(guān)閉
pygame.quit() # 退出Pygame
sys.exit() # 退出程序
# 將圖像添加到主屏幕上
screen.blit(image_surface, (0, 0)) # 將加載的圖像繪制到主窗口的左上角(0, 0)位置
# 更新屏幕內(nèi)容
pygame.display.flip() # 刷新窗口,顯示最新的游戲畫面
? ? ? ? ? ? ? ? 運行結(jié)果:
? ? ? ? ? ? ? ? 4.利用pygame的Transform使圖像變形?
方法 | 說明 |
pygame.transform.scale() | 將圖片縮放至指定的大小,并返回一個新的Surface對象 |
pygame.transform.rotate() | 將圖片旋轉(zhuǎn)至指定角度 |
pygame.transform.rotozoom() | 以角度旋轉(zhuǎn)圖像,同時將圖像縮小或放大至指定的倍數(shù) |
? ? ? ? ? ? ? ? 5.利用pygame的time進行時間的控制
? ? ? ? ? ? ? ? (1)游戲暫停
? ? ? ? ? ? ? ? ? ?<1>利用pygame.time.get_ticks()來獲取時間
import pygame
import sys
pygame.init()
# 設(shè)置主窗口
screen = pygame.display.set_mode((800, 600))
screen.fill((255, 255, 255)) # 白色背景
# 設(shè)置窗口標(biāo)題
pygame.display.set_caption('簡單的Pygame窗口')
# 加載圖片
image_surface = pygame.image.load('E:\超級瑪麗\屏幕截圖 2024-01-15 155410.png')
# 初始化滾動變量
scroll_x = 0
scroll_y = 0
last_update_time = pygame.time.get_ticks()
while True:
# 檢查退出事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
# 獲取當(dāng)前時間
current_time = pygame.time.get_ticks()
# 每隔100毫秒滾動一次圖片
if current_time - last_update_time > 100:
last_update_time = current_time
scroll_x += 10 # 每次水平滾動10像素
scroll_y += 5 # 每次垂直滾動5像素
image_surface.fill((0, 0, 255), rect=(100, 100, 100, 50), special_flags=0)
image_surface.scroll(scroll_x, scroll_y)
# 將圖像添加到主屏幕上
screen.blit(image_surface, (0, 0))
# 更新屏幕內(nèi)容
pygame.display.flip()
????????????????在上面的代碼中,last_update_time = pygame.time.get_ticks() 的作用是用來記錄上一次更新操作的時間點。在游戲循環(huán)中,首先獲取當(dāng)前的毫秒數(shù)時間戳,使用 pygame.time.get_ticks() 函數(shù)得到 current_time 變量。然后,通過計算 current_time - last_update_time 來確定自上一次更新操作以來經(jīng)過了多少毫秒時間。文章來源:http://www.zghlxwxcb.cn/news/detail-815862.html
????????????????如果經(jīng)過的時間超過了100毫秒(即 current_time - last_update_time > 100),就執(zhí)行一次圖像的滾動操作。接著,將 last_update_time 更新為當(dāng)前時間,以便下一次循環(huán)中繼續(xù)計算時間間隔。last_update_time 變量的作用是跟蹤上一次圖像滾動操作的時間點,以便在控制每次滾動的時間間隔時使用,確保圖像以恰當(dāng)?shù)乃俣葷L動。文章來源地址http://www.zghlxwxcb.cn/news/detail-815862.html
? ? ? ? ? ? ? ? ? ?<2>利用pygame.time.wait()來暫停一段時間和利用pygame.time.set_time()創(chuàng)建一個定時器,即每隔一段時間就去執(zhí)行一些動作
import pygame # 導(dǎo)入pygame庫
pygame.init() # 初始化pygame
# 創(chuàng)建一個窗口,尺寸為500x400像素
screen = pygame.display.set_mode((500, 400))
# 設(shè)置窗口的標(biāo)題為'時間設(shè)置'
pygame.display.set_caption('時間設(shè)置')
# 獲取當(dāng)前時間(自pygame初始化以來的毫秒數(shù))
t = pygame.time.get_ticks()
# 暫停游戲3000毫秒(3秒)
t1 = pygame.time.wait(3000)
# 打印暫停時間(這里應(yīng)該是3000,因為pygame.time.wait返回的是暫停的毫秒數(shù))
print(t1)
# 加載一張圖片(確保文件路徑正確)
image_surface = pygame.image.load('E:\\超級瑪麗\\屏幕截圖 2024-01-15 155410.png')
# 進入游戲的主循環(huán)
while True:
# 遍歷所有的事件
for event in pygame.event.get():
# 如果事件類型是QUIT(例如點擊了關(guān)閉窗口的按鈕),則退出程序
if event.type == pygame.QUIT:
exit()
# 將加載的圖片繪制到窗口的(0,0)位置
screen.blit(image_surface, (0, 0))
# 更新整個屏幕的顯示
pygame.display.update()
到了這里,關(guān)于Python -- 利用pygame庫進行游戲開發(fā)基礎(chǔ)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!