Godot学习记录---转场

一、传送门坐标记录

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)

  • 12
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值