在Pygame中,使用subsurface进行blit操作时出现错误,提示该subsurface被锁定。

5
这是一个最小化的脚本,可用于复现该问题。
#!/usr/bin/env python
import pygame

screen = pygame.display.set_mode((640, 480))
screen.fill((255, 255, 255))
screen_half = screen.subsurface((0,0, 640/2.0, 480))

print screen.get_locks()
print screen_half.get_locks()
screen_half.blit(screen_half, (0, 0))

输出结果为

()
()
Traceback (most recent call last):
  File "./blit_test.py", line 10, in <module>
    screen_half.blit(screen_half, (0, 0))
pygame.error: Surfaces must not be locked during blit

可以看到,带有锁的元组 screenscreen_half 是空的。如果我使用 screen 而不是 screen_half,则不会出现错误。

2个回答

3

我有类似的问题,pmoreli是对的。我只需复制subsurface创建新的surface,然后将其blit到显示器上:

screen_half = screen_half.copy()
screen_half.blit(screen_half, (0, 0))

太好了!谢谢。我在处理这个疯狂的Pygame错误时遇到了很大的困难!我访问了很多关于这个主题的地方,但没有解决方法。所以这个答案绝对值得得到很多赞(在我的之前只有2个)!不幸的是,最简单和最好的答案并没有得到赏识... - Apostolos

1

可能是在 blit 过程中发生了锁定。

你正在将一个 surface blit 到它自己,这就是为什么会出现错误的原因。

如果你想要将屏幕的一半复制到另一半,你可以使用 ".copy" 函数来创建 subsurface,然后再进行 blit 操作。


但是blit只能在surface上工作,不能在子表面上工作。无论如何,我发现为了我的目的,我应该使用screen_half.scroll()。 - kepkin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接