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

前言

在前面的文章中,我们已经对项目进行了简单的分析,并且已经编写好了基础的代码,接下来的工作就是进一步的分析游戏的业务功能,在基础代码之上,进行填充。

背景颜色

我们简单的创建窗口以后,除了命名外暂时没有做特殊处理,背景颜色也是黑色的一片。我们使用书籍中的背景颜色进行填充。

我们找到main模块,将绘制屏幕的函数封装到gf模块中,因为每次循环以后除了简单的更新窗口屏幕,我们还需要刷新飞船,外星人,子弹的位置。

封装屏幕更新函数update_screen,填充背景色。

gf模块代码如下

import sys
import pygamedef check_event():--snip--def update_screen(setting, screen):"""绘制屏幕"""# 填充背景色screen.fill(setting.bg_color)# 让最近绘制的屏幕可见pygame.display.flip()

main模块代码如下

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

这个时候执行程序,可以看到背景色已经不是黑色了。

在这里插入图片描述

飞船的加载

在游戏窗口弹出的时候,我们需要加载一个飞船对象,并且我们需要将飞船加载到指定的位置,通常来说,我们会将飞船放置到窗口的正中间。

我们要怎么实现这个功能呢?分成两步。

  • 我们需要在飞船的属性中,设置初始位置。
  • 我们需要一个函数,在窗口中绘制填充飞船。

修改代码如下:

import pygameclass Ship:def __init__(self, setting, screen):"""初始化飞船并设置其初始位置"""self.screen = screenself.setting = setting# 加载图片并外接矩形self.image = pygame.transform.scale(pygame.image.load('E:/python_project/alien_invasion/assets/image/ship.bmp'), (50, 50))# 飞船外接的矩形self.rect = self.image.get_rect()# 窗口矩形self.screen_rect = screen.get_rect()# 将每艘新飞船放在屏幕底部中央self.rect.centerx = self.screen_rect.centerxself.rect.bottom = self.screen_rect.bottomdef move(self):"""移动飞船"""def blitme(self):"""在指定位置绘制飞船"""self.screen.blit(self.image, self.rect)

前三行代码比较简单,先是飞船类中的screen对象和setting对相关使用构造函数传入的值进行赋值,然后是加载一个图片对象,这个图片对象明显就是我们飞船图像。

从这段代码self.rect = self.image.get_rect()开始看起。

我们加载飞船图片后,会在图片外接一个矩形。这个矩形的边界,就可以理解为我们飞船的边界。后面对于飞船位置的判断,都是使用这个外接矩形的边界来判定的,比如飞船移动到左边窗口边框,上边窗口边框等等。

接下来是self.screen_rect = screen.get_rect()

这个就是定义一个矩形使用游戏窗口矩形赋值,这个矩形的属性用于飞船位置的定位以及限制飞船的运行范围。

解释一下本次修改的代码:

  1. self.rect.centerx = self.screen_rect.centerx

    这段代码要和前面连着一起解读。前面已经定义图片的矩形和游戏窗口的矩形,这段代码也是一个赋值的代码,重点在于centerxcenterx 是在 Pygame 中获取屏幕宽度中心位置的一种方法。centerx也就是说这段代码将飞船外接矩形的中心坐标点的x坐标设置成了游戏弹窗的中心点x坐标。

  2. self.rect.bottom = self.screen_rect.bottom

    这段代码也需要和前面的一起连着,同样也是一个赋值的代码,这次赋值的是bottom。在Pygame中使用 .bottom 用于获取屏幕(或任何其他 Surface)底部边缘的 y 坐标。也就是说这段代码是将飞船外接矩形的底部y坐标用弹窗底部的y坐标。

    这两行代码是不是就是将图片外接矩形设置在在了底部中央的位置?x坐标是弹窗中心点的x坐标,y坐标是弹窗底部y坐标,稍微理解一下,画个图可能更好理解。

  3. self.screen.blit(self.image, self.rect)

    这个很好理解了,之前pygame基础讲过了,简单的填充代码。那么调用这个函数,就是在指定的screen的底部中央加载一个飞船。

这些代码理解后,我们现在需要做的就是,在main模块中定义一个飞船类,然后在屏幕更新的函数中,调用飞船对象的blitme函数即可。

那么main模块代码更新如下。

import pygame
import alien_invasion.game_functions as gf
from alien_invasion.setting import Setting
from alien_invasion.ship import Shipdef 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()# 刷新屏幕gf.update_screen(setting, screen, ship)if __name__ == '__main__':run_game()

main模块中,定义了一个飞船类,并将这个类作为参数传递到update_screen函数中,对应update_screen函数也应该做出修改

import sys
import pygame--snip--def update_screen(setting, screen, ship):"""更新屏幕"""# 填充背景色screen.fill(setting.bg_color)# 加载飞船ship.blitme()# 让最近绘制的屏幕可见pygame.display.flip()

在更新屏幕的函数中,我们使用ship对象调用自身的函数绘制一个飞船在游戏窗口底部中央的位置。

实际效果如下:
在这里插入图片描述

当然,由于我们前期已经做好了项目分析以及架构设计,我们的项目目录基本不会再变化,我们只需要想办法通过代码实现相应的功能,并讲代码编写在相应的模块即可。

结尾

通过本篇文章,我们已经成功将飞船加载到了指定的位置,那么接下来,我们就该让飞船动起来了!各位加油!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/49315.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设置使用小米google play和APK的下载使用

我们常常遇到从google play无法下载apk文件,被迫从APKcombo和APKpure两个网站下载安装文件,可是安装文件在手机google play服务框架未开启时即使安装好了,也没法用。也需要把google play服务框架安装好,下面分别介绍: …

Mac 中安装内网穿透工具ngrok

ngrok 是什么? Ngrok 是一个网络工具,主要用于在网络中创建从公共互联网到私有或本地网络中运行的web服务的安全隧道。它充当了一个反向代理,允许外部用户通过公共可访问的URL访问位于防火墙或私有网络中的web应用程序或服务。Ngrok 特别适用…

Three.js 官方文档学习笔记

Address:Three.js中文网 (webgl3d.cn) Author:方越 50041588 Date:2024-07-19 第一个3D案例—创建3D场景 创建3D场景对象Scene: const scene new THREE.Scene(); 创建一个长方体几何对象Geometry: const geomet…

实验八: 彩色图像处理

目录 一、实验目的 二、实验原理 1. 常见彩色图像格式 2. 伪彩色图像 3. 彩色图像滤波 三、实验内容 四、源程序和结果 (1) 主程序(matlab (2) 函数FalseRgbTransf (3) 函数hsi2rgb (4) 函数rgb2hsi (5) 函数GrayscaleFilter (6) 函数RgbFilter 五、结果分析 1. …

某数据泄露防护(DLP)系统NetSecConfigAjax接口SQL注入漏洞复现 [附POC]

文章目录 某数据泄露防护(DLP)系统NetSecConfigAjax接口SQL注入漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现某数据泄露防护(DLP)系统NetSecConfigAjax接口SQL注入漏洞复现 [附POC] 0x01 前言 免责声明:请…

【Emacs有什么优点,用Emacs写程序真的比IDE更方便吗?】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

springcloud接入skywalking作为应用监控

下载安装包 需要下载SkyWalking APM 和 Java Agent 链接: skywalking 安装 下载JDK17(可不配置环境变量) 目前skywalking 9.0及以上版本基本都不支持JDK8,需要JDK11-21,具体版本要求在官网查看。 我这里使用的是skywalking9.…

Unity UGUI 之 图集

本文仅作学习笔记与交流,不作任何商业用途 本文包括但不限于unity官方手册,唐老狮,麦扣教程知识,引用会标记,如有不足还请斧正 本文在发布时间选用unity 2022.3.8稳定版本,请注意分别 1.什么是图集 精灵图…

google 浏览器插件开发简单学习案例:TodoList;打包成crx离线包

参考: google插件支持: https://blog.csdn.net/weixin_42357472/article/details/140412993 这里是把前面做的TodoList做成google插件,具体网页可以参考下面链接 TodoList网页: https://blog.csdn.net/weixin_42357472/article/de…

phpstorm配置xdebug3

查看php路径相关信息 php --ini安装xdebug https://www.jetbrains.com/help/phpstorm/2024.1/configuring-xdebug.html?php.debugging.xdebug.configure php.ini 配置 在最后添加,以下是我的配置 [xdebug] zend_extension/opt/homebrew/Cellar/php8.1/8.1.29/p…

React 学习——行内样式、外部样式、动态样式

三种样式的写法 import "./index.css"; //同级目录下的样式文件 function App() {const styleCol {color: green,fontSize: 40px}// 动态样式const isBlock false;return (<div className"App">{/* 行内样式 */}<span style{{color:red,fontSiz…

工程视角:数据结构驱动的应用开发--字典(dictionary),列表(list)与实体

这里写目录标题 业务业务场景流程分析 实现数据访问层&#xff08;DAL&#xff09;业务逻辑层&#xff08;BLL&#xff09;用户界面层&#xff08;UI&#xff09;工具类 设计思路为什么抽出工具类关于U层使用字典的好处工程视角 业务 业务场景 在一个金融应用系统中&#xff0c…

.netcore TSC打印机打印

此文章给出两种打印案例&#xff0c; 第一种是单列打印&#xff0c;第二种是双列打印 需要注意打印机名称的设置&#xff0c;程序中使用的打印机名称为999&#xff0c;电脑中安装打印机时名称也要为999。 以下是我在使用过程中总结的一些问题&#xff1a; 一 TSC打印机使用使…

【Node.js基础02】fs、path模块

目录 一&#xff1a;fs模块-读写文件 1 加载fs模块对象 2 读制定文件内容文件 3 向文件中写入内容 二&#xff1a;path模块-路径处理 1 问题引入 2 __dirname内置变量 使用方法 一&#xff1a;fs模块-读写文件 fs模块封装了与本机文件系统交互方法和属性 1 加载fs模块…

弹性布局 flex layout HTML CSS

文章目录 效果图参考文档代码 效果图 其实弹性布局的好处是&#xff1a;当网页大小变化&#xff08;如窗口resize&#xff09;时&#xff0c;处于弹性容器(flex container)中的弹性元素(flex item) 之间的距离也会变化。 需要特别注意的是&#xff1a; 弹性布局的主要CSS如下。…

开源邮箱套件介绍系列2:Roundcube webmail

1. 项目介绍 项目网站&#xff1a;Roundcube – Free and Open Source Webmail Software Roundcube 项目是一个免费的开源网络邮件解决方案&#xff0c;具有类似桌面的用户界面&#xff08;Webmail&#xff09;&#xff0c;易于安装/配置&#xff0c;并且可以在标准的LAMPP服…

PostgreSQL 中如何处理数据的唯一性约束?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01;&#x1f4da;领书&#xff1a;PostgreSQL 入门到精通.pdf 文章目录 PostgreSQL 中如何处理数据的唯一性约束&#xff1f;一、什么是唯一性约束二、为什么要设置唯一性约束…

SAP第二季度财报和进一步裁员计划

7月22日公布了截至 2024 年 6 月 30 日的第二季度财务报告。以下位总体指标 当前云计算在手订单达 148 亿欧元&#xff0c;按名义货币和固定汇率计算均增长 28%云收入增长 25%&#xff0c;其中云 ERP 套件收入增长 33%&#xff0c;均按名义货币和固定汇率计算总收入增长 10%&a…

mysql 先子查询过滤再联合 和 先联合再过滤 执行效率问题

执行顺序 先子查询过滤再联合 SELECT XXX FROM(select * from edw_data_dyd.overrun_offsite_info WHERELENGTH( VEHICLE_ID ) > 12 AND CREATED_TIME > DATE_ADD(NOW(),INTERVAL -1 HOUR)AND CREATED_TIME < NOW()AND VEHICLE_ID not like %无车牌%AND VEHICLE_I…

Mac中maven配置安装路径

Mac中maven配置安装路径 没有下载maven的可以先下载&#xff1a;&#xff08;这里建议maven版本不要下高了&#xff09; 如果你的bash_profile中没有配置JAVA_HOME路径&#xff0c;可以按照下面的命令配置一下 获取JAVA的安装路径&#xff1a; /usr/libexec/java_home -V …