教材中未提及透明小乌龟设置的原理,自定义函数blit_alpha()的实现步骤也存在不解
本帖最后由 lzb1001 于 2022-7-11 15:41 编辑代码略(按小乌龟教材和视频中)
【代码分析】自定义函数blit_alpha()实现步骤:
①首先创造一个不带Alpha通道的Surface(事实上就是小乌龟所在的矩形区域)
对应代码:temp = pygame.Surface((source.get_width(), source.get_height())).convert() # 最底层(不带Alpha透明图层通道)
②然后用背景覆盖小乌龟所在的矩形区域位置(矩形区域与背景的正中心点完全重合),背景不带Alpha通道(background = pygame.image.load(r'd:\\work\\grass.jpg').convert())
对应代码:temp.blit(target, (-x, -y))# 中间层(不带Alpha透明图层通道)
③此刻temp得到的是一个尺寸与小乌龟的尺寸一样大小(不带Alpha通道)、上面绘制着背景(不带Alpha通道)的Surface对象,这个Surface对象不带Alpha通道
④ 再将带Alpha通道的小乌龟覆盖上去
对应代码:temp.blit(source, (0, 0)) # 最顶层(带Alpha透明图层通道)
此时分析temp的构成,其应由三层组成:最底层是一个黑色矩形框(不带Alpha透明图层通道),其位置、大小与turtle相同;中间层是screen(不带Alpha透明图层通道);最顶层是turtle(带Alpha透明图层通道)。temp由以上三者合而为一,其中最顶层带alpha透明图层通道,这样的temp可以通过调用set_alpha()方法设置其透明度???
⑤ 由于temp是不带Alpha通道的Surface对象,因此可以使用set_alpha()方法设置整个图片(整个图片是否包含④ 中带Alpha通道的小乌龟?)的透明度
对应代码:temp.set_alpha(opacity)
--若此时的temp包含了④ 中带Alpha通道的小乌龟,那此时的temp是否带Alpha通道?若此时的temp带Alpha通道,如何可以使用set_alpha()方法设置整个图片的透明度?反之,若此时可以使用set_alpha()方法设置整个图片的透明度,说明此时的temp不带Alpha通道
⑥ 最后将设置好透明度的temp“贴”到指定位置上---此时的temp是否包含④ 中带Alpha通道的小乌龟?
对应代码:target.blit(temp, location)
------------------------------------------
Windows 10 专业版 | Python 3.7.6
------------------------------------------
【我的问题】
1、以上黑色文字主要根据小甲鱼教材及视频整理所得,红色字体为我加的备注和疑惑不理解的地方,请大神和诸位不吝指点
2、教材和视频中仅介绍实现的步骤,好像未提及实现原理
******************************
感谢大神不吝赐教,为新手解疑释惑。
赠人玫瑰,手有余香,好人一生平安! 根据https://www.pygame.org/docs/ref/surface.html#pygame.Surface.set_alpha
提到的This value is different than the per pixel Surface alpha. For a surface with per pixel alpha, blanket alpha is ignored and None is returned.
如果surface带alpha通道,传递给set_alpha的alpha值将被忽略,则可以判断,temp不带alpha通道
③我认为,temp应该包含带alpha通道的小乌龟,不然画面中的小乌龟从哪来?
④那么可以猜测,将带alpha通道的surface放到不带alpha通道的surface上,后者似乎仍然不带alpha通道
③④不确定,若有错误请指出
页:
[1]