Требуется в 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()