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