You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过信号将继承按钮场景的信息传递到主场景?

如何在主场景中获取多米诺骨牌(TextureButton继承场景)的数值?

下面提供三种实用方案,可直接适配你的现有代码:

方案一:实例化骨牌时直接连接信号(最直观)

在主场景的_spawn_random_object方法中,实例化骨牌后立即将其pressed信号连接到主场景的自定义方法,并传递骨牌实例本身,就能直接调用骨牌的get方法获取数值。

修改主场景脚本:

class_name PrincipalScene extends Node2D
# ... 原有代码 ...

func _spawn_random_object():
    # ... 原有代码(选择随机骨牌的逻辑)...
    
    # 实例化骨牌并连接信号
    for i in _topo.size():
        var stone = self._pedras[i].instantiate()
        $PanelTop/Top.add_child(stone)
        # 连接pressed信号到主场景的处理方法,传递stone实例
        stone.connect("pressed", self, "_on_stone_pressed", [stone])
        
    for i in _bottom.size():
        var stone = self._pedras[i].instantiate()
        $PanelBottom/Bottom.add_child(stone)
        stone.connect("pressed", self, "_on_stone_pressed", [stone])
        
    for i in _left.size():
        var stone = self._pedras[i].instantiate()
        $PanelLeft/Left.add_child(stone)
        stone.connect("pressed", self, "_on_stone_pressed", [stone])
        
    for i in _right.size():
        var stone = self._pedras[i].instantiate()
        $PanelRight/Right.add_child(stone)
        stone.connect("pressed", self, "_on_stone_pressed", [stone])

# 新增骨牌点击处理方法
func _on_stone_pressed(stone: Stone):
    # 直接调用骨牌的get方法获取数值
    print("点击的骨牌数值:", stone.get_valor_pedra())
    print("点击的骨牌索引数组:", stone.get_index_pedra())

方案二:通过全局组批量管理骨牌信号

给所有骨牌加入同一个全局组,主场景统一遍历组内节点连接信号,适合需要批量管理骨牌的场景。

步骤1:修改Stone脚本,加入全局组

class_name Stone extends TextureButton
# ... 原有代码 ...

func _ready() -> void:
    add_to_group("domino_stones") # 加入全局组

步骤2:修改主场景脚本,连接组内骨牌信号

class_name PrincipalScene extends Node2D
# ... 原有代码 ...

func _ready() -> void:
    _rng.randomize()
    _spawn_random_object()
    # 遍历组内所有骨牌,统一连接信号
    for stone in get_tree().get_nodes_in_group("domino_stones"):
        if stone is Stone:
            stone.connect("pressed", self, "_on_stone_pressed", [stone])

# 骨牌点击处理方法(同方案一)
func _on_stone_pressed(stone: Stone):
    print("点击的骨牌数值:", stone.get_valor_pedra())
    print("点击的骨牌索引数组:", stone.get_index_pedra())

方案三:自定义信号直接传递数值(最简洁)

在Stone脚本中定义自定义信号,点击时直接发射数值,主场景无需持有骨牌实例即可接收数据。

步骤1:修改Stone脚本,添加自定义信号并发射

class_name Stone extends TextureButton
# ... 原有代码 ...

# 新增自定义信号,直接传递数值
signal stone_clicked(valor: int, index: Array[int])

func _on_pressed() -> void:
    # 原有代码保持不变
    print("Stone Click Value: " + str(get_valor_pedra()))
    print("Stone Click Array Values" + str(get_index_pedra()))
    self._click_stone = true
    # ... 原有代码 ...
    
    # 发射自定义信号,传递数值
    emit_signal("stone_clicked", _valor, _index)

步骤2:修改主场景脚本,连接自定义信号

class_name PrincipalScene extends Node2D
# ... 原有代码 ...

func _spawn_random_object():
    # ... 原有代码 ...
    
    for i in _topo.size():
        var stone = self._pedras[i].instantiate()
        $PanelTop/Top.add_child(stone)
        # 连接自定义信号到主场景的处理方法
        stone.connect("stone_clicked", self, "_on_stone_clicked")
        
    # 其余三个循环同理,重复上述连接逻辑
    
# 新增自定义信号处理方法
func _on_stone_clicked(valor: int, index: Array[int]):
    print("点击的骨牌数值:", valor)
    print("点击的骨牌索引数组:", index)

以上三种方案都能解决你的问题,可根据实际需求选择:

  • 方案一适合单骨牌独立处理,逻辑清晰;
  • 方案二适合批量管理大量骨牌;
  • 方案三无需依赖骨牌实例,数据传递更直接。

内容的提问来源于stack exchange,提问作者FernandoPaiva

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 21:08:10