一、传送门坐标记录
1.new script 继承自 Marker2D
#传送门脚本
class_name Teleporter
extends Interactable
@export_file("*.tscn") var scene_file: String
@export var entry_point: String
func on_body_entered(player: Player):
get_tree().change_scene_to_file(scene_file)
#坐标点脚本
class_name EntryPoint
extends Marker2D
func _ready() -> void:
add_to_group("entry_points")
#初始化坐标函数
func init_player_position(pos: Vector2) -> void:
player.global_position = pos
camera_2d.reset_smoothing()
camera_2d.force_update_scroll()
我们肯定会认为,只要在传送门脚本中切换场景后调用这个就好,但这在一些版本中不起作用,因为change_scene_to_file后旧场景被析构,无法获得tree中的entry_point
godot4.2 document如下
Error change_scene_to_file(path: String)
将位于给定路径 path 的场景加载进一个 PackedScene 并新建其实例,然后将正在运行的场景修改为这个场景。
成功时返回 OK;如果 path 不能被加载到一个 PackedScene 中,则返回 ERR_CANT_OPEN;如果该场景无法被实例化,则返回 ERR_CANT_CREATE。
二、 自动加载场景
此时我们需要一个自动加载场景
新建场景,添加脚本
extends Node
func change_scene(path: String, entry_point: String) -> void:
var tree := get_tree()
tree.change_scene_to_file(path)
await tree.tree_changed
for node in tree.get_nodes_in_group("entry_points"):
if node.name == entry_point:
tree.current_scene.init_player_position(node.global_position)
break
点添加(一定是*。tscn,选gdscript会报错)
这里全局变量是启用的,可以通过名称访问该变量,传送门这里就可以改成:
func on_body_entered(player: Player):
GameManager.change_scene(scene_file, entry_point)
问题:角色朝向不正确
之后在entry_point中设置一下player的方向,以确保player方向正确
问题:血量在场景转换后回满
把player的状态放在一个stats脚本中,把它作为节点放在GameManager中,然后player用这个GameManager中的Stats就行了扣血动画
三、淡入淡出效果
1.GameManager加入colorrect色块
game节点改为canvaslayer,显示在HUD中,Layer调大
使用补间动画来做这个效果
extends Node
@onready var player_stats: Stats = $PlayerStats
@onready var color_rect: ColorRect = $ColorRect
func _ready() -> void:
color_rect.color.a = 0
func change_scene(path: String, entry_point: String) -> void:
var tree := get_tree()
var tween := create_tween()
tween.tween_property(color_rect, "color.a", 1, 0.2)
await tween.finished
tree.change_scene_to_file(path)
await tree.tree_changed
for node in tree.get_nodes_in_group("entry_points"):
if node.name == entry_point:
tree.current_scene.init_player_position(node)
break
tween = create_tween()
tween.tween_property(color_rect, "color.a", 0, 0.2)
godot4.2遇到了一些奇怪bug,tween在此并不生效,尝试animationplayer,却在切换好之后才播放,后来翻看文档,发现godot4.2的node path 语法变更!!!!
属性应当是color:a而不是color.a这也就是为何先前await不到finish信号,而且无任何报错!!!
extends Node
@onready var player_stats: Stats = $PlayerStats
@onready var color_rect: ColorRect = $ColorRect
@onready var animation_player: AnimationPlayer = $AnimationPlayer
func _ready() -> void:
color_rect.color.a = 0
func change_scene(path: String, entry_point: String) -> void:
var tree := get_tree()
tree.paused = true
var tween := create_tween()
tween.tween_property(color_rect, "color:a", 1, 0.2)
tween.set_pause_mode(Tween.TWEEN_PAUSE_PROCESS)
await tween.finished
tree.change_scene_to_file(path)
await tree.tree_changed
for node in tree.get_nodes_in_group("entry_points"):
if node.name == entry_point:
tree.current_scene.init_player_position(node)
break
tree.paused = false
tween = create_tween()
tween.tween_property(color_rect, "color:a", 0, 0.2)