关于pygame.surface.blit()方法4个参数的使用
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对应点颜色。理解不知正确否。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
python的staticmethod与classmethod实现实例代码
这篇文章主要介绍了python的staticmethod与classmethod实现实例代码,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下2018-02-02关于pip install uwsgi安装失败问题的解决方案
这篇文章主要介绍了关于pip install uwsgi安装失败问题的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2023-06-06PyTorch与PyTorch Geometric的安装过程
这篇文章主要介绍了PyTorch与PyTorch Geometric的安装,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2023-04-04
最新评论