【Godot4自学手册】第三十七节钥匙控制开门
有些日子没有更新了,实在是琐事缠身啊,今天继续开始自学Godot4,继续完善地宫相关功能,在地宫中安装第二道门,只有主人公拿到钥匙才能开启这扇门,所以我们在合适位置放置一个宝箱,主人公开启宝箱后,获得开门钥匙。先看一下展示效果。

一、开启宝箱获得钥匙
新建场景,根节点设为StaticBody2D,命名为Chest,保存到场景目录下。
1.部署节点。
依次添加AnimatedSprite2D用于播放宝箱开和关动画;CollisionShape2D表示宝箱的碰撞体,主人公不能穿越宝箱。Area2D用于监测主人公的攻击,当主人公攻击宝箱后,宝箱打开并展现钥匙;Sprite2D节点,命名keys,用于表示宝箱中的钥匙 ,节点目录如下:

2.节点属性设置
下面依次设置各节点。
在AnimatedSprite2D的属性检查器中,设置新建动画,然后在动画面板中建立open和Close动画,每个动画就1帧,表示宝箱的开启和关闭两种状态,宝箱的素材,可以在本节的源代码中找到。

在CollisionShape2D检查器中shape属性设置新建RectangleShape2D,然后调整大小和位置到合适。

给Area2D节点添加CollisionShape2D子节点,并给子节点添加矩形碰撞区域,大小覆盖宝箱。
给Keys节点添加Area2D子节点,再给Area2D子节点添加CollisionShape2D子节点,命名为CheckPeople,调整合适大小,这个碰撞是为了使主人公拾取钥匙,所以大小要比宝箱大一些,同时把Disabled启用,隐藏该节点,当主人公打开宝箱的时候,钥匙才显示出来,主人公才能拾取。

3.添加代码
给根节点添加代码,具体如下:
extends StaticBody2D
@onready var animated_sprite_2d = $AnimatedSprite2D #获取宝箱动画节点
@onready var collision_shape_2d = $Area2D/CollisionShape2D #获取碰撞节点
@onready var check_people = $Keys/KeyCheck/CheckPeople #获取钥匙拾取节点
@onready var keys = $Keys #获取钥匙节点#主人公攻击宝箱信号
func _on_area_2d_area_entered(area):animated_sprite_2d.play("open")#播放宝箱打开动画collision_shape_2d.set_deferred("disabled",true) #将攻击宝箱的碰撞设为不可用await get_tree().create_timer(.3).timeout #等待0.3秒,keys.show() #钥匙显示出来await get_tree().create_timer(.3).timeout #等待0.3秒,表示钥匙拾取的个等待check_people.set_deferred("disabled",false) #将钥匙拾取检测设为可用#钥匙拾取检测信号
func _on_key_check_body_entered(body):if body.name =="Player":#当是主人公的时候keys.queue_free() #钥匙销毁body.stats.keycount +=1 #主人公钥匙计数加一
最后在underground场景实例化该节点,并把宝箱放到合适位置。

二、在上方显示获取钥匙信息
这部分完成的效果如下:

新建场景,更目录设置为BoxContainer,命名为InfoContainer,并保存到场景目录下。
1.新建节点
依次为根节点添加Label节点,命名为CoinCount表示金币的数量;添加TextureRect节点,命名为CoinIco表示金币图标;添加Label节点,命名为KeyCount表示钥匙的数量;添加TextureRect节点,命名为KeyIco表示钥匙图标;在CoinIco节点和KeyCount节点之间添加Control节点,用于隔开金币和钥匙一定距离。

2.节点设置
CoinCount和KeyCount节点的Text属性均设置为0,Theme Overrrides->Font Sizes属性下Font Size启用,并设置为10px。

CoinIco和KeyIco节点的Texute属性对应拖入金币和钥匙的图标。

最后将根节点调整为右上对其,并适当调整边距。

3.添加代码
为根节点添加代码,具体如下:
extends HBoxContainer
@export var stats:Stats #定义状态为输入变量
@onready var coin_count = $CoinCount #获取金币数量节点
@onready var key_count = $KeyCount #获取钥匙数量节点func _ready():stats.coin_changed.connect(update_coin) #链接金币数量改变信号到本节点update_coin函数stats.key_changed.connect(update_key) #链接钥匙数量改变信号到本节点的update_key函数func update_coin():#金币数量改变信号coin_count.text = str(stats.coincount) #将金币数量显示出来func update_key():key_count.text = str(stats.keycount) #将钥匙数量显示出来
修改Status.gd代码如下:
class_name Stats #定义当前节点为Stats类
extends Node #继承Node节点
signal health_changed #定义血量变化信号
signal coin_changed #定义金币变化信号
signal key_changed #定义钥匙数量变化信号@export var max_health: int = 100 #定义最大血量
@onready var health: int = max_health: #当前血量,默认等于最大血量set(v): #输入血量v = clampi(v, 0, max_health) #控制输入的血量0到最大血量之间if health == v: #如果当前血量和输入血量相同,就会退出returnhealth = v #将当前血量设置为输入值health_changed.emit() #发出信号@onready var coincount:int=0: #定义金币数量默认为0set(v): #输入金币数量coincount=v #当前金币数量设置为输入值coin_changed.emit() #发出金币改变信号@onready var keycount:int=0: #定义钥匙数量,默认为0set(v): #输入钥匙数量keycount=v #将当前钥匙数量设置为输入值key_changed.emit() #发出钥匙改变信号
最后进入Player场景,在CanvasLayer节点下实例化InfoContainer节点,并将Stats设置Stats节点。

三、用钥匙打开宝箱
切换到underground场景,先将TileMap修改一下留出一个可以通过的缺口,并铺设地面,如下:

1.节点部署
新建场景,更目录设置为StaticBody2D,命名为KeyDoor,并保存到场景目录下。
依次为根节点添加AnimatedSprite2D节点,命名为DoorAnima表示门有关的动画;添加CollisionShapte2D节点,命名为IntoCollision,用于碰撞检测,当门关闭时,人是不能进入的,当打开时人才能通过;添加Area2D节点,用来检测主人公是否进入;实例化Tips节点(这是我们第节第三十一节添加的类),用于信息提示。

2.节点设置
在DoorAnima节点的检查器中Animation->Sprite Frames设置为新建SpriteFrames,在其动画帧面板上新建3个动画,一个是Close动画表示门的关闭状态,一个是Open动画表示门的打开状态,最后一个是Charge动画表示开门的动画。

IntoCollision节点检查器中CollisionShape2d->Shape设置为新建RectangeShape2D,并调整到合适大小和位置。

给CheckInArea添加CollisionShape2D子节点,然后在该节点检查器中CollisionShape2d->Shape设置为新建RectangeShape2D,并调整到合适大小和位置。

3.添加代码
为根节点添加如下代码:
extends StaticBody2D
@onready var door_anima = $DoorAnima #获取门的动画节点
@onready var into_collision = $IntoCollision #获取门碰撞节点
@onready var tips = $Tips #获取提示信息节点
@onready var incollision = $CheckInArea/Incollision #获取主人公进入检测节点#主人公进入检测信息
func _on_check_in_area_body_entered(body):if body.name=="Player" : #当主人公进行检测碰撞区if body.stats.keycount<1: #果主人公钥匙数量为0tips.infoText="这道门,似乎只有用钥匙才能打开" #提示信息return #退出该函数else: #如果主人公有钥匙incollision.set_deferred("disabled",true) #主人公检查碰撞失效body.stats.keycount -=1 #主任公的钥匙数量减一door_anima.play("Charge") #播放门的打开动画await door_anima.animation_finished #等待动画播放完毕door_anima.play("Open") #播放门的打开状态动画into_collision.set_deferred("disabled",true) #设置门的碰撞检测失效,主人公可以进入
最后在underground节点下实例化该场景,并将门移动预留的位置。

ok,这样本节的内容就可以收工了。效果如下:

相关文章:
【Godot4自学手册】第三十七节钥匙控制开门
有些日子没有更新了,实在是琐事缠身啊,今天继续开始自学Godot4,继续完善地宫相关功能,在地宫中安装第二道门,只有主人公拿到钥匙才能开启这扇门,所以我们在合适位置放置一个宝箱,主人公开启宝箱…...
GitHub repository - Pulse - Contributors - Network
GitHub repository - Pulse - Contributors - Network 1. Pulse2. Contributors3. NetworkReferences 1. Pulse 显示该仓库最近的活动信息。该仓库中的软件是无人问津,还是在火热地开发之中,从这里可以一目了然。 2. Contributors 显示对该仓库进行过…...
RocketMQ 10 面试题FAQ
RocketMQ 面试FAQ 说说你们公司线上生产环境用的是什么消息中间件? 为什么要使用MQ? 因为项目比较大,做了分布式系统,所有远程服务调用请求都是同步执行经常出问题,所以引入了mq 解耦 系统耦合度降低,没有强依赖…...
【Spring进阶系列丨第十篇】基于注解的面向切面编程(AOP)详解
文章目录 一、基于注解的AOP1、配置Spring环境2、在beans.xml文件中定义AOP约束3、定义记录日志的类【切面】4、定义Bean5、在主配置文件中配置扫描的包6、在主配置文件中去开启AOP的注解支持7、测试8、优化改进9、总结 一、基于注解的AOP 1、配置Spring环境 <dependencie…...
Leetcode 152. 乘积最大子数组和Leetcode 162. 寻找峰值
文章目录 Leetcode 152. 乘积最大子数组题目描述C语言题解和思路解题思路 Leetcode 162. 寻找峰值题目描述C语言题解和思路解题思路 Leetcode 152. 乘积最大子数组 题目描述 给你一个整数数组 nums ,请你找出数组中乘积最大的非空连续子数组(该子数组中…...
项目实战之网络电话本之发送邮件名片和导出word版个人信息
1、项目介绍 1)项目功能 用户管理:分为管理员、和普通用户,设置不同用户的权限 电话本信息管理:支持管理员和普通用户对电话本的信息进行增删改操作,模糊查询(根据姓名、地址、单位) 文件批…...
前端面试问题汇总 - HTTP篇
1. 登录拦截如何实现? 在前端,可以拦截所有需要登录的请求,如果用户未登录或者登录过期,则跳转到登录页面。 2. http 缓存有哪些? 强缓存: 强缓存是指在客户端请求资源时,先检查本地是否存在缓存…...
Java的IO流
Day35 Java的IO流 概念 Java的IO流是用来处理输入和输出操作的机制,用于在程序和外部数据源(如文件、网络连接、内存等)之间进行数据传输。Java的IO流主要分为字节流和字符流两种类型,每种类型又分为输入流和输出流。 理解&#…...
Node.js 中的 RSA 加密、解密、签名与验证详解
引言 在现代的网络通信中,数据安全显得尤为重要。RSA加密算法因其非对称的特性,广泛应用于数据的加密、解密、签名和验证等安全领域。本文将详细介绍RSA算法的基本原理,并结合Node.js环境,展示如何使用内置的crypto模块和第三方库…...
vue+element作用域插槽
作用域插槽的样式由父组件决定,内容却由子组件控制。 在el-table使用作用域插槽 <el-table><el-table-column slot-scope" { row, column, $index }"></el-table-column> </el-table>在el-tree使用作用域插槽 <el-tree>…...
MUSA模型
MUSA模型在软件可靠性工程中起到的作用是估计软件的故障/失效数量和故障率。具体来说,MUSA模型包括基本模型和对数模型。 MUSA基本模型假设故障发生的时间间隔服从参数为lambda的指数分布。在这个模型中,当故障被检测到时,发生故障的部分会被…...
avicat连接异常,错误编号2059-authentication plugin…
错误原因为密码方式不对,具体可自行百度 首先管理员执行cmd进入 mysql安装目录 bin下边 我的是C:\Program Files\MySQL\MySQL Server 8.2\bin> 执行 mysql -u -root -p 然后输入密码 123456 进入mysql数据库 use mysql 执行 ALTER USER rootlocalhost IDE…...
阿里云云效CI/CD配置
1.NODEJS项目流水线配置(vue举例) nodejs构建配置 官方教程 注意:下图的dist是vue项目打包目录名称,根据实际名称配置 # input your command here cnpm cache clean --force cnpm install cnpm run build 主机部署配置 rm -rf /home/vipcardmall/frontend/ mkdir -p /home/…...
个人开发者,Spring Boot 项目如何部署
今天给大家分享一下,作为个人开发者,Spring Boot 项目是如何部署的。 环境介绍 Linux docker docker-compose 目录结构 erwin-windrunner - backups - data - jars - build-docker-compose.sh - docker-compose.yml - Dockerfile文件 Dockerfile …...
【Spring进阶系列丨第九篇】基于XML的面向切面编程(AOP)详解
文章目录 一、基于XML的AOP1.1、打印日志案例1.1.1、beans.xml中添加aop的约束1.1.2、定义Bean 1.2、定义记录日志的类【切面】1.3、导入AOP的依赖1.4、主配置文件中配置AOP1.5、测试1.6、切入点表达式1.6.1、访问修饰符可以省略1.6.2、返回值可以使用通配符,表示任…...
学习记录:转发和重定向
转发(Forward)和重定向(Redirect)是两种不同的 Web 请求处理方式,它们在功能和行为上有着显著的区别。 区别 转发(Forward): 服务器内部跳转:转发是服务器内部的行为&…...
实现(图像、视频等)数据上云存储
实现(图像、视频等)数据上云存储 实现(图像、视频等)数据上云存储通常涉及以下几个步骤: 选择云存储服务商: 根据您的需求、预算、地域覆盖、数据安全性、服务稳定性等因素,选择一家合适的云存储…...
LeetCode 454.四数相加II
LeetCode 454.四数相加II 1、题目 题目链接:454. 四数相加 II - 力扣(LeetCode) 给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足: 0 <…...
GoogleNet网络训练集和测试集搭建
测试集和训练集都是在之前搭建好的基础上进行修改的,重点记录与之前不同的代码。 还是使用的花分类的数据集进行训练和测试的。 一、训练集 1、搭建网络 设置参数:使用辅助分类器,采用权重初始化 net GoogleNet(num_classes5, aux_logi…...
将数字状态码在后台转换为中文状态
这是我们的实体类 可以看出我们的状态status是2如过返回到前端我们根本不知道2代表的是什么,所以我们需要再这里将数字转换成能看懂的中文状态,首先我们创建一个枚举类 先将我们状态码所对应的中文状态枚举出来,然后创建一个静态方法&#…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...
用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...
抽象类和接口(全)
一、抽象类 1.概念:如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象,这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法,包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中,⼀个类如果被 abs…...
ubuntu中安装conda的后遗症
缘由: 在编译rk3588的sdk时,遇到编译buildroot失败,提示如下: 提示缺失expect,但是实测相关工具是在的,如下显示: 然后查找借助各个ai工具,重新安装相关的工具,依然无解。 解决&am…...
Netty自定义协议解析
目录 自定义协议设计 实现消息解码器 实现消息编码器 自定义消息对象 配置ChannelPipeline Netty提供了强大的编解码器抽象基类,这些基类能够帮助开发者快速实现自定义协议的解析。 自定义协议设计 在实现自定义协议解析之前,需要明确协议的具体格式。例如,一个简单的…...
