来自一个实例的 Godot 信号会触发所有实例的处理函数

问题描述 投票:0回答:2

我有一个主要场景和次要场景。我想创建辅助场景的多个实例。次要场景将发出带有特定于其的信息的信号。主场景会检测信号并根据信息采取行动。

主场景是空的。第二个场景由图标和二维碰撞组成,以允许检测鼠标点击:

中学.gd:

class_name Secondary extends Area2D
@onready var sprite_2d = $Sprite2D

signal secondary_clicked(value)
var information

func _input(event):
    if event.is_action_pressed("mouse_left_click"):
        secondary_clicked.emit(information)

Main.gd:

class_name Main extends Node2D

# Called when the node enters the scene tree for the first time.
func _ready():
    var secondary_scene = preload("res://Secondary.tscn")
    var secondary_instance = secondary_scene.instantiate()
    add_child(secondary_instance)
    secondary_instance.information = "1st"
    secondary_instance.position = Vector2(510, 320)
    secondary_instance.secondary_clicked.connect(handle_signal)
    
    secondary_instance = secondary_scene.instantiate()
    add_child(secondary_instance)
    secondary_instance.information = "2nd"
    secondary_instance.position = Vector2(710, 320)
    secondary_instance.secondary_clicked.connect(handle_signal) 

func handle_signal(value):
    print("The value from the scene: " + value)

我预计鼠标单击将导致“场景中的值:第一个”或“场景中的值:第二个”,具体取决于我单击的实例。

实际结果是我得到了两张照片,无论我点击了哪一张。此输出是通过单击完成的:

godot godot4
2个回答
0
投票

_input
活动不限于当前
Node

因此两个实例都会收到对其

_input
的调用。

在任何时候都不会考虑点击是否在它们之上。

是的,您可以确定点击是否在它们上方,但是对于此用例,我建议您使用

_input_event
代替。


0
投票

我更新了 secondary.gd,用自定义函数替换 _input:

class_name Secondary extends Area2D
@onready var sprite_2d = $Sprite2D

signal secondary_clicked(value)
var information

func _my_input_event(viewport, event, shape_idx):
    if event.is_action_pressed("mouse_left_click"):
        secondary_clicked.emit(information)

我将 input_event 连接到这个函数:

enter image description here

瞧,它正在按预期工作。我仍然不知道为什么我的原始代码不起作用,而这个却起作用。如果有人可以链接到有关此的信息,那就太好了。

© www.soinside.com 2019 - 2024. All rights reserved.