pygame.surface.blit()方法4个参数的使用方法

Posted geng_zhaoying

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pygame.surface.blit()方法4个参数的使用方法相关的知识,希望对你有一定的参考价值。

pygame.surface.blit方法将一个图像(Surface实例)绘制到另一个图像(Surface实例)上。如screen是一个Surface实例,方法blit具体使用方法如下:

rect=screen.blit(source,dest,area=None,special_flags=0)

参数source是某矩形图像(Surface实例),将被绘制到另一矩形图像screen(Surface实例)上由参数dest指定位置。返回值是一个Rect对象,表示在screen上实际绘制的矩形区域。参数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=1010
screen.blit(image, rect)	#效果同上边代码

编写了一个简单例子,在屏幕显示一个背景为黑色的红色圆。为把背景去掉,一般采用方法是,将图形保存为png格式文件,将背景设置为透明。pygame给出另一种方法,使用python语句去掉背景,见第12条语句。运行效果如下图,左图没使用第12条语句,右图使用第12条语句。
在这里插入图片描述
完整程序如下。仅拷贝源程序不能正确运行,必须用画图程序创建一个宽高各为100,背景为黑色,中间有一个外轮廓线和填充色都为红色的圆的png格式图形文件,文件名称为’g.png’,保存到源程序所在文件夹中,才可正确运行。

import pygame
BLACK=(0,0,0)                                          #两种创建颜色方法
bgcolor = pygame.Color('blue')
pygame.init()
size = width, height = 200,200                         #创建游戏窗口大小
screen = pygame.display.set_mode(size)
pygame.display.set_caption("用python语句除去背景")     # 设置窗口标题
p = pygame.image.load('g.png').convert()               # 加载图像
r=p.get_rect()                             #调整图像的大小,将图像缩放到任意大小
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()                #创建控制频率的clock
fps = 5                                     #定义刷新频率,每秒多少帧
running = True
while running:                              #处理退出事件    
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False            
    screen.fill(bgcolor)                        #设置背景的颜色  
    screen.blit(p, (width //4, height // 4))    #在屏幕中的矩形中绘制图形
    #pygame.display.update()
    pygame.display.flip()                       #刷新游戏场景
    fclock.tick(fps)  #本帧中程序已运行了若干秒,为保证fps,该语句保证延迟余下时间
pygame.quit()

blit方法第3和第4个参数都有默认值,实际使用中可以不使用这两个参数。可选参数area是一个Rect对象,表示从source的area区域取出图像绘制到screen上。如source为图像image,包含2行4列8个等宽等高的动画帧,宽为width,高为height,则每帧宽为width//4,帧高为height//2,帧序号frameNum取值范围为:0,1,2,…7。如从source的area区域逐次取出一帧图像在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           #求整数商为行号,根据frameNum改变:0,1
col=frameNum%4            #求余数为列号,根据frameNum改变:0,1,2,3
rect2.x=col*rect2.width   #rect2是blit方法第3个参数,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参数,如下图,该图像为png格式,背景已变透明。
在这里插入图片描述
程序运行效果图如下。可以看到从右向左跑的图像质量不太好,考虑是在去黑色背景时,将黑色小人某些部分作为背景变为透明,如果把黑色小人改为红色小人可能效果会变好。或者将透明背景颜色改为白色,从透明背景图像取出部分图像,失去透明,背景将变为白色,第33条语句改为去除背景色为白色,不知可行否。不知是否有其它更好的方法。
在这里插入图片描述
具体程序如下。仅拷贝源程序不能正确运行。可将上边8帧跑步图像用截图工具截图,保存为png格式文件,用网上背景透明网页或微软微软powerpoint将背景变为透明,保存到源程序所在文件夹的子文件夹pic中。

import pygame
BLACK=(0,0,0)       # 创建颜色两种方法
bgcolor = pygame.Color('blue')
pygame.init()
size = width, height = 300,200
screen = pygame.display.set_mode(size)        #创建游戏窗口大小
pygame.display.set_caption("跑步")            #设置窗口标题
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个参数
fclock = pygame.time.Clock()    #创建控制频率的clock
fps = 5                         #定义刷新频率
x=0                             #blit方法第2个参数的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)                #设置背景的颜色
    row=frameNum//4                     #求整数商为行号,根据frameNum改变:0,1
    col=frameNum%4                      #求余数为列号,根据frameNum改变:0,1,2,3,
    rect2.x=col*rect2.width             #rect2是blit方法第3个参数,             
    rect2.y=row*rect2.height            #根据frameNum改变,从image取不同帧
    if direction==0:
        screen.blit(image, (x, 60),rect2) #在屏幕指定位置绘制图形
    else:                               #不知反转图像是否还有其它更好的方法
        p = pygame.Surface((rect2.width, rect2.height))    #创建一个Surface实例
        p.blit(image, (0, 0), rect2)    #从image中拷贝rect2区域图像到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()

可选参数 special_flags 是 Pygame 1.8.0 新增的内容,用于指定混合的模式: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;将来还可能添加更多新的标志。
应是将参数source(Surface对象)绘制到screen(Surface对象)上时,两者对应位置颜色的混合方式,默认方式应为参数source颜色覆盖screen对应点颜色。理解不知正确否。

以上是关于pygame.surface.blit()方法4个参数的使用方法的主要内容,如果未能解决你的问题,请参考以下文章

在android中一个接一个地调用4个方法

如何创建获取 4 个数字并返回最大数字的 max 方法?

有没有更有效的方法将 4 个连续的双精度广播到 4 个 YMM 寄存器中?

4种生成前n个整数列表的方法

python写一个密码生成器的类,要求有个类变量,统计一下一共生成过多少个密码。 要求有4个方法,1:构造方法 2 实例方法 3 类方法 4 静态方法

delphi中将 4 个 Byte 合成 1 个 Integer 的五种方法