外星人入侵之武装飞船(3)

简介: 经过几个月的学习,自己也有了一些学习python的经验,想通过几个稍微大一点的项目的来对自己的开发能力进行训练和评估,从今天继续进行学习和练习Python编程从入门到实践这本书里面的项目。本项目中,自己会对项目中使用的一些方法和构造进行解读,自己学会就是自己的东西。本文章主要是对前面写的一些代码的重构,方便对后续越来越多功能,与代码的简化,为后续代码的进一步管理提供了便利.也增加了飞船向右移动的功能,并增加了按着按键不动,飞船会一直向右移动,使得游戏更加合理,总的来说都是对我在项目制作过程中的一种思路的培养,使我对于项目开发的流程有了更加清晰的了解.

前言


版权声明:本文为本博主在CSDN的原创文章搬运而来,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。                            

原文链接:https://blog.csdn.net/weixin_72543266/article/details/132640084


 经过几个月的学习,自己也有了一些学习python的经验,想通过几个稍微大一点的项目的来对自己的开发能力进行训练和评估,从今天继续进行学习和练习Python编程从入门到实践这本书里面的项目。本项目中,自己会对项目中使用的一些方法和构造进行解读,自己学会就是自己的东西。


思维导图

image.gif


1,重构:模块 game_functions

在大型项目中,经常需要在添加新代码前重构既有代码。重构旨在简化既有代码的结构,使其更容易扩展。在本节中,我们将创建一个名为game_functions的新模块,它将存储大量让游戏 《外星人入侵》运行的函数。通过创建模块game_functions,可alien_invasion.py太长,并使 其逻辑更容易理解。这里我们会通过重构函数,并将之前写的一些代码放入函数中,方便对代码和游戏进行管理.


2,创建game_functions.py 文件

2.1,导入模块

import sys
import pygame

image.gif

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()  # 监测到事件后,退出游戏

image.gif

2.3,修改alien_invasion.py文件

2.3.1,导入模块

import game_functions as gf  # 导入game_functions模块

image.gif

alien_invasion.py文件中导入模块,方便对退出游戏函数的调用

2.3.2,调用函数

gf.check_events()  # 调用gf.模块中的check_events()函数

image.gif

image.gif

在之前剪切代码的位置进行函数的调用  

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):

image.gif

2.4.2,将游戏背景,飞船等事件代码转移

将while部分剩余部分的代码剪切过来

# 每次循环时都重绘屏幕
    screen.fill(S_settings.bg_color)
    ship.blitme()  # 调用ship.blitme()将飞船绘制到屏幕上
    # 让最近绘制的屏幕可见
    pygame.display.flip()
    """命令Pygame让最近绘制的屏幕可见。在这里,它在每次执行while循环时都绘制一个空屏幕,并擦去旧屏幕,使得只有新屏幕可见。在我们移动游戏元
素时,pygame.display.flip()将不断更新屏幕,以显示元素的新位置,并在原来的位置隐藏元素,从而营造平滑移动的效果。"""

image.gif

2.4.3, 调用函数

这里因为上面导入过模块了,所以只需要将模块调用一下即可.

gf.update_screen(S_settings, screen, ship)  # 调用gf.模块中的update_screen()函数

image.gif

image.gif

3,飞船移动

下面来让玩家能够左右移动飞船。我们将编写代码,在用户按左或右箭头键时作出响应。我们将首先专注于向右移动,再使用同样的原理来控制向左移动。通过下面的操作来学习如何控制屏幕图像的移动.

3.1,按键响应

3.1.1,修改game_functions.py文件

玩家按键时,都将在Pygame中触发一个事件。事件都是通过方法pygame.event.get()获取的,因此在函数check_events()中,我们需要指定要检查哪些类型的事件。

我们每次按建都会注册一个KEYDOWN事件.当监测到为一个KEYDOWN事件。如果我们按的是右键,那么,我们就增大飞船的rect.centerx值,将飞船向右移动:这里我们需要给检查事件的函数传入一个ship参数,因为按键影响的是飞船的参数

def check_events(ship):

image.gif

elif event.type == pygame.KEYDOWN:   # 如果事件为KEYDOWN事件
            if event.key == pygame.K_RIGHT:  # 如果是游戏的特定键
                # 向右移动飞船
                ship.rect.centerx += 1

image.gif

3.1.2,修改alien_invasion.py文件

既然给传入check_events(ship):传入了ship参数,那么必须要给控制游戏运行的函数传参

gf.check_events(ship)  # 调用gf.模块中的check_events()函数

image.gif

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

image.gif

image.gif 编辑

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

image.gif

3.2.3,修改alien_invasion.py文件调用函数

最后,我们需要修改alien_invasion.py中的while循环,以便每次执行循环时都调用飞船的方法update()

ship.update()  # 飞船移动

image.gif

这里我们将调用的函数放在,更改屏幕之前的作用:飞船的位置将在检测到键盘事件后(但在更新屏幕前)更新。这样,玩家输入时,飞船的位置将更新,从而确保使用更新后的位置将飞船绘制到屏幕上。

image.gif

3.3,制作效果展示

第一次,没有设置不断移动前,做到3.1按键响应那里:我们按一次右键只会移动图中圈1一小方块.增加了不断移动后:我们可以移动圈2 那么一大块位置.

image.gif

4,总结

本文章主要是对前面写的一些代码的重构,方便对后续越来越多功能,与代码的简化,为后续代码的进一步管理提供了便利.也增加了飞船向右移动的功能,并增加了按着按键不动,飞船会一直向右移动,使得游戏更加合理,总的来说都是对我在项目制作过程中的一种思路的培养,使我对于项目开发的流程有了更加清晰的了解.


每日一言

如果你能在浪费时间中获得乐趣,就不算浪费时间。


相关文章
|
缓存 JavaScript 前端开发
同步加载、异步加载、延迟加载、预加载的区别
同步加载、异步加载、延迟加载、预加载的区别
390 0
|
IDE 测试技术 项目管理
集成开发环境(IDE)的使用:提升Visual Basic开发效率的工具和技巧
【4月更文挑战第27天】本文探讨了如何使用Visual Basic IDE提升开发效率,包括理解IDE组件、利用代码编辑器的智能功能、通过界面设计器设计GUI、使用调试和测试工具、有效管理项目与版本控制、掌握快捷键和宏、定制IDE以及利用学习资源。通过充分利用这些工具和技巧,开发者能更快地编写高质量代码,高效管理项目,从而提升整体开发效率。随着IDE的持续发展,开发者应不断学习新特性以适应进步。
348 1
|
编解码 网络协议 开发工具
Android平台如何实现多路低延迟RTSP|RTMP播放?
本文档详细介绍了大牛直播SDK在Android平台上实现RTSP与RTMP流媒体播放及录像功能的技术细节。早在2015年,SDK的第一版就已经支持了多实例播放,并且通过简单的实例封装就能轻松实现。文档中提供了代码示例,展示了如何开启播放、停止播放以及开始和停止录像等功能。此外,SDK还提供了丰富的配置选项,例如设置录像目录、文件大小限制、转码选项等。总结部分列出了该SDK的关键特性,包括但不限于高稳定性和低延迟的播放能力、多实例支持、事件回调、硬解码支持、网络状态监控以及复杂的网络环境处理等。这些功能使得SDK能够应对各种应用场景,特别是在对延迟和稳定性有极高要求的情况下表现优异。
298 5
|
SQL druid Java
解决 ‘The last packet successfully received from the server was xxx milliseconds ago‘ 问题
解决 ‘The last packet successfully received from the server was xxx milliseconds ago‘ 问题
6433 0
|
弹性计算 Serverless 持续交付
聊聊如何把项目从Gitee部署到阿里云上
【7月更文挑战第11天】聊聊如何把项目从Gitee部署到阿里云上
566 1
|
JSON API 数据格式
Python测试架构requests-mock
【4月更文挑战第19天】
234 1
|
机器学习/深度学习 数据处理 调度
人像分割PaddlePaddle
人像分割PaddlePaddle
230 0
|
编译器 C++
VS编译器更换背景壁纸逐步图示教程
VS编译器更换背景壁纸逐步图示教程
287 1
|
小程序 JavaScript 前端开发
【原力计划小程序】1、一篇文章深入了解小程序的学习路线(以项目驱动的方式带你学习微信小程序)
【原力计划小程序】1、一篇文章深入了解小程序的学习路线(以项目驱动的方式带你学习微信小程序)
279 1
|
JavaScript 前端开发 网络架构
函数柯里化:JavaScript中的高级技巧
函数柯里化:JavaScript中的高级技巧