Table of Contents

Коди за 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))"
});

Точок може бути скільки завгодно — просто додайте в g_targets кілька об'єктів.

Дії виконуються при кожному оновленні координат, а не один раз при вході в зону. Поки гравець стоїть усередині радіуса, action_inside спрацює багато разів поспіль. Для введення коду це безпечно: enter() та enter_silent() надсилають код лише один раз. А от показ повідомлення чи програвання звуку краще захистити власним прапорцем:
'action_inside': "if (!window.was_inside) { window.was_inside = 1; play_sound('limit'); }"

Відстань до точки

Функція gps_distance(широта, довгота) повертає відстань від поточного положення гравця до вказаної точки в метрах. Зазвичай її показують гравцеві, щоб він розумів, тепліше чи холодніше:

<p>Відстань до точки: <span id="distance_to">???</span> м.</p>

Функцію можна викликати лише після того, як отримано перші координати, — до цього положення гравця невідоме. Найпростіше викликати її з 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 і чекає на сторінці контейнер <div id=“debug_map”>. Бібліотеку Google Maps движок не підключає — її потрібно додати в текст завдання зі своїм ключем API.

Посилання на координати

Якщо за сюжетом потрібно просто відправити гравця в точку, а не перевіряти його прихід, вистачить звичайного посилання. Вставляється в режимі «Джерело»:

<a href="geo:?q=59.249,37.465">59.249, 37.465</a>

Схема geo: відкриває координати в навігаторі, встановленому на телефоні. Для настільних браузерів, де такої схеми немає, підійде посилання на карти:

<a href="https://www.google.com/maps/search/?api=1&query=49.940333,36.39305" target="_blank">49.940333, 36.39305</a>

Приклад введення коду за координатами | Приклад з картою | Приклад посилань на координати