Pygame不绘图

0 投票
1 回答
840 浏览
提问于 2025-04-16 07:23

我在做一个程序,需要一些帮助。这个程序是康威生命游戏的一个版本。现在这个游戏由三个文件组成:main.py、cellBoard.py 和 cell.py。

main.py 负责创建 cellBoard,并让它更新数据、接收鼠标输入,还要告诉它怎么绘制自己(它会得到一个 pygame 的表面实例,这个实例会处理实际绘制的细胞)。

cellBoard.py 根据细胞的大小和屏幕的大小创建一个细胞列表,以便正确填充。这个列表是一个二维列表。当它创建细胞时,会设置它们的状态(当前是活着的),并给它们一个原始表面实例的引用。

cell.py 包含了细胞可以做的所有事情:死亡、存活、切换状态和绘制。

实际上,当我需要绘制整个棋盘时,只需调用 cellBoard 的 draw() 方法,它会负责调用每个细胞的 draw 方法。它确实能做到这一点。执行到应该绘制细胞的地方(我用打印语句检查过),像素填充的函数也会执行(用一个循环来覆盖区域)。但是,屏幕上什么都没有被绘制出来,或者说至少看不见。

我不知道是什么导致了这个问题。我检查了代码很多次,甚至从头开始重写了整个程序,让它更整洁(但我遇到的问题和现在一样)。

是什么导致了这个问题呢?我猜可能是细胞的表面实例出了问题,因为它在到达每个细胞之前要经过 cellBoard,这会是问题吗?

这是源代码(所有三个文件都很短,结构简单,应该容易阅读) http://dl.dropbox.com/u/2951174/src.zip

非常感谢任何愿意提供帮助的人。我需要尽快完成这个项目,所以你的帮助将不胜感激。

1 个回答

6

首先给个小建议:
如果你不想让别人下载一个压缩文件,下一次就直接把你怀疑有问题的代码部分发出来,这样大家更愿意帮你。

不过,问题似乎出在你的主循环里:

#Keyboard events
events = pygame.event.get()
for event in events:
    if event.type == pygame.QUIT:
        running = 0

#Mouse events
#todo

#Grid update  <------- here you update the grid and the cells are being drawn
cb.draw()

#Graphical output    <------------ here you're filling the WHOLE screen with white
screen.fill(THECOLORS["white"])    

pygame.display.flip()

你需要把 screen.fill 这行代码放到 cb.draw 之前,这样就不会把格子画覆盖掉。

还有在 cell.py 里,你的绘图代码 A) 有问题,B) 也不好。

与其一个一个像素去设置,这样速度慢,而且现在的状态下也不能正确画出格子,不如直接画个矩形:

pygame.draw.rect(self.surface, (100, 10, 10), (self.pos[0], self.pos[1], self.size, self.size))

撰写回答