输入影响 Godot 中前面和后面的精灵

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

我在 Godot 中有两个场景,一个是游戏场景,一个是精灵,精灵会随机生成到游戏场景中,一旦精灵生成到游戏场景中,玩家必须点击精灵单击它消失,玩家得到一分,但如果玩家单击背景,则游戏结束并弹出游戏结束场景,问题是当精灵被点击时它也会影响背景碰撞,我一直在尝试修复此碰撞层和遮罩并不能解决问题,请问我该怎么办(我使用 gdscript)。

我试过把精灵和背景放在不同的层,我也试过把它们放在不同的组,但都没有用。

collision godot gdscript inputevent
1个回答
0
投票

随着问题的提出,我假设你在谈论“碰撞”,因为它是你用来检测点击的机制,因为你描述的场景没有指定是否真的需要碰撞作为游戏机制让精灵在其他实体之间或与其他实体交互。
此外,您没有指定是否要在 Godot 3 或 4 上实现它,所以我假设您正在使用 Godot 3,即使我的下一个建议也适用于 Godot 4。如果是这样的话:

  • 建议1:不要依赖碰撞和碰撞形状来管理用户交互,例如点击。一般来说,如果你只需要检测点击,就不要管所有与物理相关的事情,因为你并不真正需要它,只会让一切更难处理,性能更差。
    所有
    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()
函数是第一个在堆栈中调用的函数,如文档中所述.
在您的情况下发生的情况是输入propagates 在您的 Sprite2D 上接收到它之后,传播发生在树中(正如您提到的那样,从 Sprite 到您的背景)。这就是为什么我添加了
get_tree().set_input_as_handled()
这一行。它会明确地告诉引擎你收到的 InputEvent 已经被消耗掉了,不应该再传播了。
关于
not event.pressed
条件:正如您可以从文档中读到的那样,
event.pressed
标识是否按下了鼠标按钮(不管它是什么,因为我们没有通过 event.button_index 属性指定
which one
)被按下。当释放
event.pressed
时是
false
,因此检测对 released 按钮而不是 pressed 的点击是一个很好的做法(因为您确定用户“点击”而不是“拖动”,这可能与给你游戏中的另一个机制)。

这绰绰有余,应该适合你的情况。但是,您始终可以根据要添加到树中的复杂程度以及处理逻辑的方式来处理不同的事情:

  • 建议2:用户
    Area2D
    节点而不是Collisions来检测鼠标事件。使用信号和 Area2D,引擎应自动消耗输入,因此不会发生传播。

希望答案对你有帮助,我做了一些假设,因为你的问题很笼统。

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