Godot4.3类星露谷游戏开发之【自动门与显隐屋顶】

千里之行,始于足下

零、前文回顾

Godot4.3类星露谷游戏开发之【创建家园】中房屋的基础上,创建自动开关门。思路:为门和房顶提供一个感觉区域( Area2D 节点),当玩家进入/离开这个区域时,该区域就发出信号,告知门->开/关,以及房顶->显示/隐藏。

一、创建门场景

第一步,我们新建场景与节点;

  • 门(StaticBody2D
    • AnimatedSprite2D
    • CollisionShape2D

在这里插入图片描述
(Tips:StaticBody2D用于固定物体,CharacterBody2D用于可控制的移动物体。)

第二步,选中 AnimatedSprite2D 节点,在检查器中新建 SpriteFrame

在这里插入图片描述
第三步,在底栏打开SpriteFrame,更改 动画名帧数 ,关闭 循环 并开启 自动播放

在这里插入图片描述
第四步,新建动画 开门,关闭 循环

在这里插入图片描述

第五步,从 res://资产/Sprout Lands - Sprites - Basic pack/Tilesets 路径中导入 (下载链接见文末);

在这里插入图片描述

第六步, 默认 动画导入时,水平设置为1,垂直设置为4,选中门后添加;

在这里插入图片描述
在这里插入图片描述
第七步, 开门 动画导入时,水平设置为1,垂直设置为4,按图中顺序选中门后添加;

在这里插入图片描述
在这里插入图片描述
第八步,选中 CollishionShape2D 节点,在检查器新建长方形碰撞体,并调整大小以适应门;

在这里插入图片描述
在这里插入图片描述
第九步,将门场景保存在 res://场景/家园 路径下;

在这里插入图片描述

二、自动开关门

第一步,我们新建场景与节点;

  • 可交互组件(Area2D

在这里插入图片描述
第二步,将可交互组件保存在 res://场景/组件 路径下;

在这里插入图片描述
第三步,在检查器中连接信号body_entered(body:Node2D), body_exited(body: Node2D);

在这里插入图片描述
第四步,给 可交互组件 附加脚本;

extends Area2D

signal 已进入
signal 已离开


func _on_body_entered(body: Node2D) -> void:
	已进入.emit()


func _on_body_exited(body: Node2D) -> void:
	已离开.emit()
	

第五步,将可交互组件添加到 场景下,并添加 CollishionShape2D 节点,在检查器中设为 胶囊形 碰撞体;

在这里插入图片描述
第六步,在 项目设置->常规->层名称 中,将Layer4命名为交互组件

在这里插入图片描述
第七步,将 可交互组件 场景的物理层设为4(交互组件层),物理掩码层设置为2(玩家层);

在这里插入图片描述
第八步,给 附加脚本;

extends StaticBody2D

@onready var 可交互组件: Area2D = $"可交互组件"
@onready var animated_sprite_2d: AnimatedSprite2D = $AnimatedSprite2D

func _ready() -> void:
	可交互组件.已进入.connect(开门)
	可交互组件.已离开.connect(关门)
	# 默认碰撞生效
	collision_layer = 1


func 开门() ->void:
	animated_sprite_2d.play("开门")
	# 碰撞失效
	collision_layer = 2
	
	
func 关门() ->void:
	# 倒放开门动画,即关门
	animated_sprite_2d.play_backwards("开门")
	# 碰撞生效
	collision_layer = 1

第九步,在 res://场景/家园/房屋.tscn 进入房屋场景,选中 墙壁 节点后,在TileSet中添加场景合集;

在这里插入图片描述
在场景合集中导入 场景;

请添加图片描述
第十步,在 房屋 场景中绘制门;

请添加图片描述
第十一步,回到 测试_房屋 场景,进行测试;

请添加图片描述

三、自动显隐的屋顶

第一步,转到 房屋 场景,添加子节点 房顶(TileMapLayer) 节点;

在这里插入图片描述
第二步,从路径 res://资产/Sprout Lands - Sprites - Basic pack/Tilesets/ 中导入TileSet(下载链接见文末);

在这里插入图片描述
第三步,在TileSet中选中如图所示图块;

在这里插入图片描述
第四步,在TileMap中绘制屋顶;

由于是俯视角,所以屋顶应该在中间偏上位置,上方的屋檐越过墙壁,下方的屋檐与墙壁平齐:

在这里插入图片描述
注意,有些瓦片是有光影变化的,这里只做简单的无光影变化的成品展示:

在这里插入图片描述
第五步,为房顶节点添加子节点 可交互组件CollishionShape2D 节点;

在这里插入图片描述
第六步,设置CollishionShape2D的碰撞体形状为 长方形

在这里插入图片描述
第七步,为 房顶 节点附加脚本;

extends TileMapLayer

@onready var 可交互组件: Area2D = $"可交互组件"

func _ready() -> void:
	可交互组件.已进入.connect(隐藏)
	可交互组件.已离开.connect(显示)


func 隐藏() ->void:
	# 第一种效果:完全隐藏
	#hide()
	# 第二种效果:部分隐藏
	modulate = Color(1, 1, 1, 0.5)
	

func 显示() ->void:
	# 显示
	#show()
	# 第二种显示
	modulate = Color(1, 1, 1, 1)

第八步,脚本中提供了两种显示/隐藏方法,测试如下;

请添加图片描述
请添加图片描述
测试完成!

四、免费开源资产包

某开源网站精灵图资源包链接: 点击此处

  1. 进入链接后点击下图按钮
    下载

  2. 然后点击【No thanks,just take me to the downloads】(不了谢谢,只想下载)
    No thanks,just take me to the downloads

  3. 最后点击下图按钮完成下载(注意导入前需解压缩)
    下载