關(guān)于pygame.surface.blit()方法4個(gè)參數(shù)的使用
pygame.surface.blit()方法4個(gè)參數(shù)使用
pygame.surface.blit方法將一個(gè)圖像(Surface實(shí)例)繪制到另一個(gè)圖像(Surface實(shí)例)上。
如screen是一個(gè)Surface實(shí)例,方法blit具體使用方法如下:
rect=screen.blit(source,dest,area=None,special_flags=0)
參數(shù)source是某矩形圖像(Surface實(shí)例),將被繪制到另一矩形圖像screen(Surface實(shí)例)上由參數(shù)dest指定位置。
返回值是一個(gè)Rect對(duì)象,表示在screen上實(shí)際繪制的矩形區(qū)域。
參數(shù)dest可以是矩形圖像source左上角在screen上的坐標(biāo)
例如:
screen=pygame.display.set_mode(200,200) #screen是Surface實(shí)例,寬高各為200 screen.blit(image,(10,10)) #image是某圖像,(10,10)是screen坐標(biāo)
如果傳入一個(gè)Rect對(duì)象給dest,那么blit()會(huì)使用其左上角坐標(biāo),而忽略Rect的寬和高。
例如:
screen = pygame.display.set_mode(200,200) rect=image.get_rect() rect.x,rect.y=10,10 screen.blit(image, rect) #效果同上邊代碼
編寫(xiě)了一個(gè)簡(jiǎn)單例子
在屏幕顯示一個(gè)背景為黑色的紅色圓。
為把背景去掉,一般采用方法是,將圖形保存為png格式文件,將背景設(shè)置為透明。
pygame給出另一種方法,使用python語(yǔ)句去掉背景,見(jiàn)第12條語(yǔ)句。
運(yùn)行效果如下圖,左圖沒(méi)使用第12條語(yǔ)句,右圖使用第12條語(yǔ)句。

完整程序
如下所示:
僅拷貝源程序不能正確運(yùn)行,必須用畫(huà)圖程序創(chuàng)建一個(gè)寬高各為100,背景為黑色,中間有一個(gè)外輪廓線和填充色都為紅色的圓的png格式圖形文件,文件名稱(chēng)為’g.png’,保存到源程序所在文件夾中,才可正確運(yùn)行。
import pygame
BLACK=(0,0,0) #兩種創(chuàng)建顏色方法
bgcolor = pygame.Color('blue')
pygame.init()
size = width, height = 200,200 #創(chuàng)建游戲窗口大小
screen = pygame.display.set_mode(size)
pygame.display.set_caption("用python語(yǔ)句除去背景") # 設(shè)置窗口標(biāo)題
p = pygame.image.load('g.png').convert() # 加載圖像
r=p.get_rect() #調(diào)整圖像的大小,將圖像縮放到任意大小
p=pygame.transform.scale(p,(r.width//2, r.height//2))
#p=pygame.transform.smoothscale(p,(r.width//2,r.height//2))#使用此條背景不能消除
p.set_colorkey(BLACK) #沒(méi)有此條,有背景
fclock = pygame.time.Clock() #創(chuàng)建控制頻率的clock
fps = 5 #定義刷新頻率,每秒多少幀
running = True
while running: #處理退出事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
screen.fill(bgcolor) #設(shè)置背景的顏色
screen.blit(p, (width //4, height // 4)) #在屏幕中的矩形中繪制圖形
#pygame.display.update()
pygame.display.flip() #刷新游戲場(chǎng)景
fclock.tick(fps) #本幀中程序已運(yùn)行了若干秒,為保證fps,該語(yǔ)句保證延遲余下時(shí)間
pygame.quit()
blit方法第3和第4個(gè)參數(shù)都有默認(rèn)值,實(shí)際使用中可以不使用這兩個(gè)參數(shù)。
可選參數(shù)area是一個(gè)Rect對(duì)象,表示從source的area區(qū)域取出圖像繪制到screen上。
如source為圖像image,包含2行4列8個(gè)等寬等高的動(dòng)畫(huà)幀,寬為width,高為height,則每幀寬為width//4,幀高為height//2,幀序號(hào)frameNum取值范圍為:0,1,2,…7。
如從source的area區(qū)域逐次取出一幀圖像在screen上(10,10)處顯示的方法如下:
screen = pygame.display.set_mode(size)
image=pygame.image.load('pic/圖片去底1.png').convert_alpha() #背景已變透明
frameNum=0 #幀號(hào)從0-7,初始為0,完成1幀,其值加1,到8,變0
rect=image.get_rect() #左上角坐標(biāo)(0,0),右下角坐標(biāo)為(width,height)
#表示從image的坐標(biāo)(0,0)處,取寬rect.width//4,高為rect.height的一幀圖像
rect2=pygame.Rect(0,0,rect.width//4,rect.height//2)
row=frameNum//4 #求整數(shù)商為行號(hào),根據(jù)frameNum改變:0,1
col=frameNum%4 #求余數(shù)為列號(hào),根據(jù)frameNum改變:0,1,2,3
rect2.x=col*rect2.width #rect2是blit方法第3個(gè)參數(shù),frameNum=0,第1幀
rect2.y=row*rect2.height #=1,第2幀,...=3,第4幀,=4,第5幀...
#從image中用rect2截取1幀在screen坐標(biāo)(10,10)處顯示
screen.blit(image,(10,10),rect2)
依此原理編寫(xiě)了一個(gè)有8幀的跑步程序。
包含8幀跑步圖形的圖像為blit第1參數(shù),如下圖,該圖像為png格式,背景已變透明。

程序運(yùn)行效果圖
如下所示:
可以看到從右向左跑的圖像質(zhì)量不太好,考慮是在去黑色背景時(shí),將黑色小人某些部分作為背景變?yōu)橥该鳎绻押谏∪烁臑榧t色小人可能效果會(huì)變好。
或者將透明背景顏色改為白色,從透明背景圖像取出部分圖像,失去透明,背景將變?yōu)榘咨?,?3條語(yǔ)句改為去除背景色為白色,不知可行否。不知是否有其它更好的方法。

具體程序如下。
僅拷貝源程序不能正確運(yùn)行。
可將上邊8幀跑步圖像用截圖工具截圖,保存為png格式文件,用網(wǎng)上背景透明網(wǎng)頁(yè)或微軟微軟powerpoint將背景變?yōu)橥该?,保存到源程序所在文件夾的子文件夾pic中。
import pygame
BLACK=(0,0,0) # 創(chuàng)建顏色兩種方法
bgcolor = pygame.Color('blue')
pygame.init()
size = width, height = 300,200
screen = pygame.display.set_mode(size) #創(chuàng)建游戲窗口大小
pygame.display.set_caption("跑步") #設(shè)置窗口標(biāo)題
image = pygame.image.load('pic/圖片去底1.png').convert_alpha() #背景已變透明
rect = image.get_rect()
rect2 = pygame.Rect(0,0,rect.width//4,rect.height//2) #blit方法第3個(gè)參數(shù)
fclock = pygame.time.Clock() #創(chuàng)建控制頻率的clock
fps = 5 #定義刷新頻率
x=0 #blit方法第2個(gè)參數(shù)的x坐標(biāo),y坐標(biāo)不變
frameNum=0 #幀號(hào)從0-7,初始為0,完成1幀,其值加1,到8,變0
direction=0 #=0,從左到右跑,=1,從右到左跑
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT: # 處理退出事件
running = False
screen.fill(bgcolor) #設(shè)置背景的顏色
row=frameNum//4 #求整數(shù)商為行號(hào),根據(jù)frameNum改變:0,1
col=frameNum%4 #求余數(shù)為列號(hào),根據(jù)frameNum改變:0,1,2,3,
rect2.x=col*rect2.width #rect2是blit方法第3個(gè)參數(shù),
rect2.y=row*rect2.height #根據(jù)frameNum改變,從image取不同幀
if direction==0:
screen.blit(image, (x, 60),rect2) #在屏幕指定位置繪制圖形
else: #不知反轉(zhuǎn)圖像是否還有其它更好的方法
p = pygame.Surface((rect2.width, rect2.height)) #創(chuàng)建一個(gè)Surface實(shí)例
p.blit(image, (0, 0), rect2) #從image中拷貝rect2區(qū)域圖像到p,左上角對(duì)齊
p=pygame.transform.flip(p,True,False)# 反向
#p.convert_alpha() #加此條語(yǔ)句后不能去掉背景
p.set_colorkey(BLACK) #去圖像背景,不理想
screen.blit(p, (x, 60))
frameNum+=1
if frameNum==8:
frameNum=0
if direction==0: #=0,從左到右跑,x增加
x+=20
if x+80>width: #是否碰到右邊界
direction=1
else: #=1,從右到左跑,x減少
x-=20
if x<0: #是否碰到左邊界
direction=0
pygame.display.flip() #刷新游戲場(chǎng)景
fclock.tick(fps) #本幀中程序已運(yùn)行了若干秒,為保證fps,該語(yǔ)句保證延遲余下時(shí)間
pygame.quit()
可選參數(shù) special_flags 是 Pygame 1.8.0 新增的內(nèi)容,用于指定混合的模式:BLEND_ADD,BLEND_SUB,BLEND_MULT,BLEND_MIN,BLEND_MAX;
1.8.1 增加:BLEND_RGBA_ADD,BLEND_RGBA_SUB,BLEND_RGBA_MULT,BLEND_RGBA_MIN,BLEND_RGBA_MAX,BLEND_RGB_ADD,BLEND_RGB_SUB, BLEND_RGB_MULT,BLEND_RGB_MIN,BLEND_RGB_MAX;將來(lái)還可能添加更多新的標(biāo)志。
應(yīng)是將參數(shù)source(Surface對(duì)象)繪制到screen(Surface對(duì)象)上時(shí),兩者對(duì)應(yīng)位置顏色的混合方式,默認(rèn)方式應(yīng)為參數(shù)source顏色覆蓋screen對(duì)應(yīng)點(diǎn)顏色。理解不知正確否。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python+Appium實(shí)現(xiàn)自動(dòng)化測(cè)試的使用步驟
這篇文章主要介紹了Python+Appium實(shí)現(xiàn)自動(dòng)化測(cè)試的使用步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
python讀取txt文件,去掉空格計(jì)算每行長(zhǎng)度的方法
今天小編就為大家分享一篇python讀取txt文件,去掉空格計(jì)算每行長(zhǎng)度的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12
pytorch 數(shù)據(jù)處理:定義自己的數(shù)據(jù)集合實(shí)例
今天小編就為大家分享一篇pytorch 數(shù)據(jù)處理:定義自己的數(shù)據(jù)集合實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12
Python連接SQLite數(shù)據(jù)庫(kù)并進(jìn)行增冊(cè)改查操作方法詳解
這篇文章主要介紹了Python對(duì)SQLite數(shù)據(jù)庫(kù)進(jìn)行增冊(cè)改查操作方法詳解,需要的朋友可以參考下2020-02-02
Python使用pickle模塊報(bào)錯(cuò)EOFError Ran out of input的解決方法
這篇文章主要介紹了Python使用pickle模塊報(bào)錯(cuò)EOFError Ran out of input的解決方法,涉及Python異常捕獲操作處理相關(guān)使用技巧,需要的朋友可以參考下2018-08-08
Python中使用NumPy進(jìn)行數(shù)據(jù)處理方式
這篇文章主要介紹了Python中使用NumPy進(jìn)行數(shù)據(jù)處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02

