当我尝试使用fill
和rect
参数同时使用Surface special_flags
时,pygame会滞后几秒钟,然后在没有通知的情况下崩溃,如果我已经命名了rect尺寸逃离了Surface的区域。
以下是使用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
,都会发生这种情况。
如果使用完全在表面边界内的rect参数(在本例中为(0,0,50,50)
),则它正常运行。或者,省略或发送0
special_flags
参数不会触发此问题; Surface中包含的像素将正常更改,并且忽略任何“溢出”边缘的像素。
我想知道的是导致pygame以这种神秘且无法解释的方式崩溃的原因是什么?
我正在使用pygame 1.9.1和python 2.7.10。
解决方案
对于也遇到这个问题的未来读者来说,问题可以通过至少三种方式中的一种来回避。我会在这里与你分享:
使用剪切的rect
参数。
用fill
替换test_surf.get_rect().clip(test_rect)
中的rect参数。 clip
会将test_rect
约束到目标Surface的边界;如果没有常见像素,则会返回形状参数为<0, 0, 0, 0>
的安全矩形。
使用第二个曲面而不是blit
。
创建一个新的Surface,使用你想要的rgb值(不包括alpha)填充它,而不使用BLEND模式,使用set_alpha
将所需的不透明度应用于Surface,最后blit
新的使用相应的test_surf
值(在我的情况下为dest
)和BLEND模式(对我来说,(33,33)
),表面到pygame.BLEND_RBGA_MULT
或任何目标。
与错误斗争。
第三个更令人费解的解决方案是在运行超出界限之前调用test_surf.fill(test_rgba, (0,0,0,0), pygame.BLEND_RGBA_MULT)
。无论这样做是什么似乎以这样的方式修复pygame,你可以安全地走出界限与后续的BLENDed填充没有麻烦。此外,尝试越界,BLENDed填充任何Surface后来似乎是安全的,无论零像素BLENDed-fill做什么似乎纠正pygame中的功能失调元素,以便崩溃不再发生该会议。
请注意,此第三个解决方案尚未经过全面测试!!