Tích hợp cử chỉ cảm ứng trong Godot Engine mà không cần viết thuật toán phức tạp

Godot Engine đã tích hợp sẵn một hệ thống nhận diện cử chỉ (gesture) đa nền tảng, giúp bạn thêm tương tác cảm ứng chỉ bằng vài dòng mã GDScript. Bài viết này hướng dẫn cách kích hoạt và sử dụng các loại cử chỉ có sẵn, đồng thời mở rộng thêm cử chỉ tùy chỉnh khi cần.

1. Các lớp sự kiện cử chỉ có sẵn

Godot cung cếp ba lớp chính trong nhánh InputEventGesture:

  • InputEventPanGesture – kéo hai ngón tay để cuộn / pan
  • InputEventMagnifyGesture – chụm / giãn hai ngón tay để phóng to / thu nhỏ
  • InputEventScreenDrag – kéo một ngón tay (thường dùng cho joystick ảo)

2. Kích hoạt bộ lắng nghe sự kiện

Ở node cần bắt cử chỉ (Node2D, Control, …) bật cờ set_process_input(true):

extends Node2D

func _ready():
    set_process_input(true)

3. Xử lý cử chỉ cơ bản

Override _input(event) và chuyển kiểu để lọc sự kiện:

func _input(ev):
    if ev is InputEventPanGesture:
        _on_pan(ev.delta)

    elif ev is InputEventMagnifyGesture:
        _on_pinch(ev.factor)

func _on_pan(delta: Vector2):
    $Sprite2D.global_position += delta * 0.4

func _on_pinch(factor: float):
    var new_scale = $Sprite2D.scale * factor
    $Sprite2D.scale = new_scale.clamp(Vector2(0.3, 0.3), Vector2(4, 4))

4. Mở rộng: cử chỉ xoay tùy chỉnh

Nếu bạn cần nhận diện xoay (rotate), tạo lớp con của InputEventGesture:

class_name RotateGesture extends InputEventGesture
var angle_delta: float

func _init(delta_rad: float):
    angle_delta = delta_rad

Đăng ký lớp này trong _ready():

func _ready():
    ClassDB.register_class(RotateGesture)

Sau đó gửi sự kiện từ native layer (Android/iOS) hoặc tự phát thủ công qua Input.parse_input_event().

5. Ứng dụng thực tế – trình xem ảnh đa cử chỉ

extends TextureRect

var cam_zoom := 1.0
var cam_offset := Vector2.ZERO

func _input(ev):
    if ev is InputEventPanGesture:
        cam_offset += ev.delta
        offset = cam_offset

    elif ev is InputEventMagnifyGesture:
        cam_zoom *= ev.factor
        cam_zoom = clamp(cam_zoom, 0.5, 5.0)
        scale = Vector2(cam_zoom, cam_zoom)

6. Lưu ý hiệu năng

  • Dùng set_input_as_handled() để ngăn sự kiện tràn sang các node khác.
  • Đặt ngưỡng deadzone cho InputEventPanGesture.delta nếu cần giảm nhiễu.
  • Test trên thiết bị thật để điều chỉnh độ nhạy theo DPI.

Với hệ thống sẵn có, bạn có thể bỏ qua thư viện bên ngoài, giảm dung lượng APK/IPA và tối ưu hiệu năng nhờ code C++ nằm sâu trong engine.

Thẻ: Godot gdscript gesture-recognition multi-touch mobile-game-dev

Đăng vào ngày 10 tháng 8 lúc 17:25