前言
前两天我们已经成功创建了窗口,并将小蜜蜂放在窗口的最下方中间位置,本来以为今天将学习控制小蜜蜂,结果是重构模块,算了,我们按照书上步骤,一起来学习下。
一、为什么要重构模块
书上说在大型项目中,会经常在添加新代码前重构既有的代码。(咱也没进过大公司,做过大型项目,今天也算体验了一把大型项目的流程),目的是简化代码结构。具体到我们现在做的案例,就是简化alien_invasion文件,把里面写的一些功能,再用一个函数封装起来,然后在alien_invasion里调用,使得alien_invasion看起来更简洁,逻辑更清晰。我们先来看看alien_invasion里面的代码。
import sys import pygame import settings from ship import Ship def run_game(): pygame.init() new_setting=settings.Settings() screen = pygame.display.set_mode((new_setting.screen_width,new_setting.screen_height)) ship = Ship(screen) pygame.display.set_caption("Alien Invasion") while True: for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() screen.fill(new_setting.bg_color) ship.blitme() pygame.display.flip() run_game()
通过观察代码,我们发现,在while循环里主要有两件事,一件事是监听用户操作,另一件事是绘制窗口,那么我们就将这两件事分别封装出去。
二、创建game_functions
没啥好说的,创建一个类,把while循环里面的代码复制过去,然后alien_invasion再调用就行了,我们先写game_functions的代码。
import sys import pygame def check_events(): for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit()
三、创建update_screen()
书上面并没有创建一个 update_screen的新文件,而是在game_functions里定义了update_screen函数,那么game_functions不就复杂了吗?简化了alien_invasion,复杂了game_functions有啥意义。
我们观察上面的代码,screen.fill(new_setting.bg_color),调用了screen和new_setting,ship.blitme()调用了ship,所以我们在创建新的函数的时候,要将这三个作为传参传进去。
def update_screen(new_setting,screen,ship): screen.fill(new_setting.bg_color) ship.blitme() pygame.display.flip()
四、修改alien_invasion模块
现在我们只需要导入game_functions,然后调用里面的函数就行了。
import pygame import settings from ship import Ship import game_functions as gf def run_game(): pygame.init() new_setting=settings.Settings() screen = pygame.display.set_mode((new_setting.screen_width,new_setting.screen_height)) ship = Ship(screen) pygame.display.set_caption("Alien Invasion") while True: gf.check_events() gf.update_screen(new_setting,screen,ship) run_game()
我们来运行一下,看能否成功。
没问题,成功的
五、课后思考
“大蟒蛇”在这里提出了一个问题:“找一个喜欢的游戏角色,放在屏幕中间,然后将屏幕背景色变为图片的背景色,或者将图片的背景色变成屏幕背景色”
看到这个问题,我首先想到的是python可以实现ps的功能?可以吸取颜色,改变背景色?这个其实觉得有可能实现,但是改变图片背景色,那还要抠图,觉得不大可能,本着好学的精神,在网上查询下,可以使用第三方库来改变图片的颜色,至于效果怎么样也就不试了,跟本次案例关系不大,以后有需要再试。但是改变背景色为图片背景色有难度,没有发现提取图片颜色的方式,难道用肉眼看?
总结
今天在游戏的进程上没有突破,但是也体会了大项目的流程。