在pygame中blit子表面时因子表面锁定而导致错误

5 投票
2 回答
3436 浏览
提问于 2025-04-16 06:42

这里有一个简单的脚本,可以用来复现这个问题。

#!/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 个回答

1

可能是在进行图像复制的时候出现了锁定问题。你正在把一个图像区域复制到它自己上面,这就是你遇到错误的原因。

如果你想把屏幕的一半复制到另一半,可以先用“.copy”命令复制那个区域,然后再进行图像复制。

3

我之前也遇到过类似的问题,pmoreli说得对。我只是复制了一个子表面,创建了一个新的表面,然后把它显示出来:

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

撰写回答