我对 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”,但没有成功。我显然在这里遗漏了一些非常基本的东西,但我无法弄清楚。任何信息将不胜感激!
您的问题是,您使用了错误的函数进行点击检查。
如果发生输入,则场景中的每个元素都会调用_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