scene - 如何在不破坏(释放)我要离开的场景的情况下在场景之间切换?
问题描述
嘿,在我的游戏中有战斗。目前战斗是一个单独的场景,当玩家走到一个 NPC 面前时,我们有一点过渡,然后离开场景,我们进入战斗场景。一旦战斗场景完成,我想回到我们之前的场景,一切都完全一样。我目前有一个名为 scene_switcher 的场景切换单例,当前设置
extends Node
var _params = null
func change_scene(next_scene, params = null):
_params = params
# global_data is another singleton I use for storing state and other global data
global_data.previous_scene = get_tree().get_current_scene()
get_tree().change_scene(next_scene)
func return_to_previous_scene(params = null):
_params = params
get_tree().get_current_scene().free()
get_tree().get_root().add_child(global_data.previous_scene)
get_tree().set_current_scene(global_data.previous_scene)
func get_param(name):
if _params != null and _params.has(name):
return _params[name]
return null
当我们进入战斗时,我使用
scene_switcher.change_scene("res://battlescene.tcsn", {players_deck, opponents_deck})
它完全按原样存储当前场景并将玩家数据传递到战斗场景。
一旦战斗结束return_to_previous_scene()
,我就会调用,当满足其中一个胜利条件时,我会调用它,就像这样
scene_switcher.return_to_previous_scene()
但是我得到了错误:
Attempted to free a locked object (calling or emitting).
我已经尝试根据文档的单例自动加载页面上的此代码将调用推迟到空闲时间,但是当我这样做时:
call_deferred("scene_switcher.return_to_previous_scene")
它永远不会被调用(game_over 函数有效,它打印出结果,我的其他测试让它与下面的代码一起工作,我认为场景永远不会空闲,这意味着代码永远不会有机会触发)
现在我可以使用:
scene_switcher.change_scene("res://map.tcsn", {})
但这会将场景恢复到其原始状态并且不是很可扩展(如果我可以与 12 个不同级别的人战斗,我怎么知道要加载哪个场景?)
那么我怎样才能停止当前场景。离开,然后带着一切回到之前的场景,我怎么离开了呢?谢谢 :)
解决方案
我在 reddit 上问了同样的问题,得到的答案解决了我的问题。复制到这里以供将来可能会发现此问题的任何人使用。所有功劳归于 /u/thomastc
call_deferred takes a method name only, so:
scene_switcher.call_deferred("return_to_previous_scene")
Alternatively, just use queue_free instead of free, to defer only the freeing.
我没有正确使用 call_deferred。
duplicate()
我还对在场景中使用进行了轻微修改,change_scene
以保留未释放的副本。
所以
global_data.previous_scene = get_tree().get_current_scene()
变成了
global_data.previous_scene = get_tree().get_current_scene().duplicate()
现在按预期工作:)
推荐阅读
- r - 无法在使用闪亮创建的选项卡中生成选定的数据详细信息
- android - android 应用程序仅在充电时通过互联网发送数据
- r - 基于GPX文件中的坐标自动检测坐标参考系?
- c - C中函数的定义
- php - 将谷歌日历 API 与 laravel 链接以创建日历和事件
- python - 我如何从 python 中的字符串中读取定义的值,就像我可以在 C 中使用 scanf 一样
- typescript - 如何使用 TypeScript for VSCode 键入 JSON 文件?
- html - 将类添加到标题时背景图像消失
- mysql - 如何将mysql数据从hdfs加载到pyspark
- python - Pip install 在子包中构建轮子失败?