千里之行,始于足下
零、前文回顾
在 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)
第八步,脚本中提供了两种显示/隐藏方法,测试如下;
测试完成!
四、免费开源资产包
某开源网站精灵图资源包链接: 点击此处
-
进入链接后点击下图按钮
-
然后点击【No thanks,just take me to the downloads】(不了谢谢,只想下载)
-
最后点击下图按钮完成下载(注意导入前需解压缩)