【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,这样本节的内容就可以收工了。效果如下:
请添加图片描述

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

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

相关文章

Tcpdump -r 解析pcap文件

当我们使用命令抓包后&#xff0c;想在命令行直接读取筛选怎么办&#xff1f;-r参数就支持了这个 当你使用 tcpdump 的 -r 选项读取一个之前捕获的数据包文件&#xff0c;并想要筛选指定 IP 地址和端口的包时&#xff0c;你可以在命令中直接加入过滤表达式。这些过滤表达式可以…

2024 年 Web 前端开发趋势

希腊哲学家赫拉克利特认为&#xff0c;变化是生命中唯一不变的东西。这句话适用于我们的个人生活、行业和职业领域。 尤其是前端开发领域&#xff0c;新技术、开发趋势、库和框架不断涌现&#xff0c;变化并不陌生。最近发生的一些事件正在改变开发人员构建网站和 Web 应用的方…

git 分支-变基

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

【题目】【信息安全管理与评估】2022年国赛高职组“信息安全管理与评估”赛项样题9

【题目】【信息安全管理与评估】2022年国赛高职组“信息安全管理与评估”赛项样题9 信息安全管理与评估 网络系统管理 网络搭建与应用 云计算 软件测试 移动应用开发 任务书&#xff0c;赛题&#xff0c;解析等资料&#xff0c;知识点培训服务 添加博主wx&#xff1a;liuliu548…

网工交换基础——MUX VLAN

前言&#xff1a; MUX VLAN&#xff08;Multiplex VLAN&#xff0c;多复用VLAN&#xff09;提供了一种通过VLAN进行网络资源控制的机制。例如&#xff0c;在企业网络中&#xff0c;企业员工和企业客户可以访问企业的服务器。对于企业来说&#xff0c;希望企业内部员工之…

Docker安装(一)

一、安装Docker 服务器系统&#xff1a;centos 7 1.本地有docker的首先卸载本机docker yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-selinux \docker-engine-selinux \dock…

selenum操作cookie进行免登陆【爬虫必修课1】

Selenium 操作 Cookie 进行免登录 使用 Selenium 自动化登录网站是一个常见的需求。但是直接输入用户名和密码登录非常不安全,同时每次登录都需要重复这个操作也很麻烦。一个更好的方式是使用 Cookie 进行免登录。 这篇博客就来介绍如何使用 Selenium 实现 Instagram 的免登录…

Vue3从入门到实战:深度掌握组件通信(下部曲)

5.组件通信方式5-$attrs $attrs的概念&#xff1a; 在Vue中&#xff0c;$attrs 是一个特殊的属性&#xff0c;用于访问父组件向子组件传递的非特定属性。它可以让子组件轻松地获取父组件传递的属性&#xff0c;而无需在子组件中显式声明这些属性。 想象一下你有一个父组件和…

C++进阶(2)-函数

目录 一、函数提高 1.1函数默认参数 1.2函数占位参数 1.3函数重载 1.3.1函数重载概述 1.3.2函数重载注意事项 二、类和对象 2.1封装 2.1.1封装的意义 2.1.2struct和class区别 2.1.3成员属性设置为私有 2.1.4封装案例 2.2对象的初始化和清理 2.2.1构造函数和析构函数 …

eNSP防火墙配置实验(trust、DMZ、untrust)

【拓扑】 设备 接口 IP地址/子网掩码/网关 AR1 G0/0/0 10.1.3.2/24 G0/0/1 100.1.1.2/24 FW1 G0/0/0 192.168.166.254/24 G1/0/0 10.1.1.1/24&#xff0c;trust域 G1/0/1 10.1.2.1/24&#xff0c;DMZ域 G1/0/2 100.1.3.1/24&#xff0c;untrust域 LSW1 G0/0/…

大孔树脂与凝胶型树脂的区别及应用

在工业和环境工程中&#xff0c;离子交换树脂被广泛用于处理水和废水&#xff0c;去除有害的化学物质。两种常见的离子交换树脂类型是大孔树脂和凝胶型树脂。尽管它们在功能上有所重叠&#xff0c;但在物理结构、性能和应用领域上存在显著差异。本文将探讨这两种树脂的特点、区…

微服务组件-注册中心

微服务组件-注册中心 使用restTemplate实现远程服务调用存在以下的问题&#xff1a; 1、消费者不知道如何获取服务提供者具体信息。 2、在远程调用的过程中&#xff0c;直接采用填写url的硬编码方式&#xff0c;如果服务消费者发生变化&#xff0c;得到的结果就会出错。 3、如果…

vue+element作用域插槽

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

基于SpringBoot+Vue的二手车交易系统的设计与实现(源码+文档+包运行)

一.系统概述 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统二手车交易信息管理难度大&#xff0c;容错率低&…

初识ansible核心模块

目录 1、ansible模块 1.1 ansible常用模块 1.2 ansible-doc -l 列出当前anisble服务所支持的所有模块信息&#xff0c;按q退出 1.3 ansible-doc 模块名称 随机查看一个模块信息 2、运行临时命令 2.1 ansible命令常用的语法格式 3、常用模块详解与配置实例 3.1命令与…

​宁德时代:用一块电池玩转两个万亿赛道

2022 到 2023 连续两年&#xff0c;被称为国内储能行业的大储&#xff08;发电侧、电网侧&#xff09;元年和中储&#xff08;工商业&#xff09;元年&#xff0c;整个储能行业可谓是异常火爆&#xff0c;众多资本或企业纷纷涌入该赛道。 对于行业从业者来说&#xff0c;所从事…

力扣HOT100 - 206. 反转链表

解题思路&#xff1a; 迭代&#xff08;双指针&#xff09; class Solution {public ListNode reverseList(ListNode head) {ListNode cur head, pre null;while(cur ! null) {ListNode tmp cur.next; // 暂存后继节点 cur.nextcur.next pre; // 修改 next 引用指…

MOSFET效应管

【学习笔记】 金属氧化物半导体场效应晶体管&#xff08;Metal Oxide Semiconductor Field Effect Transistor&#xff0c;简称MOSFET&#xff09; MOSFET是三个端子器件&#xff0c;具有栅极、漏极和源极&#xff0c;栅极端子与漏极和源极之间的主导电流通道电气隔离&#xf…

连锁服装店用哪个进销存软件好

连锁服装店的进销存管理对于业务的高效运作至关重要&#xff0c;而选择合适的进销存软件能够极大地提升管理效率和经营水平。本文将介绍四款优秀的进销存软件&#xff0c;并重点关注商淘云连锁服装进销存管理系统&#xff0c;探讨其特点和优势。 1. 商淘云连锁服装进销存管理系…

喜报|炼石入选2024中国网络安全全景图 密码与数据安全六领

2024年4月12日&#xff0c;国内专业安全媒体安全牛发布《中国网络安全行业全景图&#xff08;第十一版&#xff09;》。第十一版全景图划分了16个一级安全分类和108个二级安全分类&#xff0c;汇集了510家安全厂商申报&#xff0c;实际收录为454家。全景图综合考量了产品的实用…