【Godot4自学手册】第十一节主场景和房屋内部场景相互切换
这节,我主要学习场景切换,主人公进入门口会进入房间内部,这样就需要进行场景切换。这节绘制了一个房屋内部场景,用到的大部分都是上一节内容,新内容搭建动画背景图片,我进行了重点介绍和学习。
这节,我主要学习场景切换,主人公进入门口会进入房间内部,这样就需要进行场景切换。这节绘制了一个房屋内部场景,用到的大部分都是上一节内容,新内容搭建动画背景图片,我进行了重点介绍和学习。
一、房屋内部场景搭建
1.新建一个场景,选择Node2D结点,在该节点下添加TileMap结点用于绘制房屋内部场景;添加Camera2D节点,根据相机的大小绘制场景大小。
TileMap结点共设置两层一个是back层,一个是Objec层。back层用于搭建不可碰撞背景,object层用于搭建可碰撞背景物品。最终搭建效果如下:
大部分场景搭建在上一节我们都学过了,不知赘述,下面注重介绍一下钟摆的动画背景搭建。
2.搭建动画背景图片
在TileSet面板,选中动画时钟的4张16*16的小图片,在图块选项卡中的选择选项卡下面动画设置,列数写入3,速度设为1,其他不变;Frames中时长全部设置为0.5,具体情况如下:
这样设置以后,切换到TileMap选项卡下,绘制图片就可以做成动画了,最终钟表效果如下:
二、实现场景切换
在House场景跟结点下添加Area2D结点命名为Door,并在该节点添加CollisionShape2D,碰撞图形选择矩形,并把矩形一道门的位置,具体设置如下:
下一步,切换到Door结点,检查器方面切换到结点选项卡,然后双击body_entered结点,在弹出的对话框选择House根节点,点击链接,操作如下:
点击链接后,会在House脚本中自动添加如下代码:
func _on_door_body_entered(body):
pass # Replace with function body.
把这段代码修改如下:
func _on_door_body_entered(body):
if body.name=="Player":
get_tree().change_scene_to_file("res://Scenes/InnerHouse.tscn")
这段代码就是当主人公与Door碰撞后就会只执行场景转换到房屋内部,预览一下效果:
这样就切换到房间内部了,但是切换到房间内部,发现主人公不见了,下面就解决主人公不见的问题。
三、场景切换时如何添加主人公
切换到InnerHouse场景,给根节点添加Marker2D结点,把结点移动到门口位置,如下图所示:
给InnerHouse根节点添加InnerHouse脚本,保存到res://Scripts内。然后编写如下代码:
extends Node2D
@onready var playerSpawn = preload("res://Scenes/player.tscn")
func _ready():
call_deferred("spawn_player")
func spawn_player():
var player = playerSpawn.instantiate()
player.global_position = $Marker2D.global_position
add_child(player)
这段代码,@onready var playerSpawn = preload(“res://Scenes/player.tscn”)表示提前加载player场景。spawn_player函数实现复制一个Player场景,并把放到Marker2D结点位置。这样房间内就有了一个主人公。
下面时限,主人公如何返回主场景。
在InnerHouse场景跟结点下添加Area2D结点命名为InnerhouseDoor,并在该节点添加CollisionShape2D,碰撞图形选择矩形,并把矩形一道门的位置,具体设置如下:
下一步,切换到InnerhouseDoor结点,检查器方面切换到结点选项卡,然后双击body_entered结点,在弹出的对话框选择InnerHouse根节点,点击链接,会在InnerHouse脚本中自动添加代码,我进行了修改如下:
func _on_innerhouse_door_body_entered(body):
get_tree().change_scene_to_file("res://Scenes/main.tscn")
这样主任公就可以返回主场景了,演示一下效果如下:
这样就实现了场景的切换,但是通过测试还有两个问题需要解决,一是房间内部没有碰撞,人物可以随意移动;另一个是主人公返回主场景的位置还是错误的默认返回到加载的场景位置,这个留到下一节来解决。
谢谢同学们,下一节再见!
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)