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

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

 更新時間:2024年03月05日 14:24:35   作者:geng_zhaoying  
這篇文章主要介紹了關(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)文章

最新評論