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

【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自学手册】第三十七节钥匙控制开门

有些日子没有更新了&#xff0c;实在是琐事缠身啊&#xff0c;今天继续开始自学Godot4&#xff0c;继续完善地宫相关功能&#xff0c;在地宫中安装第二道门&#xff0c;只有主人公拿到钥匙才能开启这扇门&#xff0c;所以我们在合适位置放置一个宝箱&#xff0c;主人公开启宝箱…...

GitHub repository - Pulse - Contributors - Network

GitHub repository - Pulse - Contributors - Network 1. Pulse2. Contributors3. NetworkReferences 1. Pulse 显示该仓库最近的活动信息。该仓库中的软件是无人问津&#xff0c;还是在火热地开发之中&#xff0c;从这里可以一目了然。 2. Contributors 显示对该仓库进行过…...

RocketMQ 10 面试题FAQ

RocketMQ 面试FAQ 说说你们公司线上生产环境用的是什么消息中间件? 为什么要使用MQ&#xff1f; 因为项目比较大&#xff0c;做了分布式系统&#xff0c;所有远程服务调用请求都是同步执行经常出问题&#xff0c;所以引入了mq 解耦 系统耦合度降低&#xff0c;没有强依赖…...

【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 &#xff0c;请你找出数组中乘积最大的非空连续子数组&#xff08;该子数组中…...

项目实战之网络电话本之发送邮件名片和导出word版个人信息

1、项目介绍 1&#xff09;项目功能 用户管理&#xff1a;分为管理员、和普通用户&#xff0c;设置不同用户的权限 电话本信息管理&#xff1a;支持管理员和普通用户对电话本的信息进行增删改操作&#xff0c;模糊查询&#xff08;根据姓名、地址、单位&#xff09; 文件批…...

前端面试问题汇总 - HTTP篇

1. 登录拦截如何实现&#xff1f; 在前端&#xff0c;可以拦截所有需要登录的请求&#xff0c;如果用户未登录或者登录过期&#xff0c;则跳转到登录页面。 2. http 缓存有哪些&#xff1f; 强缓存&#xff1a; 强缓存是指在客户端请求资源时&#xff0c;先检查本地是否存在缓存…...

Java的IO流

Day35 Java的IO流 概念 Java的IO流是用来处理输入和输出操作的机制&#xff0c;用于在程序和外部数据源&#xff08;如文件、网络连接、内存等&#xff09;之间进行数据传输。Java的IO流主要分为字节流和字符流两种类型&#xff0c;每种类型又分为输入流和输出流。 理解&#…...

Node.js 中的 RSA 加密、解密、签名与验证详解

引言 在现代的网络通信中&#xff0c;数据安全显得尤为重要。RSA加密算法因其非对称的特性&#xff0c;广泛应用于数据的加密、解密、签名和验证等安全领域。本文将详细介绍RSA算法的基本原理&#xff0c;并结合Node.js环境&#xff0c;展示如何使用内置的crypto模块和第三方库…...

vue+element作用域插槽

作用域插槽的样式由父组件决定&#xff0c;内容却由子组件控制。 在el-table使用作用域插槽 <el-table><el-table-column slot-scope" { row, column, $index }"></el-table-column> </el-table>在el-tree使用作用域插槽 <el-tree>…...

MUSA模型

MUSA模型在软件可靠性工程中起到的作用是估计软件的故障/失效数量和故障率。具体来说&#xff0c;MUSA模型包括基本模型和对数模型。 MUSA基本模型假设故障发生的时间间隔服从参数为lambda的指数分布。在这个模型中&#xff0c;当故障被检测到时&#xff0c;发生故障的部分会被…...

avicat连接异常,错误编号2059-authentication plugin…

错误原因为密码方式不对&#xff0c;具体可自行百度 首先管理员执行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 项目如何部署

今天给大家分享一下&#xff0c;作为个人开发者&#xff0c;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、返回值可以使用通配符&#xff0c;表示任…...

学习记录:转发和重定向

转发&#xff08;Forward&#xff09;和重定向&#xff08;Redirect&#xff09;是两种不同的 Web 请求处理方式&#xff0c;它们在功能和行为上有着显著的区别。 区别 转发&#xff08;Forward&#xff09;&#xff1a; 服务器内部跳转&#xff1a;转发是服务器内部的行为&…...

实现(图像、视频等)数据上云存储

实现&#xff08;图像、视频等&#xff09;数据上云存储 实现&#xff08;图像、视频等&#xff09;数据上云存储通常涉及以下几个步骤&#xff1a; 选择云存储服务商&#xff1a; 根据您的需求、预算、地域覆盖、数据安全性、服务稳定性等因素&#xff0c;选择一家合适的云存储…...

LeetCode 454.四数相加II

LeetCode 454.四数相加II 1、题目 题目链接&#xff1a;454. 四数相加 II - 力扣&#xff08;LeetCode&#xff09; 给你四个整数数组 nums1、nums2、nums3 和 nums4 &#xff0c;数组长度都是 n &#xff0c;请你计算有多少个元组 (i, j, k, l) 能满足&#xff1a; 0 <…...

GoogleNet网络训练集和测试集搭建

测试集和训练集都是在之前搭建好的基础上进行修改的&#xff0c;重点记录与之前不同的代码。 还是使用的花分类的数据集进行训练和测试的。 一、训练集 1、搭建网络 设置参数&#xff1a;使用辅助分类器&#xff0c;采用权重初始化 net GoogleNet(num_classes5, aux_logi…...

将数字状态码在后台转换为中文状态

这是我们的实体类 可以看出我们的状态status是2如过返回到前端我们根本不知道2代表的是什么&#xff0c;所以我们需要再这里将数字转换成能看懂的中文状态&#xff0c;首先我们创建一个枚举类 先将我们状态码所对应的中文状态枚举出来&#xff0c;然后创建一个静态方法&#…...

2017NOIP普及组真题 4. 跳房子

线上OJ&#xff1a; 一本通&#xff1a;http://ybt.ssoier.cn:8088/problem_show.php?pid1417\ 核心思想 首先、本题中提到 “ 至少 要花多少金币改造机器人&#xff0c;能获得 至少 k分 ”。看到这样的话语&#xff0c;基本可以考虑要使用 二分答案。 那么&#xff0c;本题中…...

网络与 Internet因特网的基本概念

目录 网络Internet &#xff08;互联网或互连网&#xff09;Internet&#xff08;因特网&#xff09;待续、更新中 网络 指将分布在不同地理位置的、相同或不同类型的网络通过网络互连设备&#xff08;中继器、网桥、路由器或网关等&#xff09;相互连接&#xff0c;形成一个范…...

vue-router 中 router-link 与 a 标签的区别

文章目录 前言 a标签定义 router-link定义 总结 前言 vue-router 中 router-link 与 a 标签的区别 a标签定义 <a> 标签定义超链接&#xff0c;用于从一张页面链接到另一张页面。 从一张页面跳转到另一张页面&#xff0c;但从这里来说就违背了多视图的单页Web应用这个…...

MySQL基础知识——MySQL事务

事务背景 什么是事务&#xff1f; 一组由一个或多个数据库操作组成的操作组&#xff0c;能够原子的执行&#xff0c;且事务间相互独立&#xff1b; 简单来说&#xff0c;事务就是要保证一组数据库操作&#xff0c;要么全部成功&#xff0c;要么全部失败。 注&#xff1a;MyS…...

【架构方法论(一)】架构的定义与架构要解决的问题

文章目录 一. 架构定义与架构的作用1. 系统与子系统2. 模块与组件3. 框架与架构4. 重新定义架构&#xff1a;4R 架构 二、架构设计的真正目的-别掉入架构设计的误区1. 是为了解决软件复杂度2. 简单的复杂度分析案例 三. 案例思考 本文关键字 架构定义 架构与系统的关系从业务逻…...

基于springboot实现人口老龄化社区服务与管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现人口老龄化社区服务与管理系统演示 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了人口老龄化社区服务与管理平台的开发全过程。通过分析人口老龄化社区服务与管理平台方面的不足&#xff…...

代码随想录算法训练营第三十七天| LeetCode 738.单调递增的数字、总结

一、LeetCode 738.单调递增的数字 题目链接/文章讲解/视频讲解&#xff1a;https://programmercarl.com/0738.%E5%8D%95%E8%B0%83%E9%80%92%E5%A2%9E%E7%9A%84%E6%95%B0%E5%AD%97.html 状态&#xff1a;已解决 1.思路 如何求得小于等于N的最大单调递增的整数&#xff1f;98&am…...

C++动态内存管理 解剖new/delete详细讲解(operator new,operator delete)

讨厌抄我作业和不让我抄作业的人 讨厌插队和不让我插队的人 讨厌用我东西和不让我用东西的人 讨厌借我钱和不借给我钱的人 讨厌开车加塞和不让我加塞的人 讨厌内卷和打扰我内卷的人 一、C中动态内存管理 1.new和delete操作内置类型 2.new和delete操作自定义类型 二、operat…...

python-re正则笔记0.2.0

1. 匹配linux文件路径 from re import match, search,findall str"sh refreshConfig.sh /opt/client/ccc.txt /opt/client/ccc.dfs 胜多负少的"patter1"\/.\.\w" print(findall(patter1, str))""" [/opt/client/ccc.txt /opt/client/ccc…...

.NET SignalR Redis实时Web应用

环境 Win10 VS2022 .NET8 Docker Redis 前言 什么是 SignalR&#xff1f; ASP.NET Core SignalR 是一个开放源代码库&#xff0c;可用于简化向应用添加实时 Web 功能。 实时 Web 功能使服务器端代码能够将内容推送到客户端。 适合 SignalR 的候选项&#xff1a; 需要从服…...

wordpress trac/刷粉网站推广快点

深度学习和强化学习之间的结合给人工智能带来了无数的机会。然而&#xff0c;稀疏的奖励环境对强化学习的研究者而言是一个需要长期面临的挑战。在不提供信息的奖励信号上设定参数通常会使学习收敛到次优策略。DeepMind的Unsupervised Reinforcement and Auxiliary Learning (简…...

黄江镇网站建设公司/成人用品哪里进货好

今天在知乎浏览时忽然发现了一个有趣的东西&#xff0c;php竟然可以实现协程的实现&#xff0c;而且还是通过go关键字实现&#xff0c;顿时感觉php现在发展的好迅速&#xff0c;竟然把go里的东西都借鉴去。只不过这是在一个叫Swoole的框架中实现的。Swoole4为PHP语言提供了强大…...

做公益网站需要什么资质/win7优化大师

*.Java文件 问题&#xff1a;一个".java"源文件中是否可以包括多个类&#xff08;不是内部类&#xff09;&#xff1f;有什么限制&#xff1f; 答案&#xff1a;可以有多个类&#xff0c;但只能有一个public的类&#xff0c;并且public的类名必须与文件名相一致。一个…...

免费企业查询软件/站长工具seo综合查询下载

优废再生资源2020年12月25日废料回收参考行情类别地区品名价格区间单位涨跌废铜广东1#铜管51700-51900元/吨100广东二号铜47900-48200元/吨100广东马达铜47900-48200元/吨100广东紫杂铜41000-41200元/吨100广东破碎紫铜47900-48200元/吨100广东黄杂铜32200-32400元/吨100广东破…...

网站建设与管理代码/百度站长收录提交入口

微信小程序的特点 想办法让你客户赚钱低频应用 &#xff08;例如工具类&#xff0c;计算器&#xff0c;查汇率&#xff09;利用好微信的用户群体 扫一扫搜一搜善用分享微信小程序注意事项 小程序考虑线下&#xff0c;app解决复杂应用场景功能上做减法一个大app拆分成多个小程序…...

做网站如何选择颜色/网页开发教程

github下载的Demo&#xff0c;很多时候使用到CocoaPods&#xff0c;有的时候因为依赖关系或者版本问题不能编译运行。出现例如The sandbox is not sync with the Podfile.lock问题时候 解决方案:关闭当前的工作空间&#xff0c;删除掉文件夹中的workspace&#xff0c;然后重新p…...