0

当我尝试同时使用和参数fill与 Surface一起使用时,pygame 会滞后几秒钟,然后在没有通知的情况下崩溃,如果我命名了逃离 Surface 区域的矩形尺寸。rectspecial_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 中功能失调的元素,以便该会话不会再次发生崩溃。

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

祝你好运!

4

0 回答 0