前言
版权声明:本文为本博主在CSDN的原创文章搬运而来,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_72543266/article/details/132640084
经过几个月的学习,自己也有了一些学习python的经验,想通过几个稍微大一点的项目的来对自己的开发能力进行训练和评估,从今天继续进行学习和练习Python编程从入门到实践这本书里面的项目。本项目中,自己会对项目中使用的一些方法和构造进行解读,自己学会就是自己的东西。
思维导图
1,重构:模块 game_functions
在大型项目中,经常需要在添加新代码前重构既有代码。重构旨在简化既有代码的结构,使其更容易扩展。在本节中,我们将创建一个名为game_functions的新模块,它将存储大量让游戏 《外星人入侵》运行的函数。通过创建模块game_functions,可alien_invasion.py太长,并使 其逻辑更容易理解。这里我们会通过重构函数,并将之前写的一些代码放入函数中,方便对代码和游戏进行管理.
2,创建game_functions.py 文件
2.1,导入模块
import sys import pygame
2.2,进行退出游戏事件转移
然后我们将alien_invasion.py文件中控制游戏退出的代码剪切过来
# 定义监查事件函数 def check_events(): """响应按键和鼠标事件""" # 监听键盘和鼠标事件 for event in pygame.event.get(): # 使用方法pygame.event.get()。所有键盘和鼠标事件都将促使for循环运行 if event.type == pygame.QUIT: # 如果玩家单机游戏窗口关闭按钮,则将检测到pygame.QUIT事件 sys.exit() # 监测到事件后,退出游戏
2.3,修改alien_invasion.py文件
2.3.1,导入模块
import game_functions as gf # 导入game_functions模块
在 alien_invasion.py文件中导入模块,方便对退出游戏函数的调用
2.3.2,调用函数
gf.check_events() # 调用gf.模块中的check_events()函数
在之前剪切代码的位置进行函数的调用
2.4,在game_functions.py文件中创建函数 update_screen()
为进一步简化run_game(),下面将更新屏幕的代码移到一个名为update_screen()的函数中, 并将这个函数放在模块game_functions.py中:
2.4.1,创建update_screen() 函数
注意需要包含三个参数,分别是控制屏幕颜色的,飞船和显示窗口的screen
def update_screen(S_settings, screen, ship):
2.4.2,将游戏背景,飞船等事件代码转移
将while部分剩余部分的代码剪切过来
# 每次循环时都重绘屏幕 screen.fill(S_settings.bg_color) ship.blitme() # 调用ship.blitme()将飞船绘制到屏幕上 # 让最近绘制的屏幕可见 pygame.display.flip() """命令Pygame让最近绘制的屏幕可见。在这里,它在每次执行while循环时都绘制一个空屏幕,并擦去旧屏幕,使得只有新屏幕可见。在我们移动游戏元 素时,pygame.display.flip()将不断更新屏幕,以显示元素的新位置,并在原来的位置隐藏元素,从而营造平滑移动的效果。"""
2.4.3, 调用函数
这里因为上面导入过模块了,所以只需要将模块调用一下即可.
gf.update_screen(S_settings, screen, ship) # 调用gf.模块中的update_screen()函数
3,飞船移动
下面来让玩家能够左右移动飞船。我们将编写代码,在用户按左或右箭头键时作出响应。我们将首先专注于向右移动,再使用同样的原理来控制向左移动。通过下面的操作来学习如何控制屏幕图像的移动.
3.1,按键响应
3.1.1,修改game_functions.py文件
玩家按键时,都将在Pygame中触发一个事件。事件都是通过方法pygame.event.get()获取的,因此在函数check_events()中,我们需要指定要检查哪些类型的事件。
我们每次按建都会注册一个KEYDOWN事件.当监测到为一个KEYDOWN事件。如果我们按的是右键,那么,我们就增大飞船的rect.centerx值,将飞船向右移动:这里我们需要给检查事件的函数传入一个ship参数,因为按键影响的是飞船的参数
def check_events(ship):
elif event.type == pygame.KEYDOWN: # 如果事件为KEYDOWN事件 if event.key == pygame.K_RIGHT: # 如果是游戏的特定键 # 向右移动飞船 ship.rect.centerx += 1
3.1.2,修改alien_invasion.py文件
既然给传入check_events(ship):传入了ship参数,那么必须要给控制游戏运行的函数传参
gf.check_events(ship) # 调用gf.模块中的check_events()函数
3.2,允许不断移动
3.2.1,设计思路
玩家按住右箭头键不放时,我们让飞船不断地向右移动,直到玩家松开为止。我们将让游戏检测pygame.KEYUP事件,以便玩家松开右箭头键时我们能够知道;
然后,我们将结合使 用KEYDOWN和KEYUP事件,以及一个名为moving_right的标志来实现持续移动。 飞船不动时,标志moving_right将为False。玩家按下右箭头键时,我们将这个标志设置为
True;而玩家松开时,我们将这个标志重新设置为False。
3.2.2,思路实现
3.2.2.1,修改ship.py文件
修改ship.py文件中的代码,增加了移动标志,和update函数,我们先定义移动标志为False在初次运行代码时,初始定义,并定义了移动函数,移动函数中的代码为从上一步3.1.1中移动的地方剪切而来.因后面会对那一部分进行修改.
# 移动标志 self.moving_right = False # 因为飞船初始为不动的状态,所以直接设置为false def update(self): """根据移动标志调整飞船的位置""" if self.moving_right: # 当飞船事件为True时飞船移动 self.rect.centerx += 1
编辑
3.2.2.2,修改game_functions.py文件
这里,我们因为先将修改过的地方,加上按下右键会将初始设置的False改为True.并且增加了监测响应松开按键的事件,并且松开的是右键时,又会设置为False.
ship.moving_right = True # 按下右键件后将moving_right设置为True # 监测是否松开键 elif event.type == pygame.KEYUP: # 响应KEYUP事件 if event.key == pygame.K_RIGHT: # 如果是松开键,并且松开的是右键 ship.moving_right = False # 松开右键后将moving_right设置为False
3.2.3,修改alien_invasion.py文件调用函数
最后,我们需要修改alien_invasion.py中的while循环,以便每次执行循环时都调用飞船的方法update()
ship.update() # 飞船移动
这里我们将调用的函数放在,更改屏幕之前的作用:飞船的位置将在检测到键盘事件后(但在更新屏幕前)更新。这样,玩家输入时,飞船的位置将更新,从而确保使用更新后的位置将飞船绘制到屏幕上。
3.3,制作效果展示
第一次,没有设置不断移动前,做到3.1按键响应那里:我们按一次右键只会移动图中圈1一小方块.增加了不断移动后:我们可以移动圈2 那么一大块位置.
4,总结
本文章主要是对前面写的一些代码的重构,方便对后续越来越多功能,与代码的简化,为后续代码的进一步管理提供了便利.也增加了飞船向右移动的功能,并增加了按着按键不动,飞船会一直向右移动,使得游戏更加合理,总的来说都是对我在项目制作过程中的一种思路的培养,使我对于项目开发的流程有了更加清晰的了解.
每日一言
如果你能在浪费时间中获得乐趣,就不算浪费时间。