fill
と の両方の引数を使用して Surface でrect
使用しようとするとspecial_flags
、Surface の領域をエスケープする rect ディメンションを指定した場合、pygame が数秒間遅れ、通知なしでクラッシュします。
IDLE を使用したテストの結果は次のとおりです。
>>> import pygame
>>> test_surf = pygame.Surface((50,50))
>>> test_rgba = 50,100,150,200 # arbitrary
>>> test_rect = 33,33,33,33 # these dimensions are 16px too large on each axis.
>>> test_surf.fill(test_rgba, test_rect, pygame.BLEND_RGBA_MULT)
>>> ================================ RESTART ================================
>>>
この再起動は、ソフトウェアと対話する方法、または対話しない方法に関係なく発生します。pygame.init()
後で呼び出すかどうかに関係なく発生しますimport pygame
。
完全にサーフェスの境界 (この場合は(0,0,50,50)
) 内にある rect 引数を使用すると、正常に機能します。0
または、引数を省略したり送信したりしても、special_flags
この問題は発生しません。サーフェスに含まれるピクセルは通常どおりに変更され、エッジから「こぼれる」ものはすべて無視されます。
私が知りたいのは、この不思議で説明のつかない方法で pygame がクラッシュする原因は何ですか?
私はpygame 1.9.1とpython 2.7.10を使用しています。
ソリューション
この問題に苦しむ将来の読者は、少なくとも 3 つの方法のいずれかで問題を回避できます。ここでそれらをあなたと共有します:
クリップされた
rect
引数を使用します。rect 引数を に置き換え
fill
ますtest_surf.get_rect().clip(test_rect)
。宛先サーフェスの境界にclip
制限します。test_rect
共通のピクセルがない場合は、形状パラメータを持つ安全な四角形を返します<0, 0, 0, 0>
。blit
代わりに2 番目のサーフェスを使用してください。新しいサーフェスを作成し、BLEND モードを使用せずに必要な RGB 値 (アルファを除く) で塗りつぶし、 を使用
set_alpha
して目的の不透明度をサーフェスに適用し、最後blit
に新しいサーフェスをtest_surf
、または適切なdest
値を使用してターゲットが何であれ(私の場合は(33,33)
) と BLEND モード (私の場合はpygame.BLEND_RBGA_MULT
) です。バグとバグで戦う。
3 つ目の、より不可解な解決策は、
test_surf.fill(test_rgba, (0,0,0,0), pygame.BLEND_RGBA_MULT)
範囲外の rect を実行する前に呼び出すことです。これが何をしても、問題なく後続の BLENDed フィルで範囲外に安全に移動できるように pygame を修正するようです。さらに、範囲外を試みると、その後の任意のサーフェスでの BLENDed 塗りつぶしは安全に見えます。また、ゼロ ピクセルの BLENDed-fill が行うことは何でも、そのセッションでクラッシュが再び発生しないように、pygame の機能不全の要素を修正するようです。この 3 番目のソリューションは十分にテストされていないことに注意してください!!
幸運を!