0

部分的に透明な色で(SRCALPHAフラグがオンになっている)サーフェスに任意の形状を描画すると、画像エディタで期待されるように重なり合うのではなく、その下にあったものが完全に置き換えられます。

形状を適切にオーバーラップさせるにはどうすればよいですか?

4

3 に答える 3

1

適切な値でblitを使用できBLEND_*ます (完全性と編集のために形状を個別のサーフェスとして保持し、表示目的でのみ blit します)。

于 2009-12-12T20:26:36.850 に答える
1

前述のように、PyGame の描画関数は実際には期待どおりにブレンドを行いません。PyGame のドキュメントから:

ほとんどの引数は、RGB トリプレットである color 引数を受け入れます。これらは、RGBA 4 つ組も受け入れることができます。Surface にピクセル アルファが含まれている場合、アルファ値は Surface に直接書き込まれますが、描画関数は透過的に描画しません。

おそらくやりたいことは、基本的にAlex Martelliが言ったことです-アルファチャネルを使用して中間ソフトウェアサーフェスを作成し、そのサーフェスにシェイプを描画し、最終的なサーフェスにブレンドしてブリットします。PyGame のフォント レンダリングを使用したことがある場合は、Font.render が一時的なサーフェスを作成することを除いて、ほぼ同じように機能することに注意してください。

最近、私は Python と PyGame に少し慣れていませんが、間違いがあまり多くないことを願って簡単な例を次に示します。

# returns a surface with the circle drawn onto it
def render_transparent_circle(color, radius, width=0):
    size = radius * 2
    temp_surf = pygame.Surface((size, size), SRCALPHA)
    temp_surf.fill(Color(0, 0, 0, 0))
    pygame.draw.circle(temp_surf, color, (radius, radius), radius, width)
    return temp_surf

# draw a half-opaque blue circle of radius 30 to the display at point (50, 100)
def test():
    transp_blue = Color(0, 0, 255, 128)
    screen = pygame.display.get_surface()
    circle = render_transparent_circle(transp_blue, 30)
    screen.blit(circle, (50, 100))

ps -- 同じ形状を複数回表示する場合は、中間サーフェスをキャッシュすることを検討することをお勧めします (ただし、それが役立つかどうかを確認するためにプロファイルを作成することを忘れないでください)。

于 2009-12-14T15:46:35.357 に答える
0

アルファ自体は、目的を果たすことができる追加の「値」にすぎません。たまたま、その目的は通常 (常にではありませんが) 透過性です (他の用途には、反射率、スペキュラー ハイライト、さらには HDR を偽造するためのアプローチが含まれます)。

ブレンドすることを指定する必要があります (およびそれを行うために使用する方程式)。「pygame ブレンド モード」をGoogle で簡単に検索すると、いくつかの優れたリソースが表示されます。

アレックスが指摘したように、blit はパラメーターとして Blending モードを取ります。このStackOverflowの質問は、より多くの情報を提供します。

于 2009-12-13T05:41:54.883 に答える