{{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|Приклад посилань на координати]]