各位同学,本节主要完成屋内场景碰撞添加,人物在屋内移动,处于正常位置;从屋内返回主人公出现在房屋门口正常位置。开始啦:
一、屋内添加场景碰撞
在第九节人物碰撞、遮挡关系背景搭建中,我们学习了给图片添加碰撞方法。今天,学习另一种方法,整体给房屋内部添加碰撞。
切换到InnerHouse场景,给根节点添加StaticBody2D节点,并StaticBody2D为节点添加2个CollisionPolygon2D节点,第一个节点沿着房屋边距画出碰撞边界,第二个节点沿着桌椅画出碰撞边界,最终效果如下图所示:
通过上述操作,会给房间内的物体添加碰撞区域,主人公就不能走到这些区域了,符合常识,演示效果如下:
二、返回主场景正确位置
一是创建全局变量。
在菜单栏上选择项目,选择项目设置,在对话框中切换到自动加载选项卡,然后在节点名称中输入Globals,单击添加,在弹出的对话框中选择脚本存放路径“res://Scripts/”,最后选择创建,整个操作过程如下图:
这样,就会创建一个res://Scripts/globals.gd
最后编辑脚本如下:
extends Node
var last_Player
上述操作是创建一个全局变量,用于记录主人公的位置。
二是添加Area2D节点记录主人公位置
切换到House场景,添加Area2D节点命名为PlayerPositon,为其添加子节点CollisionShape2D,在检查器CollisionShape2D中Shap图形选择圆形,并拖动到房屋门口前方,如下图所示:
将Area2D节点的信号添加到house.gd脚本下,具体操作如下:
下面开始编辑脚本:
func _on_player_positon_body_entered(body):
if body.name=="Player":
Globals.last_Player = body.global_position
这段代码实现了,主人公进入PlayerPositon节点区域,自动记录一下主人公的位置到全局变量。
三是主场景中自动加载全局变量
切换到主场景,为主场景的根节点添加脚本,并编写如下脚本:
extends Node2D
@onready var player=$Player
# Called when the node enters the scene tree for the first time.
func _ready():
if Globals.last_Player:
player.global_position = Globals.last_Player
这段代码实现了,主场景展示时,人物在指定位置显示。
三、演示效果
这样,我们的场景切换就OK了。最终效果如下:
简单回顾一下本节的内容,一是给房屋内添加CollisionPolygon2D节点,为物体添加上碰撞;二是创建全局变量,在主人公进入屋内记录最后位置,从屋内返回主场景,将主人公展示到指定位置。
同学们,下节再见!