關(guān)于pygame.surface.blit()方法4個參數(shù)的使用
pygame.surface.blit()方法4個參數(shù)使用
pygame.surface.blit方法將一個圖像(Surface實例)繪制到另一個圖像(Surface實例)上。
如screen是一個Surface實例,方法blit具體使用方法如下:
rect=screen.blit(source,dest,area=None,special_flags=0)
參數(shù)source是某矩形圖像(Surface實例),將被繪制到另一矩形圖像screen(Surface實例)上由參數(shù)dest指定位置。
返回值是一個Rect對象,表示在screen上實際繪制的矩形區(qū)域。
參數(shù)dest可以是矩形圖像source左上角在screen上的坐標
例如:
screen=pygame.display.set_mode(200,200) #screen是Surface實例,寬高各為200 screen.blit(image,(10,10)) #image是某圖像,(10,10)是screen坐標
如果傳入一個Rect對象給dest,那么blit()會使用其左上角坐標,而忽略Rect的寬和高。
例如:
screen = pygame.display.set_mode(200,200) rect=image.get_rect() rect.x,rect.y=10,10 screen.blit(image, rect) #效果同上邊代碼
編寫了一個簡單例子
在屏幕顯示一個背景為黑色的紅色圓。
為把背景去掉,一般采用方法是,將圖形保存為png格式文件,將背景設(shè)置為透明。
pygame給出另一種方法,使用python語句去掉背景,見第12條語句。
運行效果如下圖,左圖沒使用第12條語句,右圖使用第12條語句。
完整程序
如下所示:
僅拷貝源程序不能正確運行,必須用畫圖程序創(chuàng)建一個寬高各為100,背景為黑色,中間有一個外輪廓線和填充色都為紅色的圓的png格式圖形文件,文件名稱為’g.png’,保存到源程序所在文件夾中,才可正確運行。
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語句除去背景") # 設(shè)置窗口標題 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) #沒有此條,有背景 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() #刷新游戲場景 fclock.tick(fps) #本幀中程序已運行了若干秒,為保證fps,該語句保證延遲余下時間 pygame.quit()
blit方法第3和第4個參數(shù)都有默認值,實際使用中可以不使用這兩個參數(shù)。
可選參數(shù)area是一個Rect對象,表示從source的area區(qū)域取出圖像繪制到screen上。
如source為圖像image,包含2行4列8個等寬等高的動畫幀,寬為width,高為height,則每幀寬為width//4,幀高為height//2,幀序號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 #幀號從0-7,初始為0,完成1幀,其值加1,到8,變0 rect=image.get_rect() #左上角坐標(0,0),右下角坐標為(width,height) #表示從image的坐標(0,0)處,取寬rect.width//4,高為rect.height的一幀圖像 rect2=pygame.Rect(0,0,rect.width//4,rect.height//2) row=frameNum//4 #求整數(shù)商為行號,根據(jù)frameNum改變:0,1 col=frameNum%4 #求余數(shù)為列號,根據(jù)frameNum改變:0,1,2,3 rect2.x=col*rect2.width #rect2是blit方法第3個參數(shù),frameNum=0,第1幀 rect2.y=row*rect2.height #=1,第2幀,...=3,第4幀,=4,第5幀... #從image中用rect2截取1幀在screen坐標(10,10)處顯示 screen.blit(image,(10,10),rect2)
依此原理編寫了一個有8幀的跑步程序。
包含8幀跑步圖形的圖像為blit第1參數(shù),如下圖,該圖像為png格式,背景已變透明。
程序運行效果圖
如下所示:
可以看到從右向左跑的圖像質(zhì)量不太好,考慮是在去黑色背景時,將黑色小人某些部分作為背景變?yōu)橥该?,如果把黑色小人改為紅色小人可能效果會變好。
或者將透明背景顏色改為白色,從透明背景圖像取出部分圖像,失去透明,背景將變?yōu)榘咨?3條語句改為去除背景色為白色,不知可行否。不知是否有其它更好的方法。
具體程序如下。
僅拷貝源程序不能正確運行。
可將上邊8幀跑步圖像用截圖工具截圖,保存為png格式文件,用網(wǎng)上背景透明網(wǎng)頁或微軟微軟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è)置窗口標題 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個參數(shù) fclock = pygame.time.Clock() #創(chuàng)建控制頻率的clock fps = 5 #定義刷新頻率 x=0 #blit方法第2個參數(shù)的x坐標,y坐標不變 frameNum=0 #幀號從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ù)商為行號,根據(jù)frameNum改變:0,1 col=frameNum%4 #求余數(shù)為列號,根據(jù)frameNum改變:0,1,2,3, rect2.x=col*rect2.width #rect2是blit方法第3個參數(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)建一個Surface實例 p.blit(image, (0, 0), rect2) #從image中拷貝rect2區(qū)域圖像到p,左上角對齊 p=pygame.transform.flip(p,True,False)# 反向 #p.convert_alpha() #加此條語句后不能去掉背景 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() #刷新游戲場景 fclock.tick(fps) #本幀中程序已運行了若干秒,為保證fps,該語句保證延遲余下時間 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;將來還可能添加更多新的標志。
應是將參數(shù)source(Surface對象)繪制到screen(Surface對象)上時,兩者對應位置顏色的混合方式,默認方式應為參數(shù)source顏色覆蓋screen對應點顏色。理解不知正確否。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python+Appium實現(xiàn)自動化測試的使用步驟
這篇文章主要介紹了Python+Appium實現(xiàn)自動化測試的使用步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-03-03pytorch 數(shù)據(jù)處理:定義自己的數(shù)據(jù)集合實例
今天小編就為大家分享一篇pytorch 數(shù)據(jù)處理:定義自己的數(shù)據(jù)集合實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12Python連接SQLite數(shù)據(jù)庫并進行增冊改查操作方法詳解
這篇文章主要介紹了Python對SQLite數(shù)據(jù)庫進行增冊改查操作方法詳解,需要的朋友可以參考下2020-02-02Python使用pickle模塊報錯EOFError Ran out of input的解決方法
這篇文章主要介紹了Python使用pickle模塊報錯EOFError Ran out of input的解決方法,涉及Python異常捕獲操作處理相關(guān)使用技巧,需要的朋友可以參考下2018-08-08Python中使用NumPy進行數(shù)據(jù)處理方式
這篇文章主要介紹了Python中使用NumPy進行數(shù)據(jù)處理方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-02-02