2.10 再议屏幕显示
前面已经学习了窗口管理、Surface对象、图片、图形与文字的绘制,尽管它们都与“显示”相关,但涉及的知识却比较杂乱,各自的功能也分布在不同的Pygame模块,对于屏幕的绘制与显示过程,读者可能还没有形成相对清晰的脉络。本节将详细总结Pygame程序的屏幕显示。
图2-10给出了不同对象的绘制与显示过程。
·首先是屏幕窗口,它实际上对应了一个display surface,也称screen surface,所有需要在屏幕上显示的内容,都必须事先绘制在该Surface上。
·在screen surface绘制完毕后,内容并不会自动显示在屏幕上,而是需要执行pygame.display.flip()或pygame.display.update()才可以生效。
·不同的内容对象,其绘制方法也是不同的。
图2-10 Pygame中不同对象的显示过程
♦ 对于颜色填充,只需要调用screen surface对象的fill()方法即可,它可以把整个screen surface区域或部分screen surface区域填充为指定颜色。
♦ 对于简单图形,它调用的是pygame.draw模块下的相关函数,如pygame.draw.line(),把它的第一个参数指定为screen surface即可,绘制其他图形的函数与之类似。
♦ 对于图片图像,首先需要通过pygame.image.load()把图片加载到image surface,然后调用screen surface对象的blit()方法把image surface绘制到screen surface。
♦ 对于文字,首先需要通过一系列方法把文字区域转换为Surface,然后调用screen surface对象的blit()方法,把该Surface绘制到screen surface上,它与图片的绘制类似。
这里必须重点说明一下物体的移动。
在游戏程序中,画面上的物体通常是不断移动的,这也是游戏的基本要求之一,那么应该如何在画面中移动物体呢?Pygame给出的方法其实很简单:不断把物体绘制到屏幕上的不同位置即可。由于绘制的频率较快,再加之人眼的视觉残留效应,因此物体看起来就好像在移动,其原理与早期的动画相同。上面提及的与绘制相关的函数,无论是pygame.Surface.fill()、pygame.Surface.blit()还是pygame.draw.xxx(),它们都提供了可以指定位置的参数,因此物体的移动实现起来比较简单。
最后,提醒读者注意以下几点:
·注意对象的绘制顺序,后绘制的对象会把先绘制的对象覆盖住。
·注意及时清除屏幕,当在循环中不断绘制某个对象时,如果没有及时清除屏幕,则会导致“重影”现象,尤其是在对象移动的情况下;因此在每次重绘时,最好清除屏幕内容,可以利用fill()方法把整个屏幕填充为相同颜色,也可以重绘背景图片,具体方法取决于你的应用场景。
·注意记得调用pygame.display.flip()或者pygame.display.update()更新屏幕,否则屏幕上什么都不会显示。
前面介绍的模块多多少少都是与绘制和显示相关的。除此之外,Pygame中还有一些其他模块,它们与绘制和显示无关,但是也非常重要和常用。