欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

關(guān)于pygame.surface.blit()方法4個(gè)參數(shù)的使用

 更新時(shí)間:2024年03月05日 14:24:35   作者:geng_zhaoying  
這篇文章主要介紹了關(guān)于pygame.surface.blit()方法4個(gè)參數(shù)的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

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)文章

最新評(píng)論