我在 Godot 中有两个场景,一个是游戏场景,一个是精灵,精灵会随机生成到游戏场景中,一旦精灵生成到游戏场景中,玩家必须点击精灵单击它消失,玩家得到一分,但如果玩家单击背景,则游戏结束并弹出游戏结束场景,问题是当精灵被点击时它也会影响背景碰撞,我一直在尝试修复此碰撞层和遮罩并不能解决问题,请问我该怎么办(我使用 gdscript)。
我试过把精灵和背景放在不同的层,我也试过把它们放在不同的组,但都没有用。
随着问题的提出,我假设你在谈论“碰撞”,因为它是你用来检测点击的机制,因为你描述的场景没有指定是否真的需要碰撞作为游戏机制让精灵在其他实体之间或与其他实体交互。
此外,您没有指定是否要在 Godot 3 或 4 上实现它,所以我假设您正在使用 Godot 3,即使我的下一个建议也适用于 Godot 4。如果是这样的话:
Node
的继承类,包括 Sprite2D
都有一个内置的 _input(event: InputEvent)
方法,您可以重写该方法以检测任何输入。对于桌面平台上的点击,您将专门寻找检测点击的InputEventMouseButton
。
要检测点击,这样的事情应该有效:class Sprite2D
func _input(event: InputEvent) -> void:
if event is InputEventMouseButton and not event.pressed:
print("Mouse button released on position %s" % event.global_position)
get_tree().set_input_as_handled()
事件直接在特定的
Sprite2D
上捕获,这意味着它被点击了。在这种情况下,除非你需要它,否则你不必检查事件的位置。_input()
函数是第一个在堆栈中调用的函数,如文档中所述.get_tree().set_input_as_handled()
这一行。它会明确地告诉引擎你收到的 InputEvent 已经被消耗掉了,不应该再传播了。not event.pressed
条件:正如您可以从文档中读到的那样,event.pressed
标识是否按下了鼠标按钮(不管它是什么,因为我们没有通过 event.button_index
属性指定 which one)被按下。当释放
event.pressed
时是 false
,因此检测对 released 按钮而不是 pressed 的点击是一个很好的做法(因为您确定用户“点击”而不是“拖动”,这可能与给你游戏中的另一个机制)。
这绰绰有余,应该适合你的情况。但是,您始终可以根据要添加到树中的复杂程度以及处理逻辑的方式来处理不同的事情:
Area2D
节点而不是Collisions来检测鼠标事件。使用信号和 Area2D,引擎应自动消耗输入,因此不会发生传播。希望答案对你有帮助,我做了一些假设,因为你的问题很笼统。