【问题标题】:Godot: detect if a pressed mouse is above buttonGodot:检测按下的鼠标是否在按钮上方
【发布时间】:2021-03-07 10:18:16
【问题描述】:

这是我认为必须有一种非常简单的方法来解决的问题之一,但我仍然无法弄清楚。有什么方法可以确定我的鼠标(或触摸屏上的手指)是否在按下按钮(任何按钮节点)上方?也许像“自我全球定位”这样的东西......?离开或进入该区域时立即识别的东西。

问题在于 func _on_Button_mouse_exited(): 只会在释放时触发,而不会在退出时触发。它适用于 CollisionShape2D,但显然不适用于 Buttons。我希望它在我的手指从按钮上滑落的那一刻发出信号。

非常感谢任何帮助!

【问题讨论】:

    标签: button collision detection godot


    【解决方案1】:

    首先注册输入事件以了解鼠标按钮是否被按下或释放

    var pressed = false
    
    func _input(event):
        if event is InputEventMouseButton and event.button_index == BUTTON_LEFT:
            pressed = event.pressed
    

    另一种检查鼠标按钮状态的方法是将 Action 添加到 Input Map(在 Project Settings 中)并添加 Mouse按钮Action 的键列表。然后你可以检查它

    var pressed = Input.is_action_pressed("MyMouseCliskAction")
    

    其次,连接回调注册Button节点的mouse_enteredmouse_exited信号。

    var mouseIsOverButton = false
    
    ...
        button.connect("mouse_entered", self, "_on_mouse_entered")
        button.connect("mouse_exited", self, "_on_mouse_exited")
    ...
    
    func _on_mouse_entered():
        mouseIsOverButton = true
    func _on_mouse_exited():
        mouseIsOverButton = false
    

    mouse_exited 信号所描述的问题仅在鼠标按钮在按钮区域内被按下并且直到光标离开按钮区域时才释放时才会发生。 is_hovered() 可能是检查 Button 控件的更方便的方法,但它只是上面代码的快捷方式,并且具有相同的描述问题。

    如果你想解决这个问题,你可以使用Button 节点的CanvasItem.get_local_mouse_position()(或get_global_mouse_position())方法,然后手动检查位置是否在按钮的矩形内:

    var pos = button.get_local_mouse_position()
    var rect = Rect2(button.rect_position, button.rect_size)
    var mouseIsOverButton = rect.has_point(pos)
    

    【讨论】:

    • 谢谢奥利奥特,这正是问题所在,也是解决问题的好方法。 get_rect().has_point(event.position) 似乎是另一个方向。
    • @pferft 仍然使用event.position 你需要某种鼠标事件,当越界时触发。由于所描述的行为,AFAIK mouse_exited 事件在这里仍然没有用 - 它只是不会及时触发。您是否找到任何其他方式在光标离开按钮区域的那一刻准确地得到通知?
    • 所以这里似乎可以解决问题:extends Button class_name AbortableButton var mouse_is_down = false var has_aborted = false signal abort func _on_Button_gui_input(event: InputEvent): if event.is_action_pressed("lclick"): mouse_is_down = true has_aborted = false elif event.is_action_released("lclick"): mouse_is_down = false if mouse_is_down and event is InputEventMouseMotion: if not get_global_rect().has_point(get_global_mouse_position()) and not has_aborted: emit_signal("abort") has_aborted = true func _on_Button_abort(): print('Abort!')
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    • 2020-08-24
    相关资源
    最近更新 更多