📜  godot 检查鼠标左键 (1)

📅  最后修改于: 2023-12-03 15:31:00.677000             🧑  作者: Mango

Godot 检查鼠标左键

在Godot中,检查鼠标左键是否按下很简单。下面将介绍几种方法以及它们的优缺点。

1. 使用 _input() 函数检查鼠标按键状态

Godot提供了_input()函数来检查鼠标和键盘的输入状态。我们可以在继承Node或Control的类中覆盖这个函数来检查鼠标左键是否按下。在_function_input(event)_ 里,我们可以使用_event.is_pressed()_ 来检查鼠标左键是否按下。

func _input(event):
    if event.is_pressed() and event.button_index == BUTTON_LEFT:
        print("鼠标左键按下了")

优点:这是一个简单的方法,适用于大多数情况。

缺点:这个方法需要在继承Node或Control的类中覆盖_input()函数,这个函数仅在节点或控制被选中时才会被调用。还需要检查button_index是否是鼠标左键,这可能会在不同的平台上有所不同。

2. 使用get_tree().get_root().get_mouse_position()

在Godot中,get_tree().get_root().get_mouse_position()函数可以获得相对于根节点的鼠标位置。我们可以在每一帧中使用这个函数来检查鼠标左键是否按下,使用 OS class 使用 OS类的can_use_threads()函数来控制线程行为。

func _process(delta):
    if Input.is_mouse_button_pressed(BUTTON_LEFT) and OS.get_singleton().can_use_threads():
        var mouse_pos = get_tree().get_root().get_mouse_position()
        print("鼠标坐标: ",mouse_pos)

优点:这个方法更加灵活,不需要覆盖其他函数。

缺点:这个方法对性能有较高的要求。

3. 使用事件调度

Godot的事件调度系统使我们能够在特定的时间点执行一些代码。我们可以向事件调度器中传递一个事件,比如鼠标左键按下事件,在指定时间后会处理该事件。这里需要使用内置的Event类,我们可以调用Event.MOUSE_BUTTON_DOWN事件并传递event.button_index = BUTTON_LEFT。

func _ready():
    set_process_input(true)
    set_process(true)
    var call = get_tree().create_timer(1)
    call.connect("timeout", self, "_on_timeout")

func _process(delta):
    pass

func _input(event):
    if event.is_action_pressed("mouse_left") and not get_tree().is_input_handled():
        get_tree().call_group("on_press", "pressed")

func _on_timeout():
    var evt = InputEventMouseButton.new()
    evt.button_index = BUTTON_LEFT
    evt.pressed = true
    evt.position = get_global_mouse_position()
    evt.relative = false

    get_tree().call_group("on_press", "input", evt)

优点:这个方法更加可靠,不需要高性能的硬件。

缺点:这个方法需要创建Timer,需要一定的准备工作。

结论

Godot提供了多种方法来检查鼠标左键是否按下,最终选择哪个方法取决于开发的具体情况。第一种方法最简单,但对性能的要求也最低。而第三种方法则是最可靠的,能够在任何硬件中运行,同时需要进行更多的准备工作。