这节主要学习将场景添加到TileSet作为TileMap来搭建背景。同时,主人公进入房子后面,房子变得半透明,离开房子后房子变的不透明。
一、创建新场景
首先导入房子素材,最终文件系统内容如下:
点击新建场景按钮,然后选择其它节点,在弹出对话框中找到StaticBody2D节点,点击创建。
为啥选用StaticBody2D节点,是因为房子是不可移动的符合StaticBody2D节点特征。StaticBody2D节点表示无法被外力移动的 2D 物理物体。无法因外力和接触而移动,但可以通过代码方法手动移动。添加节点后会在节点后面有个叹号,双击提示如下:
给 添加连个子节点:
一是Sprite2D节点,将房屋的图片拖到该节点检查器texture内,如下图:
二是CollisionPolygon2D节点。然后在主场景中沿着房屋边缘绘制碰撞形状,最终效果如下:
最后保存该场景到Scenes文件夹下,命名为House。
二、将场景添加到TileSet绘制背景
切换到TileSet面板,把House场景添加到图块内,第一步切换到TileSet选项卡,第二步添加按钮选择场景合集;第三步将House.tscn拖入到场景集合内,这样就可以绘制背景了,操作过程如下:
切换到TileMap就可以在场景中绘制房屋了。
三、主人公走到房子后面房子变得半透明
切换到House场景,在House结点下Area2D结点,Area2D结点下添加CollisionShape2D结点,CollisionShape2D检查器中shap属性选择RectangleShape2D表示2D 矩形。整个过程如下:
选择House结点,单击添加脚本按钮,选择脚本存放路径为Scripts文件夹内,如下:
代码中只保留下一行,其他删除。
extends StaticBody2D
然后选择Area2D结点,在结点选项卡中将body_entered信号添加到House结点的文本中。
这样会在代码中添加func _on_area_2d_body_entered(body):代码。简单介绍一下body_entered信号和body_exite信号。
1.body_entered(body: Node2D)当接收到的 body 进入这个区域时发出的。body 可以是一个 PhysicsBody2D 或一个 TileMap。如果 TileMap 的 TileSet 配置了碰撞形状,就会被检测到。需要将 monitoring 设置为 true 。
2.body_exited(body: Node2D)当接收到的 body 离开这个区域时发出的。body 可以是一个 PhysicsBody2D 或一个 TileMap。如果 TileMap 的 TileSet 配置了碰撞形状,就会被检测到。要求 monitoring 被设置为 true 。
同理在House代码中添加body_exited信号。然后将代码完善成如下:
extends StaticBody2D
@onready var house = $Sprite2D #获取房屋图片
func _on_area_2d_body_entered(body):
#当主人公与入Area2D区域
if body.name=="Player":#进入该区域的是主人公
house.modulate.a =0.5#透明度设置为0.5
func _on_area_2d_body_exited(body):
#当主人公离开Area2D区域
if body.name=="Player":#走出该区域的是主人公
house.modulate.a =1#透明度设置为1
这段代码表示当主人公进入Area2D区域后,房子变成透明;当主人公离开Area2D区域后,房子变为不透明。
最终演示效果如下所示:
这一节就到此了,同学再见!