当我尝试使用rect
和special_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中的功能失调元素,因此在该会话中不会再次发生崩溃。请注意,第三个解决方案尚未经过彻底测试!!