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
deadzonechoInputEventPanGesture.deltanế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.