3.6 加载图片
由于本游戏程序需要用到许多图片,所以为了方便管理,我们把所有图片的加载都统一放到一个模块中,即image.py。
现在,在source目录下新建另一个py文件,命名为image.py,它的定义如下:
image.py
在该模块中,我们定义了一个Image类以管理所有图片的加载。在Image类中,全部的变量都被定义为类属性,这样做的好处是不用实例化Image,通过类名就可以直接访问其中的变量。
在开头执行pygame.init()和pygame.display.set_mode((480,852)),其实并不是为了创建另一个游戏窗口,而是为了获取display surface,以便后面使用convert()或convert_alpha()把图片所在的surface转换为与display surface相同的像素格式,否则在执行import image时,该模块将先于Game类的__init__()函数得到执行,在没有display surface的情况下,执行convert()或convert_alpha()将会出错。可能读者会有疑问,在前面的game模块中,我们已经使用了pygame.init()和pygame.display.set_mode((480,852))创建游戏窗口,这里重复执行一遍相同的代码会不会有什么副作用?答案是没有。一是pygame.init()可以重复调用多次,二是第二次执行pygame.display.set_mode((480,852))时会把之前创建的display surface关掉,这样我们看到的还是在game模块中所创建的游戏窗口,其所在的display surface与这里的display surface拥有相同的像素格式。
由于每帧都要向屏幕(display surface)绘制许多图片,所以在加载图片时非常有必要通过convert()或convert_alpha()把图片surface转换为与display surface相同的像素格式,以此提升屏幕绘制的效率。
再来看代码中关于图片加载的部分。
所有的图片文件都位于工程的res/image/目录下。我们使用pygame.image.load()函数对它们进行加载,加载之后顺便调用convert()或convert_alpha(),返回的将是一个个与display surface有着相同像素格式的图片surface。
下面详细介绍本游戏中用到的所有图片及代表它们的变量。
Image.background:背景surface,如图3-8所示。
Image.bullet:子弹surface,如图3-9所示。
图3-8 背景图片
图3-9 子弹图片
Image.heros:我机surface列表,如图3-10所示。
图3-10 我方飞机图片
Image.small_enemies:小敌机surface列表,如图3-11所示。
图3-11 小敌机图片
Image.mid_enemies:中敌机surface列表,如图3-12所示。
图3-12 中敌机图片
Image.big_enemies:大敌机surface列表,如图3-13所示。
图3-13 大敌机图片
Image.Logo:Logo surface,如图3-14所示。
图3-14 Logo图片
Image.pause_resume:暂停/恢复按钮surface列表,如图3-15所示。
图3-15 暂停/恢复按钮图片
现在,我们已经把本游戏需要的所有图片都准备好了,在后面使用时直接通过“类名.变量名”调用即可,如Image.logo。同时,通过上面的一些图片也可以看出,游戏的动画效果一部分是通过快速替换图片实现的,如飞机的爆炸效果,这一点将在后面具体实现时详细介绍。