{{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 и ждёт на странице контейнер ''
''. Библиотеку Google Maps движок не подключает — её нужно добавить в текст задания со своим ключом API. ===== Ссылки на координаты ===== Если по сюжету нужно просто отправить игрока в точку, а не проверять его приход, хватит обычной ссылки. Вставляется в режиме **«Источник»**: 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|Пример ссылок на координаты]]