![零基础入门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=1739251839-qTdNmx9WIcJ3f0Jm8PmGBIYzIgTSRZ97-0-7dc8705d624e640dd8335c1a815aea57)
在该模块中,我们定义了一个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=1739251839-ihuYOj3KUPpFgfeYSTefiEM563pM1nOK-0-5402a5ac7238e88332a5345e3b0b1935)
图3-8 背景图片
![](https://epubservercos.yuewen.com/31D206/23721606009501206/epubprivate/OEBPS/Images/Figure-P91_3043.jpg?sign=1739251839-jZkRgXpbdc6ei9JdfjsRqJ7BYEZkcxyi-0-05fb8ca40a2198b25cb860fa60374439)
图3-9 子弹图片
Image.heros:我机surface列表,如图3-10所示。
![](https://epubservercos.yuewen.com/31D206/23721606009501206/epubprivate/OEBPS/Images/Figure-P91_3047.jpg?sign=1739251839-qAQDI5QIagWN5d8RvQAsyErDsAHjwB0h-0-6dd8c2066ea2e0df9f5f5d8dc26aff15)
图3-10 我方飞机图片
Image.small_enemies:小敌机surface列表,如图3-11所示。
![](https://epubservercos.yuewen.com/31D206/23721606009501206/epubprivate/OEBPS/Images/Figure-P92_3056.jpg?sign=1739251839-7QVw2dbMPlNtRviXcNDw3ccaJqkQEuzw-0-b4a32f33dd82ba6a73eb11ec87f28b90)
图3-11 小敌机图片
Image.mid_enemies:中敌机surface列表,如图3-12所示。
![](https://epubservercos.yuewen.com/31D206/23721606009501206/epubprivate/OEBPS/Images/Figure-P92_3060.jpg?sign=1739251839-p0AsGEWDUtAx8xmvzwlInG3AgTSmFR1N-0-d316e718f9da146525cf958a9a43fdf6)
图3-12 中敌机图片
Image.big_enemies:大敌机surface列表,如图3-13所示。
![](https://epubservercos.yuewen.com/31D206/23721606009501206/epubprivate/OEBPS/Images/Figure-P92_3064.jpg?sign=1739251839-aX0AF83cnoAc541I6DOnVC2xvyYHfTAp-0-ee41c7e7932522f0d15b46f740b3527c)
图3-13 大敌机图片
Image.Logo:Logo surface,如图3-14所示。
![](https://epubservercos.yuewen.com/31D206/23721606009501206/epubprivate/OEBPS/Images/Figure-P92_3068.jpg?sign=1739251839-exo18sQVQLA4sld2t3FOkukgg32eyjE9-0-69bc88b980758fad275c2451a084ed7b)
图3-14 Logo图片
Image.pause_resume:暂停/恢复按钮surface列表,如图3-15所示。
![](https://epubservercos.yuewen.com/31D206/23721606009501206/epubprivate/OEBPS/Images/Figure-P92_3072.jpg?sign=1739251839-aCNiBOIh4B086SehHTiuQ0I093u5qiGW-0-be1b7d5e94715f26e545b01311400ea0)
图3-15 暂停/恢复按钮图片
现在,我们已经把本游戏需要的所有图片都准备好了,在后面使用时直接通过“类名.变量名”调用即可,如Image.logo。同时,通过上面的一些图片也可以看出,游戏的动画效果一部分是通过快速替换图片实现的,如飞机的爆炸效果,这一点将在后面具体实现时详细介绍。