pygameで半透明のスプライトを作成する方法
質問
私は pygame を使い始めたばかりで、半透明のスプライトを作成しようとしています。スプライトのソース ファイルはディスクからロードされた非透明のビットマップ ファイルです。できればソース画像は編集したくないです。pygame コードを使用してこれを行う方法があると思いますが、Google は役に立ちません。
解決 3
私は私の元の質問で明らかにされていないかもしれないが、私は私が自分でそれを考え出したと思います。私が探していたことは私がしなければならなかったすべての半透明の画像は、独自の表面上にあったことを確認していた、表面のset_alpha()メソッドであることが判明します。
ここに私のストリップダウンコードでの例です。
import pygame, os.path
from pygame.locals import *
class TranslucentSprite(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self, TranslucentSprite.container)
self.image = pygame.image.load(os.path.join('data', 'image.bmp'))
self.image = self.image.convert()
self.image.set_colorkey(-1, RLEACCEL)
self.rect = self.image.get_rect()
self.rect.center = (320,240)
def main():
pygame.init()
screen = pygame.display.set_mode((640,480))
background = pygame.Surface(screen.get_size())
background = background.convert()
background.fill((250,250,250))
clock = pygame.time.Clock()
transgroups = pygame.sprite.Group()
TranslucentSprite.container = transgroups
"""Here's the Translucency Code"""
transsurface = pygame.display.set_mode(screen.get_size())
transsurface = transsurface.convert(screen)
transsurface.fill((255,0,255))
transsurface.set_colorkey((255,0,255))
transsurface.set_alpha(50)
TranslucentSprite()
while 1:
clock.tick(60)
for event in pygame.event.get():
if event.type == QUIT:
return
elif event.type == KEYDOWN and event.key == K_ESCAPE:
return
transgroups.draw(transsurface)
screen.blit(background,(0,0))
screen.blit(transsurface,(0,0))
pygame.display.flip()
if __name__ == '__main__' : main()
これが最良の手法ですか?最も単純明快であるように思われる。
他のヒント
画像をロードした後、あなたはSurface
のアルファチャンネルを有効にする必要があります。それは少しのようになります。
background = pygame.Display.set_mode()
myimage = pygame.image.load("path/to/image.bmp").convert_alpha(background)
これは、画像をロードし、直ちに表示面上にアルファブレンディングするのに適したピクセルフォーマットに変換します。あなたには、いくつかの他にブリットする必要がある場合は、別の形式で画面バッファオフ、いくつかの他の表面を使用することができます。
あなたは、あなたがピクセルあたりの表面を変更することができますが、RGBカラー値のための3要素のタプルを取り、RGBA色+アルファのいくつかの希望4tupleを返す関数を持っていると言う、単に十分なピクセルごとのアルファを設定することができます:
def set_alphas(color):
if color == (255,255,0): # magenta means clear
return (0,0,0,0)
if color == (0,255,255): # cyan means shadow
return (0,0,0,128)
r,g,b = color
return (r,g,b,255) # otherwise use the solid color from the image.
for row in range(myimage.get_height()):
for col in range(myimage,get_width()):
myimage.set_at((row, col), set_alphas(myimage.get_at((row, col))[:3]))
私は願って、そこにこれを行うには、他の、より有用な方法がありますが、これはあなたのアイデアを提供します。
画像の背景が単色の場合、それを透明にしたい場合は、次のように設定できます。 カラーキー 値を指定すると、pygame は画像をブリッティングするときに透明にします。
例えば:
color = image.get_at((0,0)) #we get the color of the upper-left corner pixel
image.set_colorkey(color)
あなたはあなたがイメージに直接たい透明性のいずれかの種類を行うことができますPNG画像を使用してへの切り替えを検討してください。