如何通过信号将继承按钮场景的信息传递到主场景?
下面提供三种实用方案,可直接适配你的现有代码:
方案一:实例化骨牌时直接连接信号(最直观)
在主场景的_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
相关产品推荐
相关产品推荐

