【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: #如果当前血量和输入血量相同,就会退出
			return
		health = v #将当前血量设置为输入值
		health_changed.emit()  #发出信号
		
@onready var coincount:int=0:  #定义金币数量默认为0
	set(v): #输入金币数量
		coincount=v  #当前金币数量设置为输入值
		coin_changed.emit()  #发出金币改变信号

@onready var keycount:int=0: #定义钥匙数量,默认为0
	set(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:  #果主人公钥匙数量为0
			tips.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,这样本节的内容就可以收工了。效果如下:
请添加图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

张大哥笔记:电脑周边的10大刚需创业小项目

hello&#xff0c;大家好&#xff0c;我是张大哥&#xff0c;今天一口气给大家分享围绕电脑周边的10大刚需创业小项目&#xff0c;本文章旨在帮助大家如何快速切入到细分领域里面搞钱&#xff01; 如何赚钱&#xff0c;无非就是解决人群痛点&#xff0c;你要懂得根据用户痛点去…

命令模式

命令模式&#xff1a;将一个请求封装为一个对象&#xff0c;从而使你可用不同的请求对客户进行参数化&#xff1b;对请求排队或记录请求日志&#xff0c;以及支持可撤销的操作。 命令模式的好处&#xff1a; 1、它能较容易地设计一个命令队列&#xff1b; 2、在需要的情况下&a…

Scala 02——Scala OOP

文章目录 Scala 02——Scala OOP前序类1. 类的基本结构2. 普通类和数据类的区别 继承1. extends2. override 抽象类抽象类的特点 单例对象1. 定义2. 场景3. 方法3.1 方法定义3.2 方法调用 特质1. 抽象类和特质的区别2. 强制混入语法3. 静态混入和动态混入 内部类Java和Scala内部…

EelasticSearch是什么?及EelasticSearch的安装

一、概述 Elasticsearch 是一个基于 Apache Lucene 构建的开源分布式搜索引擎和分析引擎。它专为云计算环境设计&#xff0c;提供了一个分布式的、高可用的实时分析和搜索平台。Elasticsearch 可以处理大量数据&#xff0c;并且具备横向扩展能力&#xff0c;能够通过增加更多的…

HarmonyOS Next 视频弹幕功能

视频弹幕功能 介绍 本示例介绍如何使用ohos.danmakuflamemaster和ohos.gsyvideoplayer开发支持视频弹幕的播放器。可以自定义弹幕样式、占据屏幕宽度&#xff0c;发送弹幕&#xff0c;开关弹幕视图。 效果图预览 使用说明 点击播放按钮&#xff0c;进行视频播放&#xff0c…

Windows版Apache 2.4.59解压直用(免安装-绿色-项目打包直接使用)

windows下Apache分类 Apache分为 安装版和解压版 安装版: 安装方便&#xff0c;下一步------下一步就OK了&#xff0c;但重装系统更换环境又要重新来一遍&#xff0c;会特别麻烦 解压版&#xff08;推荐&#xff09;&#xff1a; 这种方式&#xff08;项目打包特别方便&#x…

TLS v1.3 导致JetBrains IDE jdk.internal.net.http.common CPU占用高

开发环境 GoLand版本&#xff1a;2022.3.4 问题原因 JDK 中的 TLS v1.3 实现引起 解决办法 使用 SOCKS 代理代替HTTP代理 禁用 Space 和 Code With Me 插件 禁用 TLS v1.3&#xff0c;参考&#xff1a;https://stackoverflow.com/questions/54485755/java-11-httpclient-…

深度解析Java JDK 1.8中Stream流的源码实现:带你探寻数据流的奥秘

文章目录 一、 Stream流概述1.1 什么是Stream流&#xff0c;以及它的主要特点和优势1.2 Stream流的基本操作&#xff1a;过滤、映射、排序等 二、 Stream流源码解析2.1 接口和基本概念2.2 创建流2.3 源码分析2.3.1 流的起始2.3.2 流的初始2.3.3 认识BaseStream2.3.4 Stream接口…

【C++程序员的自我修炼】初始化列表

一半烟火以谋生 一半诗意以谋爱 契子✨ 我们之前已经讲过了构造函数的初始化&#xff1a;前期回顾-构造函数 但是难免会遇到连构造函数都不好解决的问题 比如&#xff1a; 错误示范 class A { public:A(int n){this->_a n;this->_b n;} private:const int _a;int…

JS-43-Node.js02-安装Node.js和npm

Node.js是一个基于Chrome V8引擎的JavaScript运行时环境&#xff0c;可以让JavaScript实现后端开发&#xff0c;所以&#xff0c;首先在本机安装Node.js环境。 一、安装Node.js 官网&#xff1a;下载 Node.js 默认两个版本的下载&#xff1a; 64位windows系统的LTS(Long Tim…

记录一下我102连不上MySQL的问题 NotBefore

【背景描述】我在102上是能登录上MySQL的&#xff0c;但是用客户端&#xff08;DataGrip、SQLyog就连不上&#xff09; 【解决方案】 加个这个?useSSLfalse&serverTimezoneUTC 【另外的小问题】如果直接输mysql 上面这个不是报错&#xff0c;不用管 再输mysql -uroot -p…

Ubuntu系统安装APITable多维表格平台结合内网穿透实现公网访问

文章目录 前言1. 部署APITable2. cpolar的安装和注册3. 配置APITable公网访问地址4. 固定APITable公网地址 前言 vika维格表作为新一代数据生产力平台&#xff0c;是一款面向 API 的智能多维表格。它将复杂的可视化数据库、电子表格、实时在线协同、低代码开发技术四合为一&am…

mybatis-puls 条件分析插件

一&#xff0c;能做什么 我们在平时的开发中,会遇到一些慢sql. MP也提供了性能分析插件,如果超过这个时间就停止运行! 二&#xff0c;如何实现 2.1引入条件分析插件 //性能分析BeanProfile({"dev","test"}) //设置dev 和 test环境开启public Performanc…

【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题

文章目录 一、什么是时间复杂度和空间复杂度&#xff1f;1.1 算法效率1.2 时间复杂度的概念1.3 空间复杂度的概念1.4 复杂度计算在算法中的意义 二、时间复杂度的计算2.1 大O渐进表示法2.2 常见时间复杂度计算举例 三、空间复杂度的计算四、Leetcode刷题1. 消失的数2. 旋转数组…

探索设计模式的魅力:融合AI大模型与函数式编程、开启智能编程新纪元

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 ✨欢迎加入探索AI大模型与函数式编程模式融合之旅✨ 在编程世界的广阔疆域里&#xff0c;两大…

组织机构代码是哪几位?营业执照怎么看组织机构代码?

组织机构代码是哪几位? 组织机构代码通常指的是组织机构代码证上的一组特定数字&#xff0c;它用于唯一标识一个组织或机构。在中国&#xff0c;组织机构代码由9位数字组成&#xff0c;前8位是本体代码&#xff0c;最后1位是校验码。这组代码是按照国家有关标准编制的&#x…

第一部分-基础入门-学习导航

专题地址:MacOS一站式程序开发系列专题 第一部分:基础入门学习导航 OSX-01-Mac OS应用开发概述:简单介绍下MacOS生态、Xcode使用以及使用Xcode创建app的方法OSX-02-Mac OS应用开发系列课程大纲和章节内容设计:介绍下此系列专题的文章内容组织形式以及此系列专题的覆盖内容…

帮助中心最核心的内容,你都知道吗?

帮助中心&#xff0c;其实就是个解决问题的“百事通”。当你在使用某产品时&#xff0c;遇到了一些问题&#xff0c;就可以到帮助中心去查询相关的信息以解决问题。很多公司都会搭建帮助中心&#xff0c;那么&#xff0c;帮助中心的核心内容都有哪些呢&#xff1f;这就是今天我…

K8s拉取habor镜像

目录 在daemon.json中添加仓库地址 重新加载daemon.json并重启docker 在目标node节点添加域名 验证目标node是否能正常登录镜像仓库 创建pod资源 加载yml文件 验证 查看pod的ip与端口号 在daemon.json中添加仓库地址 此处需要在创建资源对象所在的节点进行添加 路径&a…

c++的学习之路:24、 二叉搜索树概念

摘要 本章主要是讲一下二叉搜索树的实现 目录 摘要 一、二叉搜索树概念 二、 二叉搜索树操作 1、二叉搜索树的查找 2、二叉搜索树的插入 3、二叉搜索树的删除 三、二叉搜索树的实现 1、插入 2、中序遍历 3、删除 4、查找 四、二叉搜索树的递归实现 1、插入 2、删…