提问人:tutiplain 提问时间:11/14/2023 更新时间:11/15/2023 访问量:21
如何在 Godot 的一个场景实例中更改精灵的可见性
How to change visibility of a sprite in one instance of a scene in Godot
问:
我对 Godot 比较陌生,我在练习井字游戏时遇到了一些麻烦。我有两个场景:一个是游戏板,类似于#。另一个场景称为“可玩方块”。它将代表用户可以单击以播放 X 或 0 的区域,具体取决于他们的回合。这个可玩的方形场景由一个 Area2D 节点、一个 Collision2D 节点和两个精灵组成:一个用于 X,一个用于 0。两个精灵的可见性都设置为 false。这个想法是,当用户单击Area2D根节点时,两个精灵中的一个将变得可见。在我的主场景中,我放置了九个“可玩方块”场景的实例。它的脚本是这样的:
extends Area2D
@onready var theX = $TheX
@onready var theO = $The0
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
pass
func _input(event):
if event.is_action_pressed("mouseleft"):
theX.visible=true
func play0():
theO.visible=true
但是,单击其中一个后,X 在所有方块中都可见。我知道资源在实例之间共享,但如何使它们在每个实例中是唯一的?我尝试将每个“可玩方块”实例都设在主场景的本地,但同样的事情不断发生。我还尝试在 X 和 0 精灵上使用“访问作为唯一名称”,但无济于事。我显然在这里遗漏了一些非常基本的东西,但我无法弄清楚。任何信息将不胜感激!
答:
您的问题是,您使用了错误的点击检查功能。
如果发生输入,则会为场景中的每个元素调用_input。这实际上并不重要,单击屏幕的位置,它将传输到所有元素。 如果你真的想使用这个功能,你需要检查鼠标的位置。
因为您已经在使用 Area2D,所以我以另一种方式重新评论。Area2D 有一个称为 input_event 的信号。如果在playable_square场景中选择根节点,然后切换到检查器中的“节点”选项卡,则会发现。或者,您可以通过代码连接它,就像下面的示例一样。
将其与 playable_square 脚本连接,并将现有代码复制到该函数中。只有当您的碰撞区域发生输入事件时,此信号才会触发。
您的脚本将如下所示:
extends Area2D
@onready var theX = $TheX
@onready var theO = $The0
func _ready()
connect("input_event", _on_input_event)
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
pass
func _on_input_event(viewport, event, shape_idx):
if event.is_action_pressed("mouseleft"):
theX.visible=true
func play0():
theO.visible=true
连接部分可能会有所不同, 如果您使用的是不同版本的 Godot.我在 4.0 上
评论