{{indexmenu_n>33}}
====== Коды по GPS-координатам ======
Движок умеет сам вбивать код, когда игрок подошёл к нужной точке на местности. Точки задаются в **Скрипте задания**, проверка идёт в браузере игрока по данным геолокации.
> **Важно:** геолокация включается только с разрешения игрока — браузер спросит его при первом обращении. Если игрок откажет, точки не сработают, поэтому оставляйте запасной способ пройти уровень (обычный код, подсказка со сливом).
===== Как включить =====
Достаточно вызвать ''gps_start()'' в поле **«Скрипт задания»**. Движок подключает библиотеку геолокации только тогда, когда встречает в скрипте это имя, — отдельно включать ничего не нужно.
Расстояние до точки: ??? м.
gps_start();
После этого браузер начинает следить за координатами игрока (''watchPosition'' с повышенной точностью) и при каждом их обновлении пересчитывает все заданные точки.
===== Точки и действия =====
Точки складываются в массив ''g_targets''. Каждая точка — объект с координатами, радиусом и действиями:
gps_start();
window.target_lat1 = 51.5211367; // Широта точки
window.target_lon1 = -0.10723867; // Долгота точки
g_targets.push({
'lat': window.target_lat1,
'lon': window.target_lon1,
'r': 30, // Радиус в МЕТРАХ
'action_inside': "enter_silent('finish_code_123')",
'action_outside': "$('#distance_to').text(gps_distance(window.target_lat1, window.target_lon1).toFixed(0))"
});
* **''lat''**, **''lon''** — координаты точки.
* **''r''** — радиус срабатывания **в метрах**.
* **''action_inside''** — строка с javascript, выполняется, когда игрок внутри радиуса.
* **''action_outside''** — строка с javascript, выполняется, когда игрок снаружи радиуса.
Точек может быть сколько угодно — просто добавьте в ''g_targets'' несколько объектов.
> **Действия выполняются при каждом обновлении координат**, а не один раз при входе в зону. Пока игрок стоит внутри радиуса, ''action_inside'' сработает много раз подряд. Для ввода кода это безопасно: ''enter()'' и ''enter_silent()'' отправляют код только один раз. А вот показ сообщения или проигрывание звука лучше защитить собственным флагом:
'action_inside': "if (!window.was_inside) { window.was_inside = 1; play_sound('limit'); }"
===== Расстояние до точки =====
Функция ''gps_distance(широта, долгота)'' возвращает расстояние от текущего положения игрока до указанной точки **в метрах**. Обычно её показывают игроку, чтобы он понимал, теплее или холоднее:
Функцию можно вызывать только после того, как получены первые координаты, — до этого положение игрока неизвестно. Проще всего вызывать её из ''action_outside'', как в примере выше: движок сам выполнит её, когда координаты появятся.
===== Своя реакция на обновление координат =====
Если нужно не просто проверить радиус, а нарисовать карту или свой индикатор, переопределите функцию ''on_update_position()'' — движок вызывает её каждый раз, когда пришли новые координаты. Текущее положение лежит в ''g_position'' (поля ''lat'' и ''lon''):
gps_start();
on_update_position = function () {
$('#my_coords').text(g_position.lat.toFixed(5) + ', ' + g_position.lon.toFixed(5));
};
===== Карта на уровне =====
Движок не подключает никаких картографических библиотек — карту автор добавляет сам в текст задания. В примере ниже используется бесплатный Leaflet с тайлами OpenStreetMap: подключаются css и js библиотеки, создаётся контейнер карты, а метка двигается по координатам игрока.
Учтите, что задание перерисовывается при автообновлении, поэтому состояние карты (центр, зум, объект карты) удобно хранить в ''window'', чтобы она не создавалась заново и не «прыгала» под игроком.
===== Отладка =====
Проверять GPS-уровень, бегая по улице, неудобно. Есть служебная функция ''init_debug_map(широта, долгота, зум)'': она рисует карту с вашими точками и радиусами и ставит перетаскиваемый маркер игрока. Куда вы перетащите маркер — там движок и будет считать игрока, так что можно проверить срабатывание точки не выходя из дома.
Функция работает на Google Maps и ждёт на странице контейнер ''
59.249, 37.465
Схема ''geo:'' открывает координаты в навигаторе, установленном на телефоне. Для настольных браузеров, где такой схемы нет, подойдёт ссылка на карты:
49.940333, 36.39305
[[https://qeng.org/game.php?jump_to&gid=3493&task_id=76365|Пример ввода кода по координатам]] | [[https://qeng.org/game.php?jump_to&gid=3493&task_id=80987|Пример с картой]] | [[https://qeng.org/game.php?jump_to&gid=3493&task_id=54060|Пример ссылок на координаты]]