pygame使用Surface.fill崩溃,其中rect超出其范围,任何非零PYGAME_BLEND标志

时间:2016-09-22 02:19:33

标签: python graphics crash pygame pygame-surface

当我尝试使用fillrect参数同时使用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中的功能失调元素,以便崩溃不再发生该会议。

    请注意,此第三个解决方案尚未经过全面测试!!

祝你好运!

0 个答案:

没有答案