【Godot4自学手册】第三十七节钥匙控制开门

news2024/10/5 18:24:14

有些日子没有更新了,实在是琐事缠身啊,今天继续开始自学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,这样本节的内容就可以收工了。效果如下:
请添加图片描述

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

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

相关文章

vue+element作用域插槽

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

【Java开发指南 | 第十一篇】Java运算符

读者可订阅专栏&#xff1a;Java开发指南 |【CSDN秋说】 文章目录 算术运算符关系运算符位运算符逻辑运算符赋值运算符条件运算符&#xff08;?:&#xff09;instanceof 运算符Java运算符优先级 Java运算符包括&#xff1a;算术运算符、关系运算符、位运算符、逻辑运算符、赋值…

C语言入门案例-学生管理系统

要求&#xff1a;学员管理系统可以实现对学员的添加、全部显示、查询、修改、删除功能 完整代码示例&#xff1a; #include <stdio.h> // 定义容量 #define NUM 100//自定义结构体 typedef struct st {char name[30];int age;char sex[10]; }STU;//传入四个初始数据 STU…

PyTorch深度学习入门-2

PyTorch深度学习快速入门教程&#xff08;绝对通俗易懂&#xff01;&#xff09;【小土堆】_哔哩哔哩_bilibili 一、神经网络的基本骨架 --nn.Module Neutral network torch.nn — PyTorch 2.2 documentation * import torch from torch import nnclass xiaofan(nn.Module):…

1997-2022年各省技术市场发展水平数据(原始数据+计算过程+计算结果)

1997-2022年各省技术市场发展水平数据&#xff08;原始数据计算过程计算结果&#xff09; 1、时间&#xff1a;2000-2022年 2、来源&#xff1a;国家统计局、统计年鉴 3、范围&#xff1a;30省 4、指标&#xff1a;技术市场成交额、国内生产总值、技术市场发展水平 5、计算…

Git回滚版本并push到远端master

1、查看日志 git log 2、还原最近的版本 () --git reset --hard commit-id 如&#xff1a;git reset --hard d84da14bf2743683eca7a015f56114faaa344f42 3、覆盖分支版本 git push -f origin dev 回滚本地master完成后&#xff0c;将回滚后的代码push到远端master&#xf…

VIT论文阅读

论文地址&#xff1a;https://arxiv.org/pdf/2010.11929.pdf VIT论文阅读 摘要INTRODUCTION结论RELATEDWORKMETHOD1.VISIONTRANSFORMER(VIT)整体流程消融实验HEAD TYPE AND CLASSTOKENpoisitional embedding 整体过程公式Inductive biasHybrid Architecture 2.FINE-TUNINGANDH…

Nginx第1篇-安装和简单配置

Nginx可以做什么 可以做静态HTTP服务器做负载均衡做正向代理做反向代理 正向代理和反向代理 正向代理&#xff1a; 是一个位于客户端和目标服务器之间的服务器(代理服务器)&#xff0c;为了从目标服务器取得内容&#xff0c;客户端向代理服务器发送一个请求并指定目标&…

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内部…

单链表的应用

文章目录 目录1. 单链表经典算法OJ题目1.1 [移除链表元素](https://leetcode.cn/problems/remove-linked-list-elements/description/)1.2 [链表的中间节点](https://leetcode.cn/problems/middle-of-the-linked-list/description/)1.3 [反转链表](https://leetcode.cn/problem…

【八股】Redisson分布式锁

Redisson分布式锁 主要了解了Redisson分布式锁实现的三个功能&#xff1a; 1.可重入 -> 防止死锁 2.可重试&#xff08;i.e. 非阻塞获取锁&#xff09; 3.自动续约 1. 可重入 原理&#xff1a; 利用Redis的Hash结构&#xff0c;记录了使用当前锁的线程id和重用次数&#…

C++初级----list(STL)

1、 list介绍 1.1、 list介绍 1.list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。 1. list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指针指向 其前一…

git 分支-变基

在git中&#xff0c;将一个分支的更改集成到另一个分支有两种主要方式&#xff1a;合并&#xff08;merge&#xff09;和变基&#xff08;rebase&#xff09;。在本节中&#xff0c;将学习什么是变基&#xff0c;如何执行变基操作&#xff0c;为什么它是一个非常强大的工具&…

Web 题记

[极客大挑战 2019]LoveSQL 看到这种就肯定先想到万能密码&#xff0c;试试&#xff0c;得到了用户名和密码 总结了一些万能密码&#xff1a; or 11 oror admin admin-- admin or 44-- admin or 11-- admin888 "or "a""a admin or 22# a having 11# a havin…

vue2知识点1 ———— (vue指令,vue的响应式基础)

vue2的知识点&#xff0c;更多前端知识在主页&#xff0c;还有其他知识会持续更新 Vue 指令 Vue指令是Vue.js中的一个重要概念&#xff0c;用于向DOM元素添加特定行为或功能。Vue指令以v-开头&#xff0c;例如v-bind、v-if、v-for等。 v-bind 动态绑定属性 用法&#xff1a…

Linux sort/uniq/wc

文章目录 1. sort 排序将线程ID从大到小排序 2.uniq 临近去重3.wc word cnt 统计 1. sort 排序 将线程ID从大到小排序 grep -v是反向筛选&#xff0c;利用USER&#xff0c;排除掉首行 awk是打印第1 2列 sort -n是代码以数值大小做排序&#xff0c;不加的话会以字符排序。 -k是…

数通HCIE考试分享:考前心态很重要,心情放松好过一次练习

誉天数通HCIE晚班火热预约中&#xff01;真机实验考前辅导备考资料&#xff0c;名师保驾护航&#xff0c;助你稳定通关&#xff01;识别二维码&#xff0c;即可获取免费试听名额&#xff01; 备考阶段 我是去年10月底完成了笔试考试&#xff0c;在笔试之前就将PY的课程过了一遍…

白话transformer(六)编码器与解码器

B 站视频&#xff1a;https://www.bilibili.com/video/BV1fE421T7tR/?vd_source9e18a9285284a1fa191d507ae548fa01 白话transformer&#xff08;六&#xff09; 1、前言 今天我们将探讨Transformer模型中的两个核心组件&#xff1a;编码器和解码器。我们将通过一个具体的任务…

【数据分析】AHP层次分析法

博主总结&#xff1a;根据每个方案x各准则因素权重累加结果 对比来选择目标。数据主观性强 简介 AHP层次分析法是一种解决多目标复杂问题的定性和定量相结合进行计算决策权重的研究方法。该方法将定量分析与定性分析结合起来&#xff0c;用决策者的经验判断各衡量目标之间能…

微软开源 WizardLM-2,70B优于GPT4-0613,7B持平阿里最新的Qwen1.5-32B

当地时间4月15号&#xff0c;微软发布了新一代大语言模型 WizardLM-2&#xff0c;新家族包括三个尖端型号:WizardLM-2 8x22B, WizardLM-2 70B&#xff0c;和WizardLM-2 7B&#xff0c;作为下一代最先进的大型语言模型&#xff0c;它在复杂聊天、多语言、推理和代理方面的性能有…