Show pageOld revisionsBacklinksBack to top This page is read only. You can view the source, but not change it. Ask your administrator if you think this is wrong. {{indexmenu_n>33}} ====== Коди за GPS-координатами ====== Движок уміє сам вводити код, коли гравець підійшов до потрібної точки на місцевості. Точки задаються у **Скрипті завдання**, перевірка йде в браузері гравця за даними геолокації. > **Важливо:** геолокація вмикається лише з дозволу гравця — браузер запитає його при першому зверненні. Якщо гравець відмовить, точки не спрацюють, тому залишайте запасний спосіб пройти рівень (звичайний код, підказка зі зливом). ===== Як увімкнути ===== Достатньо викликати ''gps_start()'' у полі **«Скрипт завдання»**. Движок підключає бібліотеку геолокації лише тоді, коли зустрічає у скрипті це ім'я, — окремо вмикати нічого не потрібно. <code JavaScript> gps_start(); </code> Після цього браузер починає стежити за координатами гравця (''watchPosition'' з підвищеною точністю) і при кожному їх оновленні перераховує всі задані точки. ===== Точки та дії ===== Точки складаються в масив ''g_targets''. Кожна точка — об'єкт з координатами, радіусом та діями: <code JavaScript> 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))" }); </code> * **''lat''**, **''lon''** — координати точки. * **''r''** — радіус спрацювання **в метрах**. * **''action_inside''** — рядок з javascript, виконується, коли гравець усередині радіуса. * **''action_outside''** — рядок з javascript, виконується, коли гравець зовні радіуса. Точок може бути скільки завгодно — просто додайте в ''g_targets'' кілька об'єктів. > **Дії виконуються при кожному оновленні координат**, а не один раз при вході в зону. Поки гравець стоїть усередині радіуса, ''action_inside'' спрацює багато разів поспіль. Для введення коду це безпечно: ''enter()'' та ''enter_silent()'' надсилають код лише один раз. А от показ повідомлення чи програвання звуку краще захистити власним прапорцем: <code JavaScript> 'action_inside': "if (!window.was_inside) { window.was_inside = 1; play_sound('limit'); }" </code> ===== Відстань до точки ===== Функція ''gps_distance(широта, довгота)'' повертає відстань від поточного положення гравця до вказаної точки **в метрах**. Зазвичай її показують гравцеві, щоб він розумів, тепліше чи холодніше: <code HTML> <p>Відстань до точки: <span id="distance_to">???</span> м.</p> </code> Функцію можна викликати лише після того, як отримано перші координати, — до цього положення гравця невідоме. Найпростіше викликати її з ''action_outside'', як у прикладі вище: движок сам виконає її, коли координати з'являться. ===== Своя реакція на оновлення координат ===== Якщо потрібно не просто перевірити радіус, а намалювати карту чи свій індикатор, перевизначте функцію ''on_update_position()'' — движок викликає її щоразу, коли надійшли нові координати. Поточне положення лежить у ''g_position'' (поля ''lat'' та ''lon''): <code JavaScript> gps_start(); on_update_position = function () { $('#my_coords').text(g_position.lat.toFixed(5) + ', ' + g_position.lon.toFixed(5)); }; </code> ===== Карта на рівні ===== Движок не підключає жодних картографічних бібліотек — карту автор додає сам у текст завдання. У прикладі нижче використовується безкоштовний Leaflet із тайлами OpenStreetMap: підключаються css та js бібліотеки, створюється контейнер карти, а мітка рухається за координатами гравця. Врахуйте, що завдання перемальовується при автооновленні, тому стан карти (центр, зум, об'єкт карти) зручно зберігати у ''window'', щоб вона не створювалася заново і не «стрибала» під гравцем. ===== Налагодження ===== Перевіряти GPS-рівень, бігаючи вулицею, незручно. Є службова функція ''init_debug_map(широта, довгота, зум)'': вона малює карту з вашими точками та радіусами і ставить перетягуваний маркер гравця. Куди ви перетягнете маркер — там движок і вважатиме гравця, тож спрацювання точки можна перевірити не виходячи з дому. Функція працює на Google Maps і чекає на сторінці контейнер ''<div id="debug_map">''. Бібліотеку Google Maps движок не підключає — її потрібно додати в текст завдання зі своїм ключем API. ===== Посилання на координати ===== Якщо за сюжетом потрібно просто відправити гравця в точку, а не перевіряти його прихід, вистачить звичайного посилання. Вставляється в режимі **«Джерело»**: <code HTML> <a href="geo:?q=59.249,37.465">59.249, 37.465</a> </code> Схема ''geo:'' відкриває координати в навігаторі, встановленому на телефоні. Для настільних браузерів, де такої схеми немає, підійде посилання на карти: <code HTML> <a href="https://www.google.com/maps/search/?api=1&query=49.940333,36.39305" target="_blank">49.940333, 36.39305</a> </code> [[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|Приклад посилань на координати]] ua/authors_main/task_editor/advanced/gps.txt Last modified: 2026/08/14 16:39(external edit)