![零基础入门Python游戏](https://wfqqreader-1252317822.image.myqcloud.com/cover/70/44510070/b_44510070.jpg)
3.6 加载图片
由于本游戏程序需要用到许多图片,所以为了方便管理,我们把所有图片的加载都统一放到一个模块中,即image.py。
现在,在source目录下新建另一个py文件,命名为image.py,它的定义如下:
image.py
![](https://epubservercos.yuewen.com/31D206/23721606009501206/epubprivate/OEBPS/Images/Figure-P90_10386.jpg?sign=1739055487-ZG1lTjL3TFB7teABJZnTJGEN2TdiRnTR-0-090c541f3963f51bc6543bead43b3752)
在该模块中,我们定义了一个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所示。
![](https://epubservercos.yuewen.com/31D206/23721606009501206/epubprivate/OEBPS/Images/Figure-P91_3040.jpg?sign=1739055487-BZfkFO83vfHsavNokwCjbvLYTfqnuuZp-0-018d77cca3250d11f836750f59257913)
图3-8 背景图片
![](https://epubservercos.yuewen.com/31D206/23721606009501206/epubprivate/OEBPS/Images/Figure-P91_3043.jpg?sign=1739055487-Dvii6KWNUvr2Wq0fPYhR7xK1XLSXFdRk-0-1855078bb132f60893ef0340f66bd7ae)
图3-9 子弹图片
Image.heros:我机surface列表,如图3-10所示。
![](https://epubservercos.yuewen.com/31D206/23721606009501206/epubprivate/OEBPS/Images/Figure-P91_3047.jpg?sign=1739055487-tEmQyliVOlPgnV2lPInSRSPVKwby9BYk-0-7a8911020dd0fa4c953db3007bbda6aa)
图3-10 我方飞机图片
Image.small_enemies:小敌机surface列表,如图3-11所示。
![](https://epubservercos.yuewen.com/31D206/23721606009501206/epubprivate/OEBPS/Images/Figure-P92_3056.jpg?sign=1739055487-Ien5n8HW6GUM9mmofFH11MPK1tcbdyLO-0-a4df87420ba8027732241b324e527430)
图3-11 小敌机图片
Image.mid_enemies:中敌机surface列表,如图3-12所示。
![](https://epubservercos.yuewen.com/31D206/23721606009501206/epubprivate/OEBPS/Images/Figure-P92_3060.jpg?sign=1739055487-FNKa8pvJAcSJH3sd6sh0xvV2g1haB4uS-0-d54ea404d9cb61cfed2daf224452e24c)
图3-12 中敌机图片
Image.big_enemies:大敌机surface列表,如图3-13所示。
![](https://epubservercos.yuewen.com/31D206/23721606009501206/epubprivate/OEBPS/Images/Figure-P92_3064.jpg?sign=1739055487-LpLK9mq59dv6AX5bS2gMbcHkGws8NQcE-0-c90a3e46c03b493f10eddf7a639bb516)
图3-13 大敌机图片
Image.Logo:Logo surface,如图3-14所示。
![](https://epubservercos.yuewen.com/31D206/23721606009501206/epubprivate/OEBPS/Images/Figure-P92_3068.jpg?sign=1739055487-ijzcLW3faousVgPUMji1kWLRme0Cm5Fo-0-d1595ecc107c07484f2c4635491980a4)
图3-14 Logo图片
Image.pause_resume:暂停/恢复按钮surface列表,如图3-15所示。
![](https://epubservercos.yuewen.com/31D206/23721606009501206/epubprivate/OEBPS/Images/Figure-P92_3072.jpg?sign=1739055487-jDzMLc6phTKmlmzoV0y3MFUcdwZPeaz3-0-b6b90bd572e42de223ee35d4427f15e0)
图3-15 暂停/恢复按钮图片
现在,我们已经把本游戏需要的所有图片都准备好了,在后面使用时直接通过“类名.变量名”调用即可,如Image.logo。同时,通过上面的一些图片也可以看出,游戏的动画效果一部分是通过快速替换图片实现的,如飞机的爆炸效果,这一点将在后面具体实现时详细介绍。