Godot engine. Баг с работой с touch. Как исправить?

Требуется в Godot Engine создать основу для интерактивной карты.

Сама карта будет создаваться с помощью TileMap.

Требуется реализовать Zoom In, Zoom out колесиком мыши с возможность изменения максимального и минимального значений приближения в коде.

Перемещение по карте при зажиме колесика мыши.

Проект будет экспортироваться в Html5 Для мобильных устройств для работы в браузере.

Требуется такой же функционал для устройств с Тачскрином в браузере.

Передвижение и зуммирование как на Google Maps к примеру.

Есть сделанный проект с реализацией написанного. Он прикреплен во в вложении.
Но в нем есть баг от которого не получилось избавится. На устройствах с тач скрином. При удерживании одного пальца на экране и сделав тап вторым палец- происходит передвижение карты. Не могу его никак исправить.
Могу указать ссылку на готовый проект.

как реализовано сейчас

extends Camera2D

export (NodePath) var target

#touch zoom
var min_zoom_sc = 1.5  
var max_zoom_sc = 10
var zoom_sensitivity = 10
var zoom_speed = 0.05

var events = {}
var last_drag_distance = 0

#mouse zoom
const MIN_ZOOM: float = 0.9
const MAX_ZOOM: float = 8.0
const ZOOM_RATE: float = 8.0
const ZOOM_INCREMENT: float = 1.0

var _target_zoom: float = 2.0

onready var _tween: Tween = $Tween


func _physics_process(delta: float) -> void:
	zoom = lerp(zoom, _target_zoom * Vector2.ONE, ZOOM_RATE * delta)
	set_physics_process(not is_equal_approx(zoom.x, _target_zoom))


func _unhandled_input(event: InputEvent) -> void:
	if event is InputEventScreenTouch:

		if event.pressed:
			events[event.index] = event
		else:
			events.erase(event.index)
	if event is InputEventScreenDrag:
		events[event.index] = event
		if events.size() == 1:
			#position -= event.relative
			position -= event.relative * zoom
		
		elif events.size() == 2:
			var drag_distance = events[0].position.distance_to(events[1].position)
			if abs(drag_distance - last_drag_distance) > zoom_sensitivity:
				var new_zoom = (1 + zoom_speed) if drag_distance < last_drag_distance else (1 - zoom_speed)
				new_zoom = clamp(zoom.x * new_zoom, min_zoom_sc, max_zoom_sc)
				zoom = Vector2.ONE * new_zoom
				last_drag_distance = drag_distance
	if event is InputEventMouseButton:
		if event.is_pressed():
			if event.button_index == BUTTON_WHEEL_UP:
				zoom_in()
			if event.button_index == BUTTON_WHEEL_DOWN:
				zoom_out()
			if event.doubleclick:
				focus_position(get_global_mouse_position())
	if event is InputEventMouseMotion:
		if event.button_mask == BUTTON_MASK_MIDDLE:
			position -= event.relative * zoom



func zoom_in() -> void:
	_target_zoom = max(_target_zoom - ZOOM_INCREMENT, MIN_ZOOM)
	set_physics_process(true)


func zoom_out() -> void:
	_target_zoom = min(_target_zoom + ZOOM_INCREMENT, MAX_ZOOM)
	set_physics_process(true)


func focus_position(target_position: Vector2) -> void:
	_tween.stop(self, "position")
	_tween.interpolate_property(self, "position", position, target_position, 0.2, Tween.TRANS_EXPO)
	_tween.start()
  • Вопрос задан
  • 51 просмотр
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Fleet Finance Москва
от 130 500 до 130 500 ₽
от 200 000 до 250 000 ₽
Точка Москва
от 140 000 до 430 000 ₽
22 мая 2024, в 10:10
1500 руб./в час
22 мая 2024, в 10:07
25000 руб./за проект
22 мая 2024, в 10:04
2000 руб./за проект