godot 如何知道点击是否在精灵内部:

godot how to know if a click is inside a sprite :

我有一个 p12 Sprite,它有一个 KinematicBody2D,而 KinematicBody2D 有一个 Collision polygon2d。

我正在尝试检查鼠标点击是否在 p12 内:

var inside : bool = p12.get_node("KinematicBody2D").has_point(to_local(pos))

var inside : bool = p12.get_node("KinematicBody2D").get_node("Collision polygon2d").has_point(to_local(pos))

没有工作。

知道如何检查点击是否在我的 sprite 内部吗?

这是我的代码:

func wich_piece(mouse_pos : Vector2 ):
    for piece in pieces:
        var inside : bool = ((piece as Sprite).get_node("KinematicBody2D") as KinematicBody).has_point(to_local(mouse_pos))
        if inside:
            return piece
    return null 

此致

如果我没理解错的话,您想检测 sprite 中的鼠标点击吗?

我假设你的精灵在 KinematicBody2D 中,像这样:

KinematicBody2D 中的信号 input_event() 连接到任何脚本并检查鼠标是否在其中单击:

func _on_KinematicBody2D_input_event(viewport, event, shape_idx):
    if(event.is_pressed()):
        print("pressed!")

现在每次点击我都会收到这样的信号:

I have a p12 Sprite that have a KinematicBody2D and the KinematicBody2D have a Collision polygon2d.

这是一个奇怪的设置,这意味着如果您移动 KinematicBody2DSprite 则不会。您确定不希望将 KinematicBody2DSprite 作为 child 吗?


如果你想知道某个位置是否在精灵内部,你可以这样做:

var inside:bool = p12.get_rect().has_point(p12.to_local(pos))

请注意,我在 Sprite 上呼叫 to_local。如果您使用的是本地坐标,那么它们的本地坐标很重要。 当然,我一开始就假设 pos 在全球坐标系中。


但是,如果目标是查找某个位置是否在 PhysicsBody2D(例如 KinematicBody2D)内,我们会做一些不同的事情。

我们可以这样做:

func collides(body:PhysicsBody2D, pos:Vector2) -> bool:
    var results := get_world_2d().direct_space_state.intersect_point(pos)
    for result in results:
        if result.collider == body:
            return true
    
    return false

正如您想象的那样,如果我们像您一样遍历数组,那将是一种浪费。由于 intersect_point 已经告诉我们 PhysicsBody2D,您将采用不同的方法。像这样:

func wich_piece(pos:Vector2):
    var bodies := []
    var results := get_world_2d().direct_space_state.intersect_point(pos)
    for result in results:
        bodies.append(result.collider)

    for piece in pieces:
        var body := ((piece as Sprite).get_node("KinematicBody2D") as KinematicBody)
        if bodies.has(body):
            return piece

    return null

但如果您真正想要的只是找出用户何时单击 KinematicBody2D。将 input_pickable 设置为 true。您将获得 "mouse_entered""mouse_exited" 和 "input_event" 信号。加上对 _input_event.

的调用