Godot《躲避小兵》实战之游戏开始界面制作

我们的游戏还需要用户可操作的界面,比如开始游戏,退出以及显示分数等UI界面。

创建新场景,点击“其他节点”按钮,然后添加一个 CanvasLayer 节点并命名为 HUD。“HUD”是“heads-up display”(游戏信息显示)的缩写,是覆盖在游戏视图上显示的信息。

CanvasLayer节点可以让我们在游戏的其他部分的上一层绘制 UI 元素,这样它所显示的信息就不会被任何游戏元素(如玩家或敌人)所覆盖。

HUD 中需要显示以下信息:

  • 得分,由 ScoreTimer 更改。
  • 消息,例如“Game Over”或“Get Ready!”
  • “Start”按钮来开始游戏。

UI 元素的基本节点是 Control。要创建 UI,我们需使用 Control 下的两种节点:Label和 Button。

创建以下节点作为 HUD 的子节点:

  • 名为分数标签 ScoreLabel 的 Label。
  • 名为消息 Message 的 Label。
  • 名为开始按钮 StartButton 的 Button。
  • 名为信息计数器 MessageTimer 的 Timer。

点击 ScoreLabel 并在“检查器”的 Text 字段中键入一个数字。

在这里插入图片描述

Control 节点的默认字体很小,不能很好地缩放。游戏资产包中有一个叫作“Xolonium-Regular.ttf”的字体文件。 使用此字体需要执行以下操作:

在“Theme Overrides > Fonts”(主题覆盖 > 字体)中选择“加载”,然后选中“Xolonium-Regular.ttf”文件。

在这里插入图片描述

字体尺寸仍然太小,请在“Theme Overrides > Font Sizes”(主题覆盖 > 字体大小)下将其增加到 64。当 ScoreLabel 完成此操作后,请重复对 Message 和 StartButton 节点做同样的修改。

请将节点如下图排列。拖动节点可以手动放置,也可以使用“锚点预设(Anchor Preset)”进行更精确的定位。

在这里插入图片描述

ScoreLabel

  1. 添加文本 0。
  2. 将“Horizontal Alignment”和“Vertical Alignment”设置为 Center。
  3. 为“Anchor Preset”选择 Center Top。

Message

  1. 添加文本 Dodge the Creeps!。
  2. 将“Horizontal Alignment”和“Vertical Alignment”设置为 Center。
  3. 将“Autowrap Mode”设置为 Word,否则标签只会有一行。
  4. 在“Control - Layout/Transform”中将“Size X”设置为 480,使用屏幕的完整宽度。
  5. 为“Anchor Preset”选择 Center。

StartButton

  1. 添加文本 Start。
  2. 在“Control - Layout/Transform”中将“Size X”设置为 200、“Size Y”设置为 100,在边框和文本之间添加间距。
  3. 为“Anchor Preset”选择 Center Bottom。
  4. 在“Control - Layout/Transform”中将“Position Y”设置为 580。

在 MessageTimer 中,将 Wait Time 设置为 2 并将 One Shot 属性设置为“启用”。

现将这个脚本添加到 HUD:

extends CanvasLayer# 定义一个信号,通知主节点已按下按钮
signal start_game

当想显示一条临时消息时,比如“Get Ready”,就会调用这个函数

func show_message(text):# 给节点文本赋值$Message.text = text# 显示该节点$Message.show()# 启动定时器,2s$MessageTimer.start()

我们还需要处理玩家死亡的情况。以下代码会显示 2 秒“Game Over”,然后返回标题屏幕,暂停一会儿之后再显示“Start”按钮。

func show_game_over():show_message("Game over")# 等到定时器倒计时结束await $MessageTimer.timeout$Message.text = "Dodge the Creeps!"$Message.show()# 创建一个一次性的计时器并等待它完成await get_tree().create_timer(1.0).timeout# 显示开始按钮$StartButton.show()

当玩家死亡时调用这个函数。将显示“Game Over”2 秒,然后返回标题屏幕并显示“Start”按钮。

将以下更新分数代码添加到 HUD 中

func update_score(score):$ScoreLabel.text = str(score)

将 StartButton 的 pressed() 信号与 MessageTimer 的 timeout() 信号连接到 HUD 节点上,然后在新函数中添加以下代码:

func _on_start_button_pressed():# 开始按钮按下时信号# 隐藏按钮$StartButton.hide()# 发送开始游戏信号start_game.emit()func _on_message_timer_timeout():# 定时器结束时隐藏消息$Message.hide()

将 HUD 场景连接到 Main 场景

现在我们完成了 HUD 场景,保存并返回 Main 场景。和 Player 场景的做法一样,在 Main 场景中实例化 HUD 场景。如果你没有错过任何东西,完整的场景树应该像这样:

在这里插入图片描述

现在我们需要将 HUD 功能与我们的 Main 脚本连接起来。这需要在 Main 场景中添加一些内容:

在“节点”选项卡中,点击“连接信号”窗口中的“选取”按钮,选择 new_game() 方法或在窗口的“接收方法”下面输入“new_game”,将 HUD 的 start_game 信号连接到 Main 节点的 new_game() 函数。请确认脚本中 func new_game() 的旁边出现了一个绿色的连接图标。

在这里插入图片描述

在 new_game() 函数中,更新分数显示并显示“Get Ready”消息:

func new_game():score = 0# 调用玩家start方法$Player.start($StartPostion.position)# 倒计时2秒开始$StartTimer.start()# 更新分数$HUD.update_score(score)# 显示消息$HUD.show_message("Get Ready")

在 game_over() 中我们需要调用相应的 HUD 函数:

func game_over():# 定时器停止$ScoreTimer.stop()# 生成怪物定时器停止$MobTimer.stop()# 执行UI游戏结束的逻辑$HUD.show_game_over()

最后,将下面的代码添加到 _on_score_timer_timeout() 中,保持不断变化的分数的同步显示:

func _on_score_timer_timeout():# ScoreTimer定时器结束时分数自增score += 1# 数值同步更新显示$HUD.update_score(score)

现在你就可以开始游戏了!点击“运行项目”按钮。此时会要求你选择一个主场景,选择 main.tscn 即可。

删除旧的小怪

如果你一直玩到“游戏结束”,然后重新开始新游戏,上局游戏的小怪仍然显示在屏幕上。更好的做法是在新游戏开始时清除它们。我们需要一个同时让所有小怪删除它自己的方法,为此可以使用“分组”功能。

在 Mob 场景中,选择根节点,然后单击检查器旁边的“节点”选项卡(在该位置可以找到节点的信号)。 点击“信号”旁边的“分组”,然后可以输入新的组名称,点击“添加”。

在这里插入图片描述

现在,所有小怪都将属于“mobs”(小怪)分组。我们可以将以下行添加到 Main 中的 new_game() 函数中:

get_tree().call_group("mobs", "queue_free")

call_group() 函数调用组中每个节点上的删除函数——让每个怪物删除其自身。

游戏在这一点上大部分已经完成。在下一部分和最后一部分中,我们将通过添加背景,循环音乐和一些键盘快捷键来对其进行一些润色。

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

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

相关文章

websocket拦截插件

系列文章目录 《websocket逆向》《Http拦截》《websocket拦截》《Base64编码与解码》《python实现protobuf序列化与反序列化》《前端js实现protobuf序列化与反序列化》《protobufjs实现protobuf序列化与反序列化》《视频号直播弹幕采集》《小红书直播弹幕采集》《tiktok直播web…

计算机网络——运输层(进程之间的通信、运输层端口,UDP与TCP、TCP详解)

运输层协议概述 进程之间的通信 运输层向它上面的应用层提供通信服务。 当网络边缘部分的两台主机使用网络核心部分的功能进行端到端的通信时,都要使用协议栈中的运输层;而网络核心部分中的路由器在转发分组时只用到下三层的功能。 Q1:我们…

最全Java集合分片处理!!! Java 中 List 分片的 7种方法

文章目录 Java 中 List 分片的 7种方法业务需求背景实现方法方法一:最基本的 for 循环实现方法二:利用 List 的 subList() 方法方法三:stream 流操作 filter 方法过滤方法四:使用 Google Guava 的 Lists.partition 方法方法五&…

【计算机三级-数据库技术】操作题大题(第六套)

第六套操作题 第46题 假定要建立一个学校科研项目管理的信息系统,需要管理如下信息: 教师:教师编号、教师姓名; 项目:项目编号、项目名称、资助额: 学生:学生编号、学生姓名、学位&#xff0c…

理解与推导贝叶斯滤波算法

很多时候一些算法看起来极其复杂,极其难懂,不是因为我们愚不可及,而是因为我们看到的是别人省略过很多步骤和脑海中思考过的思路最后呈现出来的公式和文字,而好的博客就应该尽量还原这些思考过程及省略掉的步骤。 像卡尔曼滤波(Kalman filters)、粒子滤波(Particle filt…

跟李沐学AI:转置卷积

定义 卷积不会增大输入的高宽,通常卷积层后高宽不变或减半。转置卷积则可以用来增大输入的宽高。 转置卷积是一种卷积,它将输入和核进行了重新排列,通常用作上采用。 如果卷积将输入从变为,同样超参数的情况下,转置…

Java使用不同方式解析SVG文件

使用不同方式解析SVG文件 使用三种方式解析SVG文件一、Apache Batik导入坐标代码示例 二、Jsoup导入坐标代码示例 三、XML 解析器导入坐标代码示例 *查看SVG文件工具*Inkscape 使用三种方式解析SVG文件 找了好久的SVG文件解析! 一、Apache Batik 这是一个广泛使用…

集团数字化转型方案(十二)

集团数字化转型方案致力于通过构建一个集成化的数字平台,全面应用大数据分析、人工智能、云计算和物联网等前沿技术,推动业务流程、管理模式和决策机制的全面升级。该方案将从业务流程的数字化改造开始,优化资源配置,提升运营效率…

yolov8 出现loss 为nan

原因: 混合精度训练是一种通过同时使用 FP16 和 FP32 精度来加速深度学习训练的技术。它可以在不损失模型性能的情况下,显著减少训练时间和内存使用。下面是关于混合精度训练的一些解释: 1. 原理 混合精度训练利用了 FP16 (16位浮点)和 FP32 (32位浮点)的不同特性。…

每日一题——贪心算法

860. 柠檬水找零 - 力扣(LeetCode) 这道题目乍一看可能没有什么头绪,但是当你仔细想想就会明白一个道理,那就是,《论电子支付的重要性》哈哈哈哈,言归正传,其实很简单无非就是找钱,…

Alembic:python中数据库迁移的瑞士军刀

Alembic 简介 Alembic 是由 SQLAlchemy 的创始人 Mike Bayer 设计的一个数据库迁移工具。它不仅支持自动迁移脚本生成,还允许开发者手动编辑迁移脚本来满足特定的需求。Alembic 通过提供一个环境来跟踪数据库模式的变更历史,确保数据库的版本与应用代码…

linux内核 时间同步机理分析笔记

1 内核时间管理的相关组件 1.1 clocksource 和 clock_event_device 1.1.1 简介 外部时钟设备的主要作用是提供精确的计时功能和定期产生中断的功能,内部把提供精确计时的功能抽象为clocksource对象,把定期产生中断的功能抽象为clock_event_device对象…

微信支付流程

1. 创建订单 请求创建订单的 API 接口:把 订单金额、收货地址、订单中包含的商品信息 发送到服务器服务器响应的结果:订单编号 2.订单预支付 请求订单预支付的 API 接口:把步骤1得到的 订单编号 发送到服务器服务器响应的结果:…

P9145 [THUPC 2023 初赛] 世界杯

[题目通道]([THUPC 2023 初赛] 世界杯 - 洛谷) 简要题意:输出五常中的最强球队。 众所周知,每个国家的球队都有自己的长处,在不同规则下最强球队也有所不同。而小 M 制定的规则是输球场数最少,这是有道理的,因为输球…

《黑神话:悟空》全网互动量超1.8亿,百万天命人重走西游

四年磨一剑,一剑破长空。 8月20日10点,《黑神话:悟空》正式开服,同时轰动了国内外游戏圈子,冲顶国内各大社媒平台,一天包揽120个热搜。上线之后,《黑神话:悟空》火速登顶Steam热销游…

网络通信编程UDP/TCP

一、不同体系结构间的互联互通 通信本质:不同主机上进程间的通信。通过 IP 标识网络中的一台主机,本质上是 32 位的整型数据;通过端口号标识某个进程,本质上是 16 位的整型数据。网络模型:主要有 C/S(客户…

克服编程学习中的挫折感:从心态到策略的全方位指南

💓 博客主页:倔强的石头的CSDN主页 📝Gitee主页:倔强的石头的gitee主页 ⏩ 文章专栏:《热点时事》 期待您的关注 目录 引言 一、心态调整:积极乐观,合理期望 二、学习方法:有效策…

一起学Java(3)-Java项目构建工具Gradle和Maven场景定位和优缺点对比

在第一步创建的项目(java-all-in-one)项目里,我们提到了使用Gradle作为项目构建工具。看到这里,不知道你是否有疑惑,什么是项目构建工具。Java项目常用构建工具有哪些?都有什么特点? 带着疑惑&…

【教程】Ubuntu给pycharm添加侧边栏快捷方式

转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 以下教程不仅限于pycharm,其他软件也是一样操作 1、进入到pycharm的目录,先通过命令行打开pycharm: ./bin/pycharm…

ETL开发团队应对突发技术故障和危机的策略

建立有效的监控和警报系统 首先,建立有效的监控和警报系统是应对突发技术故障和危机的重要步骤。通过监控ETL流程和相关系统的关键指标,例如数据传输速度、资源利用率和错误日志,您可以提前发现潜在的问题。设置警报机制,及时通知…