pygame使用Surface会崩溃.填充一个超出其边界的矩形和任何非零PYGAME_BLEND标志



当我尝试使用rectspecial_flags参数使用表面的fill时,pygame延迟了几秒钟,然后在没有通知的情况下崩溃,如果我已经命名了逃避表面区域的rect维度。

下面是使用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 ================================
>>>

无论我如何与软件交互或不交互,这个重启都会发生。是否在import pygame之后调用pygame.init()会出现

如果使用的是完全在曲面边界内的rect参数(本例中为(0,0,50,50)),则其功能正常。或者,为special_flags参数省略或发送0不会触发此问题;Surface所包含的像素被改变为正常,任何从边缘"溢出"的像素都被忽略。

我想知道的是是什么导致pygame以这种神秘和无法解释的方式崩溃?

我使用pygame 1.9.1和python 2.7.10.

对于将来遇到同样问题的读者,可以通过至少三种方法中的一种来回避这个问题。我将在这里与你分享:

  • 使用剪辑的rect参数

test_surf.get_rect().clip(test_rect)替换fill中的rect参数。clip将把test_rect约束在目标曲面的边界上;如果没有共同像素,它将返回一个形状参数为<0, 0, 0, 0>的安全矩形。

  • 使用第二曲面和blit代替

    创建一个新的表面,用你想要的rgb值填充它(不包括alpha),不使用BLEND模式,使用set_alpha将所需的不透明度应用到表面,最后使用blit将新表面应用到test_surf,或者任何你的目标,使用适当的dest值(在我的情况下,(33,33))和BLEND模式(对我来说,pygame.BLEND_RBGA_MULT)。

  • 以虫斗虫

    第三个也是更令人费解的解决方案是在运行越界rect之前调用test_surf.fill(test_rgba, (0,0,0,0), pygame.BLEND_RGBA_MULT) .无论这做什么,似乎都可以以这样一种方式修复pygame,您可以安全地在随后的混合填充中越界而没有麻烦。此外,在之后的任何表面上尝试越界,混合填充似乎是安全的,无论零像素的blend -fill做什么,似乎都纠正了pygame中的功能失调元素,因此在该会话中不会再次发生崩溃。

    请注意,第三个解决方案尚未经过彻底测试!!

最新更新