小甲鱼83课关于图片透明度设置的问题详解 python

   日期:2020-09-15     浏览:119    评论:0    
核心提示:先说设置透明度的前提,需要使用不带alpha通道的图片才能设置透明度,否则会达不到目的(具体原因博主也不太清楚(手动笑哭))首先说思路,我们需要得到的是在背景图片上对小甲鱼实现透明,整体思路就是创建一个背景不带alpha通道、所贴的图片带alpha通道的一个suface对象,具体思路如下: (1)、首先创建一个与图片等大的不带alpha的矩形surface对象temp(2)、在temp上绘制背景,target相对于temp的位置变成了(-x,-y),此时temp得到的是与图片大小一样,绘制着..

先说设置透明度的前提,需要使用不带alpha通道的图片才能设置透明度,否则会达不到目的(具体原因博主也不太清楚(手动笑哭))

首先说思路,我们需要得到的是在背景图片上对小甲鱼实现透明,整体思路就是创建一个背景不带alpha通道、所贴的图片带alpha通道的一个suface对象,具体思路如下:

  (1)、 首先创建一个与图片等大的不带alpha的矩形surface对象temp

(2)、在temp上绘制背景,target相对于temp的位置变成了(-x,-y),此时temp得到的是与图片大小一样,绘制着背景的surface对象

(3)、将带alpha通道的图片绘制上去,此时的目标图片相对于矩形框的位置为(0,0)

(4)、此时temp已经成为了一个带背景图片与目标乌龟的一张完整图片,由于temp在设置之初是不带alpha的surface对象,因此可以使用set_alpha()方法设置整个图片的透明度

(5)、将设置好透明度的temp作为一张独立图片贴到指定位置。

 

详细代码如下:

import pygame
import sys
from pygame.locals import *

pygame.init()

size = width, height = 640, 480
bg = (0, 0, 0)

clock = pygame.time.Clock()
#绘制size尺寸的背景
screen = pygame.display.set_mode(size)
#显示标题
pygame.display.set_caption("FishC Demo")
#带alpha的目标图片
turtle = pygame.image.load("turtle.png").convert_alpha()
#不带alpha的背景图片
background  = pygame.image.load("background.jpg").convert()
position = turtle.get_rect()
#turtle 位置中心
position.center = width // 2, height // 2

#target 背景 sorce 图片 location 图片的实时位置  opacity 透明度
def blit_alpha(target, source, location, opacity):
    #小甲鱼的位置坐标
    x = location[0]
    y = location[1]
    #temp:一个与图片等大的不带alpha的矩形surface对象
    temp = pygame.Surface((source.get_width(), source.get_height())).convert()
    #在temp上绘制背景,target相对于temp的位置变成了(-x,-y),此时temp
    #得到的是与图片大小一样,绘制着背景的surface对象
    temp.blit(target, (-x, -y ))
    #将带alpha通道的图片绘制上去,此时的目标图片相对于矩形框的位置为(0,0)
    temp.blit(source, (0, 0))
    #使用set_alpha()方法temp的透明度,透明度设置为200
    temp.set_alpha(opacity)
    #将设置好透明度的temp“贴到”指定位置
    target.blit(temp, location)

while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            sys.exit()
    #背景位置为(0,0)
    screen.blit(background, (0, 0))
    #调用绘制函数
    blit_alpha(screen, turtle, position, 200)
    # 更新整个待显示的Surface对象到屏幕上
    pygame.display.flip()
    #延迟30ms
    clock.tick(30)

实现效果如下:

 

 

博主也是新手,如有问题轻喷。。

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服