如何更改 Godot 场景的一个实例中精灵的可见性

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

我对 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 精灵上使用“Access as Unique Name”,但没有成功。我显然在这里遗漏了一些非常基本的东西,但我无法弄清楚。任何信息将不胜感激!

instantiation godot gdscript
1个回答
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

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