当我尝试同时使用和参数fill
与 Surface一起使用时,pygame 会滞后几秒钟,然后在没有通知的情况下崩溃,如果我命名了逃离 Surface 区域的矩形尺寸。rect
special_flags
下面是使用 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
用替换 rect 参数test_surf.get_rect().clip(test_rect)
。clip
将限制test_rect
在目标 Surface 的边界;如果没有公共像素,它将返回一个带有形状参数的安全矩形<0, 0, 0, 0>
。改为使用第二个表面
blit
。创建一个新的 Surface,用你想要的 rgb 值(不包括 alpha)填充它,而不使用 BLEND 模式,用于
set_alpha
将所需的不透明度应用到 Surface,最后使用适当的值blit
将新表面应用到test_surf
或任何你的目标dest
(在我的情况下,(33,33)
)和混合模式(对我来说,pygame.BLEND_RBGA_MULT
)。与虫子对抗虫子。
第三种更令人费解的解决方案是
test_surf.fill(test_rgba, (0,0,0,0), pygame.BLEND_RGBA_MULT)
在运行越界矩形之前调用。无论这做什么似乎都可以修复 pygame,这样您就可以安全地使用后续的 BLENDed 填充越界而不会遇到麻烦。此外,此后在任何 Surface上尝试越界、混合填充似乎是安全的,并且无论零像素混合填充做什么似乎都可以纠正 pygame 中功能失调的元素,以便该会话不会再次发生崩溃。请注意,这第三种解决方案尚未经过彻底测试!!
祝你好运!