【问题标题】:Is it possible to emit signals to a different tree?是否可以向不同的树发出信号?
【发布时间】:2020-12-12 20:02:44
【问题描述】:

我目前正在制作一个看起来像这样的简单树:

MainNode(父节点)-> 角色(子节点)

MainNode 可以添加子节点或从任何文件中释放子节点,例如地图(即terrain.tscn)或事件(即event.tscn)。所有事件和地图都将存储在字典中以便于使用。代码如下所示:

func loadNewScene(key):
   # load the corresponding tscn file from dictionary
   add_child(instanced_scene)

func freeScene(key):
   # find the corresponding target node using key
   target.queue_free()

func _ready():
   # load Mainmenu.tscn
   loadNewScene("Mainmenu")

当我在 Mainmenu.tscn 中按开始时,我的问题就开始了。如果我小时候有 Mainmenu.tscn(默认情况下),我总是可以发出一个信号来确认玩家按下按钮来触发一个信号以继续下一个场景,例如:

func _on_Button_pressed():
    var target_scene = "Opening Scene"
    freeScene(current_scene)
    loadNewScene(target_scene)

但由于节点实际上不在 MainNode 中(它将在 _ready() 之后作为子节点添加),我找不到从“Mainmenu.tscn”向 MainNode 发出信号的方法,因为最初它不在 MainNode 的树中。

有没有办法向不同的树发出信号?或者有其他解决方案吗?

【问题讨论】:

  • 信号继承自Object,即使目标Node不在场景树中也可以连接和发射。我建议使用导致问题的代码更新您的帖子并描述您想要的结果。

标签: signals godot gdscript


【解决方案1】:

我相信您对 Godot 中的 tree 是什么感到有些困惑。

默认情况下,您有一个SceneTree,用于保存游戏循环。场景可以进入或离开那棵树(通过在树内的一个节点上分别调用add_childremove_child)。

现在,我认为解决您的问题的最佳方法是让您的所有模块(如果我正确理解您的设计,则不是MainNode 的任何节点)负责从MainNode 调用他们需要的任何内容。换句话说,您的模块可能依赖于MainNode,但反过来则不然。

这意味着MainMenu 可能有如下代码:

var _main_node: MainNode

func _enter_tree():
    _main_node = get_parent()

func _on_Button_pressed():
    var target_scene = "Opening Scene"
    _main_node.loadNewScene(target_scene)
    _main_node.freeScene(_main_node.current_scene)

【讨论】:

    【解决方案2】:

    如果我正确理解您的问题,您可以尝试在运行时动态连接到子信号。你可以在代码中做到这一点:

    Connecting to signals in code

    其次,我相信您尝试使用它来更改级别。我相信在这里可以找到更神化的方式:

    How to load and change scenes

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-12
      • 2019-01-09
      • 2013-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多