【问题标题】:Godot: area_entered() signal not fired for overlapping areasGodot:没有为重叠区域触发 area_entered() 信号
【发布时间】:2022-01-15 10:40:56
【问题描述】:

我有一个与 tilemap 网格对齐的荧光笔 Area2D(想想指向特定图块的手电筒),我想让它使用 area_entered() 和 area_exited() 信号检测当前突出显示的区域:

# Highlighter.gd

extends Area2D

var highlighted_area

_on_Highlighter_area_entered(area):
    highlighted_area = area

_on_Highlighter_area_exited(area):
    highlighted_area = null


这按预期工作,除非我从一个区域移动到重叠区域。在这种情况下,退出信号会触发,但相邻(重叠)区域的进入信号不会触发,因此 highlighted_area 将卡在 null 上。见下图:

为什么没有为重叠区域触发输入信号?任何想法如何让信号正常工作?

【问题讨论】:

    标签: collision-detection area godot overlapping


    【解决方案1】:

    仔细检查Area2Dmonitoringmonitorable 属性。

    另外,请注意,您只在脚本中存储一个区域。因此,如果它注册了一个区域,并且另一个区域进入,它将覆盖第一个区域。此外,如果存在一个区域,即使仍有区域重叠,您也会有 null。

    当然,您可以保留当前重叠区域的数组。


    但是,我想提出一些不同的建议。如果您想了解给定点上的内容,可以使用intersect_point。示例:

    var space = get_world_2d().direct_space_state
    var mouse_pos = get_global_mouse_position()
    var results = space.intersect_point(mouse_pos, 32, [], 2147483647, false, true)
    for result in results:
        print(result.collider)
    

    在这里,我们要求在每一层 (2147483647) 上最多 32 碰撞,不排除 ([]),不包括身体 false,包括区域 true

    【讨论】:

    • 非常感谢您让我了解 intersect_point!看起来它正是为这个用例而设计的,就像你指出的那样,它也更好,因为它可以返回鼠标悬停的整个区域,这可能是我的下一个问题。会试一试!
    猜你喜欢
    • 1970-01-01
    • 2019-07-25
    • 2021-03-14
    • 2022-08-03
    • 2012-07-31
    • 2020-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多