2.15 pygame.PixelArray对象
遗憾的是没有单个的函数可以调用来设置一个单个像素的颜色(除非你使用相同的起点和终点来调用pygame.draw.line())1。在向一个Surface对象绘制之前和之后,Pygame框架需要在幕后运行一些代码。如果它必须针对想要设置的每一个像素来做这些事情,程序将会运行得慢很多(根据我的快速测试,用这种方式绘制像素,所需时间会是原来的两到三倍)。
相反,应该创建一个Surface对象的pygame.PixelArray对象(我们后面将其简称为PixelArray对象)。创建一个Surface对象的PixelArray对象,将会“锁定”该Surface对象。而当一个Surface对象锁定的时候,仍然能够在其上调用绘制函数,但是,不能够使用blit()方法在其上绘制诸如PNG或JPG这样的图像(本章稍后将会介绍blit()方法)。
如果想要查看一个Surface对象是否锁定了,使用get_locked()方法,如果它锁定了,Surface的get_locked()方法将会返回True,否则的话,返回False。
由pygame.PixelArray()返回的PixelArray对象,可以通过两个索引来访问,从而设置单个的像素。例如,第28行的pixObj480 = BLACK将会把X 坐标为480、Y 坐标为380的点设置为黑色(别忘了,BLACK变量存储的颜色元组是(0, 0, 0))。
要告诉Pygame已经完成了单个像素的绘制,用一条del语句删除掉PixelArray对象,这就是第33行所做的事情。删除PixelArray对象,将会“解锁”Surface对象,以便你可以再次在其上绘制图像。如果忘记了删除PixelArray对象,下一次尝试将一幅图像复制,即绘制到Surface上的时候,程序会导致一条如下所示的错误“pygame.error: Surfaces must not be locked during blit”。