🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
  最近开始学习Python语言,发现Python有一个神奇的Pygame模块,在编写小游戏时显得非常方便,于是参照教学视频编写了一个微信打飞机的小游戏,网上有很多相关的博客,但都不是很详细,大都是直接贴代码,于是决定沉下心来把编写程序的过程记录下来,与大家分享。   首先声明一点,这篇博客完全参照了小甲鱼的《零基础入门学习Python》教学视频,为了尊重原创,特将原作者的视频地址公布如下:[《零基础入门学习Python》](http://blog.fishc.com/category/python "零基础入门学习Python")   Python编译器和Pygame模块的安装网上的教程很多,这里不再赘述,需要强调的一点是,两者之前不仅要求版本一致,所对应操作系统位数也应该一致,例如32位的Pygame模块必须对应32位的Python编译器,我采用的是Python3.4(32位),所用Python的IDE为Pycharm。   在编写游戏的过程中需要用到大量图片和声音资源,如背景图片、背景音乐等,这里将相关资源统一打包,供大家下载:[《微信打飞机图片音效资源》](http://download.csdn.net/detail/u013088062/9250515 "《微信打飞机图片音效资源》")   [Python编写微信打飞机小游戏(一)](http://blog.csdn.net/u013088062/article/details/49705439)   [Python编写微信打飞机小游戏(二)](http://blog.csdn.net/u013088062/article/details/49722387)   [Python编写微信打飞机小游戏(三)](http://blog.csdn.net/u013088062/article/details/49744985)   [Python编写微信打飞机小游戏(四)](http://blog.csdn.net/u013088062/article/details/49766129)   [Python编写微信打飞机小游戏(五)](http://blog.csdn.net/u013088062/article/details/49786277)   [Python编写微信打飞机小游戏(六)](http://blog.csdn.net/u013088062/article/details/49823693)   [Python编写微信打飞机小游戏(七)](http://blog.csdn.net/u013088062/article/details/49834123)   [Python编写微信打飞机小游戏(八)](http://blog.csdn.net/u013088062/article/details/49872089)   [Python编写微信打飞机小游戏(九)](http://blog.csdn.net/u013088062/article/details/49890837)   [Python编写微信打飞机小游戏(十)](http://blog.csdn.net/u013088062/article/details/49893717)   [Python编写微信打飞机小游戏(十一)](http://blog.csdn.net/u013088062/article/details/49904363)   [Python编写微信打飞机小游戏(十二)](http://blog.csdn.net/u013088062/article/details/49907607)   1、导入相关模块。   创建主函数文件,如“mian.py”,在程序开始前将用到的Python模块导入: ~~~ # 导入相关模块 # coding: utf-8 import pygame import sys import tracebackfrom random import * from pygame.locals import * ~~~   这里有几个问题需要解释一下:(1)如果Python不能正常打印中文字符,需要在文件开头加上“# coding: utf-8”来指定对应的编码类型;(2)“sys”为系统模块,“traceback”为Python用来捕获异常的模块,“random”为随机数生成模块,“pygame.locals”则包含了Pygame中的一些固定的标志常量,在下面的程序中将会用到。(3)这里涉及了Python两种导入模块的方式,一种是形如“import pygame”,这种方法表示声明一个模块,如果需要使用其中的元素,应采用“模块名.变量名”的格式;另一种形如“from random import *”,表示将模块中的所有元素全部导入当前工程,在使用时直接使用元素名称即可。   2、加载相关资源   将下载得到的资源(一个image文件夹,一个sound文件夹)放入工程目录下(与mian.py相同的文件夹中),之后在主程序中加载这些资源。在加载之前,需要对pygame的相关功能进行初始化: ~~~ # ==================初始化================== pygame.init() pygame.mixer.init() # 混音器初始化 bg_size = width, height = 480, 852 # 设计背景尺寸 screen = pygame.display.set_mode(bg_size) # 设置背景对话框 pygame.display.set_caption("飞机大战……FishC Demo") background = pygame.image.load("image/background.png") # 加载背景图片,并设置为不透明 ~~~   注意:(1)mixer为pygame模块的声音控制对象(俗称混音器),在涉及到与声音有关的操作时会用到。(2)bg_size取决于背景图片的尺寸   在完成相关初始化后,可以正式的加载背景图片和相关音效了: ~~~ # ==========载入游戏音乐==================== pygame.mixer.music.load("sound/game_music.wav") pygame.mixer.music.set_volume(0.2) bullet_sound = pygame.mixer.Sound("sound/bullet.wav") bullet_sound.set_volume(0.2) big_enemy_flying_sound = pygame.mixer.Sound("sound/big_spaceship_flying.wav") big_enemy_flying_sound.set_volume(0.2) enemy1_down_sound = pygame.mixer.Sound("sound/enemy1_down.wav") enemy1_down_sound.set_volume(0.2) enemy2_down_sound = pygame.mixer.Sound("sound/enemy2_down.wav") enemy2_down_sound.set_volume(0.2) enemy3_down_sound = pygame.mixer.Sound("sound/enemy3_down.wav") enemy3_down_sound.set_volume(0.2) me_down_sound = pygame.mixer.Sound("sound/game_over.wav") me_down_sound.set_volume(0.2) button_down_sound = pygame.mixer.Sound("sound/button.wav") button_down_sound.set_volume(0.2) level_up_sound = pygame.mixer.Sound("sound/achievement.wav") level_up_sound.set_volume(0.2) bomb_sound = pygame.mixer.Sound("sound/use_bomb.wav") bomb_sound.set_volume(0.2) get_bomb_sound = pygame.mixer.Sound("sound/get_bomb.wav") get_bomb_sound.set_volume(0.2) get_bullet_sound = pygame.mixer.Sound("sound/get_double_laser.wav") get_bullet_sound.set_volume(0.2) ~~~   注意,由于pygame音频处理能力有限,在读取音频信息时,需要将音频文件转换成wav格式,普通的MP3格式一般情况下是无法正常读取的,更多pygame有关音频文件的操作可以参考下面的博客:[《Pygame音频操作》](http://www.cnblogs.com/xiaowuyi/archive/2012/06/15/2550338.html "Pygame音频操作")[ ](http://www.cnblogs.com/xiaowuyi/archive/2012/06/15/2550338.html "pygame音频操作")   3、游戏主进程,循环播放背景音乐   在加载完相关资源之后,开始编写游戏的主函数。由于还没有定义相关的模块,这里显示编写一个最简单的框架,让程序能够循环运行起来。 ~~~ if __name__ == '__main__': try: main() except SystemExit: pass except: traceback.print_exc() pygame.quit() input() ~~~   这是Python的主程序入口,如果我们运行main.py文件,程序则自动开始运行。如果只是将main.py作为一个模块import到其他工程中,则不会触发这个函数的运行。注意在这里我们使用了try语句来捕获程序运行时出现的异常,如果main()函数在运行过程中抛出任何异常,除了系统正常退出(SystemExit)的异常外,其他异常都通过“traceback.print_exc()”来打印异常信息,同时调用“pygame.quit()”退出程序。   由于还没有编写其他代码,在此处我们只编写一个最简单的main()函数来保证程序的正常运行,即简单的显示背景图片并循环播放背景音乐: ~~~ def main(): pygame.mixer.music.play(-1) running = True while running: screen.blit(background, (0, 0)) for event in pygame.event.get(): # 响应用户的偶然操作 if event.type == QUIT: # 如果用户按下屏幕上的关闭按钮,触发QUIT事件,程序退出 pygame.quit() sys.exit() pygame.display.flip() ~~~   这里对混音器mixer的成员函数play()赋值为-1代表循环播放该音乐,如果形参为空,则只播放一次该音乐。这里在主程序循环中需要设置用户退出操作,当检测到用户按下界面的关闭按钮时(×),程序将调用pygame.quit()和sys.exit()完成退出。注意如果不设置这个操作,将会导致程序无法正常关闭(一般表现为程序无法响应)。在屏幕绘制方面,Python采用了一种双缓冲的屏幕刷新机制,即先通过blit()函数将一个图片(统称为surface对象)绘制在内存中,最后统一用pygame.display.flip()函数将绘制好的surface对象一次全部刷新到屏幕上。至于什么是surface对象,可以暂时理解为Python世界中的所有的图形图像吧。ok,第一部分就先介绍这些。 [《Python编写微信打飞机小游戏(一)》](http://blog.csdn.net/u013088062/article/details/49705439)