0

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 番目のソリューションは十分にテストされていないことに注意してください!!

幸運を!

4

0 に答える 0