透明度を設定する前提についてお話します。透明度を設定するには、アルファチャネルのない画像を使用する必要があります。そうしないと、目的が達成されません(特定の理由はブロガーには明らかではありません(手動で笑う))
まず、アイデアについて説明します。取得する必要があるのは、背景画像でカメの透明度を実現することです。全体的なアイデアは、背景にアルファチャネルがなく、貼り付けた画像にアルファチャネルがある表面オブジェクトを作成することです。具体的なアイデアは次のとおりです。
(1)最初に、アルファなしの画像と同じ大きさの長方形の表面オブジェクトtempを作成します
(2)tempに背景を描画し、tempに対するターゲットの位置が(-x、-y)になります。このとき、tempは画像と同じサイズになり、背景の表面オブジェクトを描画します
(3)アルファチャネルを使用して画像を描画します。このときの長方形のフレームに対するターゲット画像の位置は(0、0)です。
(4)現時点では、tempは背景画像と対象のカメを含む完全な画像になっています。tempは設定の最初にアルファのない表面オブジェクトであるため、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)
効果は次のとおりです。
ブロガーも初心者なので、質問がある場合はスプレーしてください。。