Движок уміє сам вводити код, коли гравець підійшов до потрібної точки на місцевості. Точки задаються у Скрипті завдання, перевірка йде в браузері гравця за даними геолокації.
Важливо: геолокація вмикається лише з дозволу гравця — браузер запитає його при першому зверненні. Якщо гравець відмовить, точки не спрацюють, тому залишайте запасний спосіб пройти рівень (звичайний код, підказка зі зливом).
Достатньо викликати 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(широта, довгота) повертає відстань від поточного положення гравця до вказаної точки в метрах. Зазвичай її показують гравцеві, щоб він розумів, тепліше чи холодніше:
<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>
Приклад введення коду за координатами | Приклад з картою | Приклад посилань на координати