当前位置: 首页 > news >正文

Python学习笔记44:游戏篇之外星人入侵(五)

前言

上一篇文章中,我们成功的设置好了游戏窗口的背景颜色,并且在窗口底部中间位置将飞船加载出来了。

今天,我们将通过代码让飞船移动。

移动飞船

  1. 想要移动飞船,先要明白飞船位置变化的本质是什么。

    通过上一篇文章,我们已经知道了飞船实际上是通过在窗口指定x,y坐标轴位置渲染出的一张外接矩形的图片。外接矩形的图片,就是飞船的"本质",移动飞船的本质,就是移动这张图片。

  2. 怎么移动飞船?

    在理解了移动飞船的本质就是移动图片后,我们要做的就是使用代码,实现图片移动的功能。而图片的渲染是通过图片外接矩形的坐标调用blit函数实现的,所以我们想要移动图片,就要修改飞船图片外接矩形的坐标实现,具体到我们的代码就是通过修改属性self.rect.centerxself.rect.bottom的值,调用blit函数重新加载图片,从而实现图片的移动,展现出飞船移动的效果。

    飞船x,y值变化反馈到飞船移动的方向如下(不要搞混了,窗口左上顶点的坐标是(0,0)):

    • 向右移动x坐标值增加
    • 向左移动x坐标值减少
    • 向上移动y坐标值减少
    • 向下移动y坐标值增加

代码编写

在之前基础模块的编写中,我们已经定义了一个move函数,并且用pass进行占位,那么我们就要对这个函数进行业务代码实现编写。

  1. 首先我们需要定义四个标识字段,这几个字段用于标识飞船当前应该往哪移动。这四个字段属于飞船对象自身的属性。

      # 移动标志self.moving_right = Falseself.moving_left = Falseself.moving_top = Falseself.moving_bottom = False
    
  2. 我们在move函数中通过当前移动标志的值判断应该往哪里移动,并且进行坐标值的修改。

    def move(self):"""移动飞船"""if self.moving_right:self.rect.centerx += 1if self.moving_left:self.rect.centerx -= 1if self.moving_top:self.rect.bottom -= 1if self.moving_bottom:self.rect.bottom += 1
    
  3. 函数修改好以后,我们需要处理监听事件中按键相关的时候。我们按下对应的方向键按钮以后,需要将对应方向移动标识设置与True,弹起按键时设置移动标识为False。

    def check_event(ship):for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()elif event.type == pygame.KEYDOWN:if event.key == pygame.K_RIGHT:ship.moving_right = Trueelif event.key == pygame.K_LEFT:ship.moving_left = Trueelif event.key == pygame.K_UP:ship.moving_top = Trueelif event.key == pygame.K_DOWN:ship.moving_bottom = Trueelif event.key == pygame.K_q:pygame.quit()elif event.type == pygame.KEYUP:if event.key == pygame.K_RIGHT:ship.moving_right = Falseelif event.key == pygame.K_LEFT:ship.moving_left = Falseelif event.key == pygame.K_UP:ship.moving_top = Falseelif event.key == pygame.K_DOWN:ship.moving_bottom = False
    
  4. 在监听事件之后,屏幕更新之前,调用飞船的move函数。

    def run_game():"""启动游戏"""# 初始化pygamepygame.init()# 定义一个系统设置对象setting = Setting()# 新建窗口screen = pygame.display.set_mode((setting.screen_width, setting.screen_height))# 窗口命名pygame.display.set_caption(setting.caption)# 定义一个飞船对象ship = Ship(setting, screen)while True:# 处理监听事件gf.check_event(ship)# 移动飞船ship.move()# 刷新屏幕gf.update_screen(setting, screen, ship)if __name__ == '__main__':run_game()
    

这个时候只要你启动服务,按下方向键,你就可以自由的的控制你的飞船了。

在这里插入图片描述

边界问题

当你正开始的移动你的飞船的时候,你会突然发现:
在这里插入图片描述

实际上,是你的飞船越过了窗口的边界,导致你的飞船消失不见了。因为pygame所有图形和游戏逻辑都将基于这个窗口大小进行计算和渲染。

这个问题怎么解决呢?很简单,在飞船移动的函数中定义,超过边界不允许移动。

优化代码如下:

def move(self):"""移动飞船"""if self.moving_right and self.rect.right < self.screen_rect.right:self.rect.centerx += 1if self.moving_left and self.rect.left > self.screen_rect.left:self.rect.centerx -= 1if self.moving_top and self.rect.top > self.screen_rect.top:self.rect.bottom -= 1if self.moving_bottom and self.rect.bottom < self.screen_rect.bottom:self.rect.bottom += 1

代码中的修改就是对修改坐标的条件增加了一个对应方向的限制。
代码解释如下:

  • 向右移动时,飞船的边界要在游戏窗口的边界边才运行飞船向右移动
  • 向左移动时,飞船的边界要在游戏窗口的边界边才运行飞船向左移动
  • 向上移动时,飞船的边界要在游戏窗口的边界边才运行飞船向左移动
  • 向下移动时,飞船的边界要在游戏窗口的边界边才运行飞船向左移动

重新启动,你就会发现你的飞船在窗口边界不会再移动了。

在这里插入图片描述

结尾

那么到目前为止,我们的飞船已经可以在游戏窗口内自由的移动了。

接下来就准备就让我们的飞船发射子弹。

相关文章:

Python学习笔记44:游戏篇之外星人入侵(五)

前言 上一篇文章中&#xff0c;我们成功的设置好了游戏窗口的背景颜色&#xff0c;并且在窗口底部中间位置将飞船加载出来了。 今天&#xff0c;我们将通过代码让飞船移动。 移动飞船 想要移动飞船&#xff0c;先要明白飞船位置变化的本质是什么。 通过上一篇文章&#xff0…...

export在linux中的作用

在某些项目中常常使用export命令。该命令的作用是设置环境变量&#xff0c;并且该环境变量为当前shell进程与其启动的子进程共享。 export MODEL_NAME"stable-diffusion-v1-4"比如以上命令&#xff0c;如果不采用export&#xff0c;设置的变量仅在当前shell命令/进程…...

FFmpeg解复用器如何从封装格式中解析出不同的音视频数据

目录 1、ffmpeg介绍 2、FFMPEG的目录结构 3、FFmpeg的格式封装与分离 3.1、数据结构 3.2、封装和分离(muxer和demuxer) 3.2.1、Demuxer流程 3.2.2、Muxer流程 4、总结 4.1、播放器 4.2、转码器 C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续…...

测试-常见问题

目录 1、测试报告中有哪些内容? 2、如何保证用例的覆盖度 3、测试用例和测试脚本的关系 4、Android和iOS测试的区别 5、小程序和App测试的区别 6、Web和App测试的区别 7、Alpha和Beta测试的区别 8、测试计划包括哪些? 9、Jmeter 、 monkey 10、设计用例的考虑点 …...

RSA非对称加密算法(Java实现)

废话不多说&#xff0c;直接上代码 public class RSAService {private static final String RSA "RSA";private static final String PUBLIC_KEY "xxx";private static final String PRIVATE_KEY "xxx";public static void main(String[] ar…...

netty构建http服务器

Netty 是一个高性能的异步事件驱动的网络应用框架&#xff0c;用于快速开发可维护的高性能协议服务器和客户端。要使用 Netty 搭建一个支持 HTTP 方法&#xff08;GET, POST, PUT, DELETE&#xff09;的 HTTP 服务器&#xff0c;可以按照以下步骤进行操作。 准备工作 添加依赖…...

Docker中安装Kafka和Kafka UI管理界面

Kafka 简介 Apache Kafka 是一个分布式流处理平台,主要用于构建实时数据管道和流应用。它最初由LinkedIn开发,并于2011年开源,之后成为Apache项目的一部分。Kafka的核心概念和功能包括: 发布与订阅消息系统:Kafka允许用户发布和订阅消息流。高吞吐量:Kafka能够处理大量数…...

防火墙——SNAT和DNAT策略的原理及应用、防火墙规则的备份、还原和抓包

防火墙——SNAT和DNAT策略的原理及应用、防火墙规则的备份、还原和抓包 &#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&…...

C# 冒泡排序

栏目总目录 概念 冒泡排序&#xff08;Bubble Sort&#xff09;是一种简单的排序算法&#xff0c;它通过重复遍历待排序的数列&#xff0c;比较每对相邻的项&#xff0c;并在顺序错误时交换它们的位置&#xff0c;直到没有需要交换的项为止。由于排序过程中小数逐渐“浮”到前…...

网络传输层——UDP与TCP

前言&#xff1a; 1.国际网络体系结构&#xff1a; OSI模型: open system interconnect 理论模型 1977 国际标准化组织 各种不同体系结构的计算机能在世界范围内互联成网。 应用层:要传输的数据信息&#xff0c;如文件传输&#xff0c;电子邮件等…...

Hype 4 Pro for Mac:专业级HTML5动画制作利器

Hype 4 Pro for Mac是一款专为Mac用户设计的专业级HTML5动画制作软件&#xff0c;它集动画制作、交互设计于一身&#xff0c;为用户提供了一种全新的、高效的动画制作体验。 该软件拥有直观易用的界面和强大的功能&#xff0c;支持多种设计元素&#xff0c;如滚动、旋转、缩放…...

C++ STL remove, remove_if 用法

一&#xff1a;功能 移除序列中&#xff08;满足给定条件&#xff09;的元素&#xff0c;该操作并不是真的将元素删除&#xff0c;而是序列的size不变&#xff0c;只是更新了迭代器&#xff0c;该函数会返回最后一个未删除元素的位置。 二&#xff1a;用法 #include <vect…...

HarmonyOS NEXT 开发之ArkTS基础入门

ArkTS 是 HarmonyOS NEXT 的开发语言&#xff0c;它基于 TypeScript 并进行了扩展和优化。以下是一些基础语法知识点、示例用法及注意事项。 一、ArkTS 简介 ArkTS 是一种基于 TypeScript 的编程语言&#xff0c;主要用于 HarmonyOS 应用的 UI 界面和业务逻辑开发。它在 Type…...

UE5 C++跑酷练习(Part2)

一.首先GameMode里有Actor数组&#xff0c;组装直线路&#xff0c;和左右路 #include "CoreMinimal.h" #include "GameFramework/GameModeBase.h" #include "RunGANGameMode.generated.h"UCLASS(minimalapi) class ARunGANGameMode : public AG…...

从0开始搭建vue + flask 旅游景点数据分析系统(二):搭建基础框架

这一期目标是把系统的布局给搭建起来&#xff0c;采用一个非常简单的后端管理风格&#xff0c;可以参考官方的页面 https://element.eleme.cn/#/zh-CN/component/container 下面我们开始搭建&#xff0c;首先&#xff0c;安装一下vue-router&#xff0c;element-ui npm insta…...

【过滤器 vs 拦截器】SpringBoot中过滤器与拦截器:明智选择的艺术(如何在项目中做出明智选择)

文章目录 SpringBoot 过滤器 vs 拦截器过滤器 (Filter)定义特点使用场景实现步骤创建过滤器类注册过滤器&#xff08;可选&#xff0c;如果不使用 WebFilter 注解&#xff09; 拦截器 (Interceptor)定义特点使用场景实现步骤创建拦截器类注册拦截器 过滤器与拦截器的比较实际项…...

2024-06学习笔记

1.事务与数据库链接的占用 如果用Transactional注解&#xff0c;那在第一次与数据库交互的时候&#xff0c;就会打开数据库链接&#xff0c;再整个方法执行完&#xff0c;才会关闭数据库链接。 即使后边用的事务传播是required_new,那之前的事务也是被挂起&#xff0c;不会被…...

【VUE】封装一个追随鼠标的漂浮组件框架

红色箭头代表鼠标位置&#xff0c;蓝色区域跟随鼠标出现&#xff0c;鼠标进行其他操作的时候&#xff0c;蓝色区域隐藏。 vue全码 <template><divmousemove"updatePosition"mouseleave"hideDiv"class"container":style"{ positi…...

mapstruct与lombok结合使用

问题 如果同时使用mapstruct与lombok&#xff0c;需要多添加一个lombok支持mapstruct的依赖库。 解决 <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId> </dependency><dependency><groupId&…...

【SpringBoot】Web开发之URL映射

RequestMapping("/getDataById/{id}") public String getDataById(PathVariable("id") Long id){ return "getDataById:"id; }46 如果URL中的参数名称与方法中的参数名称一致&#xff0c;则可以简化为&#xff1a; RequestMapping("/get…...

Switch视频播放完全指南:使用wiliwili实现离线媒体娱乐

Switch视频播放完全指南&#xff1a;使用wiliwili实现离线媒体娱乐 【免费下载链接】wiliwili 专为手柄控制设计的第三方跨平台B站客户端&#xff0c;目前可以运行在PC全平台、PSVita、PS4 和 Nintendo Switch上 项目地址: https://gitcode.com/GitHub_Trending/wi/wiliwili …...

3分钟实现Figma中文界面:设计师的本地化解决方案

3分钟实现Figma中文界面&#xff1a;设计师的本地化解决方案 【免费下载链接】figmaCN 中文 Figma 插件&#xff0c;设计师人工翻译校验 项目地址: https://gitcode.com/gh_mirrors/fi/figmaCN FigmaCN是一款专为中文设计师打造的浏览器插件&#xff0c;通过3800条人工校…...

企业数字化转型的核心基础设施:组织人事信息管理系统

去年某制造企业 HR 负责人跟我抱怨&#xff1a;公司 800 多人&#xff0c;每次调整组织架构都要改十几个 Excel 表格&#xff0c;员工调岗要手动更新 5 个系统的数据&#xff0c;光是核对信息就要花 3 天时间。这不是个例&#xff0c;很多企业的人事管理还停留在表格时代&#…...

绝地求生罗技鼠标宏配置全攻略:从零到精通的压枪优化指南

绝地求生罗技鼠标宏配置全攻略&#xff1a;从零到精通的压枪优化指南 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 还在为《绝地求生》中的枪口…...

Home Assistant ARM版在CasaOS上的完美配置指南(含时区设置技巧)

Home Assistant ARM版在CasaOS上的完美配置指南&#xff08;含时区设置技巧&#xff09; 对于智能家居爱好者来说&#xff0c;Home Assistant&#xff08;HA&#xff09;无疑是最强大的开源平台之一。而在ARM架构设备上运行HA&#xff0c;尤其是通过CasaOS这样的轻量级容器管理…...

从Provisional headers are shown到证书过期:uniapp请求无响应的幕后真相

从Provisional headers are shown到证书过期&#xff1a;uniapp请求无响应的深度排查指南 当你正在调试一个运行良好的uniapp项目时&#xff0c;突然发现所有网络请求在真机上毫无征兆地停止工作——没有错误提示&#xff0c;没有响应数据&#xff0c;只有开发者工具中冷冰冰的…...

Qwen-Image-2512实现Python爬虫数据自动化处理:电商图片批量生成方案

Qwen-Image-2512实现Python爬虫数据自动化处理&#xff1a;电商图片批量生成方案 1. 引言 如果你是做电商的&#xff0c;或者负责过电商运营&#xff0c;肯定遇到过这个头疼的问题&#xff1a;上架一个新商品&#xff0c;或者给一批老商品换季上新&#xff0c;需要准备大量的…...

别再只会发文本了!SpringBoot整合钉钉机器人,这5种高级消息模板让你的通知更专业

SpringBoot与钉钉机器人&#xff1a;五种高级消息模板实战指南 如果你还在用单调的文本消息推送系统通知&#xff0c;那么你的团队协作工具可能只发挥了50%的潜力。钉钉机器人提供的富文本消息类型&#xff0c;能够将枯燥的系统通知转化为直观、交互式的信息卡片&#xff0c;显…...

Step3-VL-10B-Base轻量级模型部署优势:低显存消耗与快速推理实测

Step3-VL-10B-Base轻量级模型部署优势&#xff1a;低显存消耗与快速推理实测 最近在星图GPU平台上折腾各种多模态大模型&#xff0c;发现一个挺有意思的现象&#xff1a;很多模型能力确实强&#xff0c;但一谈到部署&#xff0c;大家就开始头疼显存和速度。动辄几十GB的显存需…...

实战避坑!从WMS视角看Android UI线程优化:为什么主线程耗时必掉帧?

从WMS到Choreographer&#xff1a;Android主线程耗时操作导致丢帧的底层原理与实战优化 当你在Android应用中滑动列表时突然出现卡顿&#xff0c;或是界面渲染出现明显延迟&#xff0c;这背后往往隐藏着主线程耗时操作与WMS&#xff08;WindowManagerService&#xff09;、Chor…...