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=10,10
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个参数的使用方法的主要内容,如果未能解决你的问题,请参考以下文章
有没有更有效的方法将 4 个连续的双精度广播到 4 个 YMM 寄存器中?
python写一个密码生成器的类,要求有个类变量,统计一下一共生成过多少个密码。 要求有4个方法,1:构造方法 2 实例方法 3 类方法 4 静态方法