0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

pygameでRPGをつくってみる8 フェードアウト

Last updated at Posted at 2024-10-05

記事全体の目次へ移動

GIF

ここをクリックしてください

無題の動画 ‐ Clipchampで作成.gif

無題の動画 ‐ Clipchampで作成 (3).gif

半透明の図形

ここをクリックしてください
半透明の図形
import pygame
import sys

pygame.init()
screen = pygame.display.set_mode((320, 320))
pygame.display.set_caption('Semi-transparent')
# 半透明のSurfaceを作成
transparent_surface = pygame.Surface((40, 40), pygame.SRCALPHA)
# RGBA (黒, 透明度128)
transparent_surface.fill((0, 0, 0, 128))  

while (1):
    screen.fill((255, 255, 255))
    # 半透明のSurfaceを描画
    screen.blit(transparent_surface, (140, 140))
    pygame.display.update()
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

transparent_surface = pygame.Surface((40, 40), pygame.SRCALPHA)
(40,40)大きさです。(幅、高さ)
#RGBA (黒, 透明度128)
transparent_surface.fill((0, 0, 0, 128))
(0,0,0,128)色と透明度です。
0が完全な透明。255が透明ではありません。

screen.blit(transparent_surface, (140, 140))
(140,140)座標です。(よこ、たて)

マウスで半透明の図形表示

ここをクリックしてください

カーソルの位置によって図形が表示されたり、されなかったりします。

import pygame
import sys

pygame.init()
screen = pygame.display.set_mode((160, 160))
pygame.display.set_caption("mouse_rect")
x,y = 0,0
# 半透明のSurfaceを作成
transparent_surface = pygame.Surface((40, 40), pygame.SRCALPHA)
# RGBA (黒, 透明度128)
transparent_surface.fill((0, 0, 0, 128))  

running = True
while running:
    # 画面を青で塗りつぶす
    screen.fill((0, 0, 255))
    # 半透明のSurfaceを描画
    if x >= 60 and x <= 100:
        if y >= 60 and y <= 100:
            screen.blit(transparent_surface, (60, 60))

    pygame.display.update()
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        mouse_pos = pygame.mouse.get_pos()
        x = mouse_pos[0]
        y = mouse_pos[1]


pygame.quit()
sys.exit()

フェードアウト

ここをクリックしてください

import pygame
import sys
from pygame.locals import *
import time

pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption('fade_out')
change = 0
#ここに背景のパスを貼り付ける
img = pygame.image.load(パス)
# 半透明のSurfaceを作成
transparent_surface = pygame.Surface((640, 480), pygame.SRCALPHA)
transparent_surface.fill((0, 0, 0, change))  

while (1):
    screen.blit(img,(0,0))
    if change < 255:
        change += 1
    time.sleep(0.01)
    transparent_surface.fill((0, 0, 0, change))  
    #透明のSurfaceを描画
    screen.blit(transparent_surface, (0, 0))
    pygame.display.update()
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

テキスト明滅

ここをクリックしてください
import pygame
import sys
import time
# Pygameを初期化
pygame.init()
# 画面を作成
screen = pygame.display.set_mode((320, 320))
# フォントを作成
font = pygame.font.Font(None, 50)
# テキストをレンダリング
text = font.render("Press any Button", True, (255, 255, 255))
text_rect = text.get_rect(center=(160, 160))
# メインループ
running = True
alpha = 220
delta = -3
clock = pygame.time.Clock()
while running:
    # フレームレートを設定
    clock.tick(60)    
    # 画面を黒で塗りつぶす
    screen.fill((0, 0, 0))
    # テキストの透明度を変更
    text.set_alpha(alpha)
    screen.blit(text, text_rect)
    # 透明度を変化させる
    alpha += delta
    if alpha <= 70 or alpha >= 240:
        delta = -delta
        time.sleep(0.5)
    # 画面を更新
    pygame.display.update()
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

透明テキスト(マスク)

ここをクリックしてください

スクリーンショット (671).png

import pygame
import sys

# Pygameを初期化
pygame.init()

# 画面を設定
width, height = 400, 300
screen = pygame.display.set_mode((width, height))
pygame.display.set_caption("Transparent Text Inside Shape")

# 色を定義
black = (0, 0, 0)
transparent = (0, 0, 0, 0)
#背景画像のパスを貼り付ける
surface = pygame.image.load(パス)
#textの中に描く画像のパスを貼り付ける
img = pygame.image.load(パス)
# フォントオブジェクトを作成
font = pygame.font.SysFont(None, 200)

# テキストをレンダリング
text_surface = font.render("Text", True, black)

# テキストの矩形を取得
text_rect = text_surface.get_rect(center=(width // 2, height // 4))

# テキストのマスクを作成
text_mask = pygame.mask.from_surface(text_surface)

# テキストエリアを透明にするためにマスクを背景のサーフェスに適用
for x in range(text_rect.width):
    for y in range(text_rect.height):
        if text_mask.get_at((x, y)):
            surface.set_at((text_rect.x + x, text_rect.y + y), transparent)


# メインループ
running = True
while running:
    screen.blit(img,(0,0))
    # 背景のサーフェスを画面にブリット
    screen.blit(surface, (0, 0))

    # 画面を更新
    pygame.display.flip()
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

# Pygameを終了
pygame.quit()
sys.exit()

半透明の画像

ここをクリックしてください
import pygame

pygame.init()
screen = pygame.display.set_mode((640, 480))
# 画像のパスを貼り付ける
image = pygame.image.load(パス)
running = True
while running:
    screen.fill((255,255,255))
    # 画像の透明度を設定(例:128)
    image.set_alpha(128)
    screen.blit(image, (270, 190))
    pygame.display.flip()
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

pygame.quit()

スクリーンショット (696).png

画像にグラデーション

タイトルロゴに使えそうです。

ここをクリックしてください

before
スクリーンショット (701).png

after
スクリーンショット (700).png

import pygame
import sys

# Pygameの初期化
pygame.init()

# 画面サイズの設定
screen_width, screen_height = 320, 320
screen = pygame.display.set_mode((screen_width, screen_height))

# ここに画像のパスを貼り付ける
image = pygame.image.load(パス)
width, height = image.get_size()
for x in range(width):
    for y in range(height):
        # 各ピクセルの色を取得
        r, g, b, a = image.get_at((x, y))
        # 白に変換
        white = 255
        # ピクセルの色を変更
        image.set_at((x, y), (white, white, white, a))

width, height = image.get_size()

# グラデーションを作成
gradient_surface = pygame.Surface((width, height), pygame.SRCALPHA)
for x in range(width):
    for y in range(height):
        # (255, 153, 255) から (153, 255, 255) のグラデーション
        r = 255 - int((255 - 153) * (x / width))
        g = 153 + int((255 - 153) * (x / width))
        color = (r, g, 255, 255)
        gradient_surface.set_at((x, y), color)

# 画像とグラデーションを合成
image.blit(gradient_surface, (0, 0), special_flags=pygame.BLEND_RGBA_MULT)

# メインループ
running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    screen.fill((255, 255, 255))
    screen.blit(image, (85, 85))
    pygame.display.flip()

pygame.quit()
sys.exit()

画像の一部を半透明

ここをクリックしてください

画像ファイルを半透明にするコードです。
pygameで半透明にするコードではありません。

スクリーンショット (758).png

スクリーンショット (758) - コピー.png

いずれ茂みに入った時、体の一部が半透明となるようにしたいです。
背景が透明の画像に使用します。背景が透明でない画像ではうまくいきません。

import cv2
import numpy as np
import os

k = 0
# スクリプトが存在するフォルダのパスを取得
folder_path = os.path.dirname(os.path.abspath(__file__))

# 32x32のタイルのサイズ
tile_size = 32
# フォルダ内のすべてのファイルを処理
for filename in os.listdir(folder_path):
    if filename.endswith(".png"):
        file_path = os.path.join(folder_path, filename)
        image = cv2.imread(file_path, cv2.IMREAD_UNCHANGED)

        # アルファチャンネルを追加(3チャンネルの場合)
        if image.shape[2] == 3:
            image = cv2.cvtColor(image, cv2.COLOR_BGR2BGRA)

        # 各タイルごとに処理
        for i in range(0, image.shape[0], tile_size):
            for j in range(0, image.shape[1], tile_size):
                #tile_size / ここの数値で透明の範囲が決まる
                for y in range(int(i + tile_size / 1.25), i + tile_size):
                    for x in range(j, j + tile_size):
                        image[y, x, 3] = int(image[y, x, 3] * 0.5)

        # 変更後の画像を保存
        cv2.imwrite(f'semi_transparent_image{k}.png', image)
        k += 1

print("完了しました")

これだけではまだ使えません。
load_image()を変更します。
image = image.convert()に _alpha をたします。

def load_image(filename, colorkey=None):
    filename = os.path.join("data", filename)
    try:
        image = pygame.image.load(filename)
    except (pygame.error, message):
        print ("Cannot load image:"), filename
        raise (SystemExit, message)
    image = image.convert_alpha()#ここ
    if colorkey is not None:
        if colorkey == -1:
            colorkey = image.get_at((0,0))
        image.set_colorkey(colorkey, RLEACCEL)
    return image

def split_image()も変更する必要があります。

def split_image(image):
    """128x128のキャラクターイメージを32x32の16枚のイメージに分割
    分割したイメージを格納したリストを返す"""
    GS = 32
    imageList = []

    for i in range(0, 128, GS):
        for j in range(0, 128, GS):
            # キャラクター画像の透明ピクセルをチェック
            temp_surface = pygame.Surface((GS, GS), pygame.SRCALPHA)
            temp_surface.blit(image, (0, 0), (j, i, GS, GS))
            # 中央ピクセルが透明なら透明サーフェスを作成
            if temp_surface.get_at((0, 0))[3] == 0:
                surface = pygame.Surface((GS, GS), pygame.SRCALPHA)
                surface.fill((0, 0, 0, 0))
            # 透明でないなら通常のサーフェスを作成
            else:
                surface = pygame.Surface((GS, GS))
                surface.fill((255, 255, 255))  # 白で塗りつぶし

            surface.blit(image, (0, 0), (j, i, GS, GS))
            surface.set_colorkey(surface.get_at((0, 0)), pygame.RLEACCEL)
            imageList.append(surface)

    return imageList

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?