Сегодня, ребятишки, немного о космической физике, которая работает у каждого из вас на ладошке.
Время на спутниках GPS идёт не так, как на Земле.
Спутники GPS летают на высоте около 20 200 км, движутся со скоростью примерно 3,9 км/с — почти 14 000 км/ч — и совершают оборот вокруг Земли примерно за 12 часов.
Из-за скорости спутника специальная теория относительности Эйнштейна заставляет его атомные часы отставать примерно на 7 микросекунд в сутки.
Но на такой высоте земная гравитация слабее, поэтому по общей теории относительности те же часы, наоборот, спешат примерно на 45 микросекунд в сутки.
Итого: −7 + 45 = +38 микросекунд в сутки.
Звучит смешно, пока не вспомнишь, что свет за одну микросекунду проходит почти 300 метров.
Поэтому 38 микросекунд соответствуют примерно 11,4 километра пути светового сигнала. Релятивистские эффекты приходится учитывать в самой системе GPS, иначе точная спутниковая навигация просто не работала бы.
Ключи испарились, кошелёк пропал, а любимый питомец ушёл гулять дальше двора? Умный трекер безопасности RSH решает эти проблемы за секунды — без лишних приложений, абонентской платы и сложной настройки. Официальная сертификация Google, поддержка большинства Android-смартфонов (Xiaomi, Samsung, OnePlus) и экологичный корпус, безопасный даже для животных. Просто прикрепите его к ключам, ошейнику или положите в сумку — и забудьте о потерях навсегда. В этой подборке 10 вариантов популярных брендов.
1. GPS-трекер Peocke с поддержкой Google Find My — умное носимое устройство для отслеживания активности
Компактный портативный GPS-трекер бренда Peocke, совместимый с Android и сервисом Google Find My. Подходит для взрослых, имеет сертификацию CE и RoHS, поставляется с аккумулятором.
2. Bluetooth-трекер UGREEN SmartTag для Apple Find My — компактный брелок для поиска вещей
Портативный трекер бренда UGREEN, работающий через сеть Apple Find My. Совместим только с устройствами Apple (iOS 14.5, iPadOS 14.5, macOS 11 и новее) и не поддерживает Android. Имеет сертификацию CE, FCC, RoHS, KC и WEEE, питается от батарейки CR2032 со сроком службы до 24 месяцев. Позволяет находить вещи по всему миру, подаёт громкий сигнал при потере и даёт делиться местоположением с друзьями и близкими.
3. Магнитный GPS-трекер GF-07 для автомобиля — компактное устройство для скрытого отслеживания местоположения
Портативный GPS-трекер модели GF-07. Поддерживает частоты GSM 850/900/1800/1900 МГц, работает от аккумулятора 3,7 В с напряжением питания 3,4–4,2 В DC. Время позиционирования по GSM — около 25 секунд. Подходит для установки в автомобиле благодаря магнитному креплению.
4. Bluetooth-трекер для кошелька с поддержкой Apple Find My — ультратонкая карта для поиска вещей
Компактный трекер модели CARD-L2. Совместим только с устройствами Apple и работает через сеть Find My. Толщина всего 1,8–3 мм, вес 9 г — легко помещается в кошелёк, паспорт или багажную бирку. Поддерживает беспроводную зарядку с автономностью до 8 месяцев, дальность Bluetooth до 40 метров, громкий сигнал 80 дБ и режим уведомления о потере. Водонепроницаемый, обеспечивает анонимность и шифрование данных.
5. Карта UGREEN Security SmartTrack с поддержкой Apple Find My — водостойкий Bluetooth-трекер для кошелька
Компактный трекер модели CM817 бренда UGREEN, произведён в Китае. Совместим только с устройствами Apple (iOS 14.5, iPadOS 14.5, macOS 12.5 и новее). Оснащён Bluetooth 5.0, работает в диапазоне 2400–2483,5 МГц, максимальная мощность 4 дБм. Питается от литий-полимерного аккумулятора 155 мАч (3,7 В), заряжается через магнитный контакт, автономность до 12 месяцев. Имеет защиту IP68, поставляется в розничной упаковке UGREEN, гарантия 1 год.
6. Умный GPS-трекер HOCO Anti Lost Smart Tag с поддержкой Google Find My
Трекер модели E93A бренда HOCO. Работает через сеть Google «Найти устройство» и поддерживает Google Assistant, интерфейс на английском языке. Корпус из АБС-пластика размером 31,3 × 31,3 × 9,5 мм и весом 6,8 г. Питается от батарейки CR2032 ёмкостью 230 мАч со сроком службы 6–8 месяцев. Приложение устанавливается через Google Play.
7. GPS-трекер HOCO E94 с поддержкой Apple Find My — водостойкий брелок для поиска вещей
Компактный трекер бренда HOCO. Совместим только с устройствами Apple (iPhone 6s и новее, iPad, Mac) через приложение Find My, не поддерживает Android. Корпус из АБС-пластика размером 52 × 29 × 8,1 мм и весом 8,6 г. Питается от литиевой батарейки CR2032 (3 В, 230 мАч) со сроком службы 9–12 месяцев. Водонепроницаемый, интерфейс на английском языке.
8. GPS-трекер SZKOSTON для Apple AirTag — мини-брелок для поиска вещей через Find My
Компактный трекер бренда SZKOSTON из Китая с сертификацией CE. Работает только с Apple через Find My, радиус Bluetooth до 60 м, встроенный динамик 80–100 дБ. При потере сигнала подключается сеть Find My. Защита IP65, батарейка CR2032 со сменой, уведомления об оставленных вещах. Без абонентской платы.
9. Умный трекер безопасности RSH для Android с поддержкой Google Find
Компактный Bluetooth GPS-трекер бренда RSH. Совместим с большинством Android-устройств (Xiaomi, Samsung, OnePlus и другие) через Google Find. Позволяет находить ключи, питомцев и вещи, воспроизводит звук для быстрого поиска и поддерживает отслеживание на расстоянии. Экологичные материалы безопасны для животных. Возможен общий доступ для 5–10 человек. Для Samsung может потребоваться настройка разрешений Bluetooth и «Устройства поблизости» в сервисах Google.
10. Набор из 4 трекеров HOCO E91 Tiger с поддержкой Apple Find My — устройства против потери для кошелька, ключей, автомобиля и питомцев
Комплект из четырёх компактных трекеров модели E914 бренда HOCO, произведены в Китае, имеют сертификацию RoHS и поддержку платформы Apple HomeKit. Работают через сеть Apple Find My, интерфейс на английском языке. Корпус из АБС-пластика размером 31 × 31 × 9 мм и весом 7 г. Питаются от батарейки CR2032 ёмкостью 230 мАч со сроком службы 9–12 месяцев. Совместимы с iOS 14.5 и выше (iPhone 6s и новее, iPad, iPod touch 7-го поколения). Водонепроницаемые, в комплекте защитные чехлы.
На районе плохой сигнал gps. Поэтому каждый второй таксист или доставка не с района, просто "ой мы заблудились, гпс не работает". Т.е. взрослые человеки не могут банально сдвинуть пальцем карту на район и определить свое положение. Ну а там уж и оставшийся путь по району в 10-20 домов длиной.
Вот как раньше на машинах ездили: бумажный атлас автодорог россии/города, и погнали. Юез всяких там жпсов. И я, 10летний на заднем сиденье с этой книгой веду отца с урала до Череповца или Нижнего, али в москву.
А ныне все. Не то что телефон сел полностью - гпс нет, те, кто зарабатывает извозом/перевозом - все. В ступоре. Ну не дебилы ли?
Каждое лето одно и то же. Открываешь любой чат про Абхазию, спрашиваешь «сколько сейчас на Псоу?» — и получаешь три ответа: «полчаса», «три часа стояли, кошмар» и «а когда вы ехали-то?». Камера на КПП есть, но по картинке из очереди машин не понять, стоишь ты сорок минут или четыре часа.
У меня есть доступ примерно к сотне трансферных машин с GPS-трекерами, которые возят людей через эту границу каждый день. И в какой-то момент я подумал: они же физически проезжают через КПП. Если знать, когда машина въехала в зону пункта пропуска и когда выехала, время в очереди считается само. Не по ощущениям, а по факту.
Сделал. Ниже — как это работает, какие цифры получились за месяц, и где всё это врёт.
Как считается
Вокруг КПП нарисован круг радиусом 900 метров — он накрывает оба поста, российский и абхазский, и мост между ними. Раз в три минуты скрипт забирает точки треков и смотрит: машина вошла в круг, машина вышла из круга. Разница — время перехода. Направление определяется по тому, с какой стороны машина пришла и куда ушла: с севера на юг — в Абхазию, наоборот — в Россию.
Звучит просто, на практике половина работы — отсев мусора:
— На границе GPS прыгает. Точки, посчитанные по вышкам сотовой связи, а не по спутникам, выкидываются. Точки с плохой точностью — тоже. — Нужно минимум две точки внутри зоны, иначе машина могла просто проехать мимо по трассе. — Некоторые машины паркуются рядом с КПП на часы. Одна числилась «в очереди» 909 минут, пока не понял, что это стоянка. Такие переходы режутся по верхней границе. — Пешеходов трекерами не посчитать. Для них — только отчёты людей, и про это отдельно ниже.
Цифры за сентябрь
За 25 дней, со 2 по 26 сентября, система зафиксировала 1717 переходов границы, 75 разных машин. Скрипт запускался 11 тысяч раз, 43 раза упал — на границе часто нет ни интернета, ни GPS, это нормально.
Что вышло:
— Медиана — 45 минут. То есть половина машин проходит быстрее, половина медленнее. — Каждая десятая машина стоит больше 100 минут. Каждая двадцатая — больше двух часов. — Рекорд — почти 8 часов. Оба направления. — В Россию стоят заметно дольше, чем в Абхазию: в среднем 66 минут против 48.
Дальше самое полезное — время суток.
Когда ехать в Абхазию
Лучше всего вечером: с 21 до 23 часов среднее время — 27–37 минут. Хуже всего — с 12 до 13 часов, около часа. Утро с 8 до 10 — вполне терпимо, 41–45 минут.
Ночью цифры скачут: в час ночи среднее 106 минут, но машин там мало, и одна-две застрявшие сильно тянут среднее. Не верьте этой цифре буквально.
Когда ехать в Россию
Тут всё хуже и всё контрастнее. Пик с 11 до 15 — от 87 до 102 минут. Лучшее окно — рано утром, с 3 до 5, около 40 минут, и вечером после 20 часов. Если можете выехать до рассвета — сэкономите час.
По дням недели воскресенье — самый быстрый день в обе стороны (37 минут в Абхазию, 53 в Россию). Пятница и понедельник — худшие для выезда в Россию.
Почему просто среднее — плохая идея
Первая версия показывала «среднее за последние полтора часа». Я проверил её на истории: для каждого реального проезда посчитал, что показал бы сайт в момент въезда машины. Ошибка — 29 минут. Потом посчитал, что было бы, если показывать всегда одно и то же число, 47 минут. Ошибка — 25 минут. То есть моя «живая статистика» была хуже константы. Обидно.
Причина: машин мало, а разброс между ними огромный. Две подряд застрявшие машины — и «сейчас» показывает два часа, хотя очередь обычная.
Сейчас считается иначе: свежие проезды берутся с затухающим весом (проезд получасовой давности весит вдвое меньше только что случившегося), и это смешивается с типичной картиной для этого часа за прошлые недели. Ошибка упала до 24 минут, и «нет данных» ночью больше не бывает. Это всё равно много — но это предел при таком разбросе, и на странице честно написано «примерно».
Про отчёты людей
На странице есть форма «я только что прошёл границу, заняло N минут». За месяц пришло 15 отчётов. В 11 из них — ровно 30 минут. Потому что 30 — это значение ползунка по умолчанию, и люди жмут «отправить», не двигая его. Так что отчётам я доверяю вдвое меньше, чем машинам, и это тоже честно учтено в формуле.
Что это даёт
Не гарантию. Гарантии на этой границе не бывает. Но теперь вместо «а кто-нибудь недавно проезжал?» есть число, посчитанное по реальным машинам за последние часы, график по часам суток и прогноз на завтра для того же дня недели.
В GeoConquest игрок оставляет на реальной карте временный след.
Если выйти со своей территории, пройти маршрут и вернуться обратно, контур замыкается. Гексы внутри него становятся частью владения.
Но что происходит, если внутри петли уже находится чужая территория?
Игра не перекрашивает её автоматически. Она запускает отдельное состязание с владельцем.
Сразу уточню важную вещь: эту механику я не добавлял после появления первых игроков. Я закладывал её с самого начала, ещё в прототипе на локалхосте, когда играл один и телефона даже не было.
Вопрос был не в том, нужно ли защищать чужую территорию. Это было частью идеи игры изначально.
Вопрос был в другом: как именно разрешать конфликт, если один маршрут пересекает территории нескольких владельцев?
Чужая территория принадлежит не гексу, а владельцу
Можно было сделать отдельную случайную проверку для каждого гекса.
Но тогда большая территория превращалась бы в мозаику. Часть клеток случайно захватилась, часть осталась, внутри чужого участка появились дырки и обрывки.
Это выглядело бы так, будто игра бросает монетку для каждой клетки и вообще не понимает, кому принадлежит земля.
Поэтому конфликт разрешается на уровне владельца.
Если внутри петли оказались:
нейтральные клетки;
территория игрока А;
территория игрока Б;
территория клана В;
то нейтральные клетки захватываются напрямую, а с каждым владельцем проходит отдельное состязание.
Если один и тот же игрок оказался внутри контура в нескольких разрозненных местах, это всё равно один конфликт. В случае победы атакующего меняются все затронутые клетки этого владельца. В случае поражения они остаются на месте.
Так результат не превращается в случайную шахматную доску.
Нейтральная земля и чужая земля ведут себя по-разному
Нейтральные гексы не защищаются. Если игрок замкнул контур вокруг пустой территории, она просто переходит под его контроль.
Но чужие гексы требуют отдельной проверки.
Если атакующий выигрывает, его след закрепляется, а клетки владельца переходят к атакующему.
Если проверка не пройдена, чужая территория остаётся на месте. Временный след атакующего тоже не превращается в постоянную землю поверх неё.
Это позволяет пройти по чужому району, попробовать замкнуть большую петлю, проиграть спор и при этом не уничтожить всю работу другого игрока одним маршрутом.
На что влияют Натиск и Стойкость
Я хотел, чтобы маршрут был не единственным решением игрока.
В игре есть характеристики, которые меняют вероятность конфликта:
«Натиск» увеличивает шанс успешной атаки;
«Стойкость» помогает защищать свою территорию.
Базовый шанс атаки составляет 87 процентов.
Разница между Натиском атакующего и Стойкостью владельца меняет его на 1 процент за каждый пункт разницы.
Формула выглядит так: 87% + 1% * (Натиск - Стойкость) Шанс ограничен снизу 37 процентами и сверху 100 процентами.
Например: Натиск 18 против Стойкости 13 = 92% Натиск 7 против Стойкости 13 = 81%
На скриншоте ещё старые формулы, но суть передаёт
В окне нападений это отображается не просто как «победа» или «поражение».
Можно увидеть, кто атаковал, к какому клану он относится, какие характеристики участвовали в споре, какой был шанс и сколько гексов стояло на кону.
Это именно состязания между владельцами. Не отдельный бросок для каждой клетки.
В игре есть временные усиления
Одних постоянных характеристик мне показалось мало.
В игре есть активируемые эффекты, которые можно сохранить для важного маршрута:
«Боевой перевес» позволяет атакующему использовать лучший из двух случайных результатов;
«Оберег» заставляет учитывать худший результат атаки по защищающейся стороне.
Если оба эффекта используются одновременно, они нейтрализуют друг друга.
Такие усиления расходуются во время конфликта. Поэтому игроку приходится решать, потратить их сейчас на небольшой участок или оставить для большой петли, важного района или атаки на клановую территорию.
Для клана территория тоже единая
Внутри клана нет личных кусочков земли каждого участника.
Для карты клан является одним владельцем. Территория принадлежит клану, а не отдельным людям внутри него.
Поэтому атака на клановую землю тоже становится одним состязанием с эффективными характеристиками клана.
Если клановую территорию атаковали, уведомление получают участники, которые состояли в клане в момент разрешения конфликта.
Получается асинхронная ситуация: один игрок гуляет и замыкает петлю, а позже несколько участников клана узнают, что их землю пытались отнять.
Я хотел сделать игру, а не GPS-трекер
Это, наверное, главная причина, почему в GeoConquest вообще появились такие механики.
Я не хотел делать очередное приложение для бегунов, которое просто записывает маршрут, показывает километры и рисует красивую линию на карте.
GPS в игре является источником управления, но не самой игрой.
Игроку нужно думать:
какой маршрут построить;
где замкнуть петлю;
чью территорию попробовать атаковать;
какие характеристики прокачивать;
когда использовать временное усиление;
стоит ли рисковать большой частью маршрута ради чужой земли.
В обычном трекере прогулка заканчивается, когда ты дошёл до точки назначения.
В GeoConquest движение только создаёт игровую ситуацию. Потом нужно получить результат, принять риск и жить с последствиями на общей карте.
Поэтому мне было важно, чтобы чужую территорию нельзя было просто стереть одним удачным маршрутом.
Итоговая логика получилась такой:
нейтральную землю можно захватить напрямую;
чужая территория запускает отдельный спор;
игроки влияют на спор характеристиками;
временные усиления позволяют подготовиться к важной атаке;
клан может защищать общую территорию как единый владелец;
результат сохраняется в истории мира.
Это уже больше похоже на классическую игру с развитием, ресурсами, риском и решениями, чем на приложение для подсчёта шагов.
А вам было бы интереснее видеть точный шанс до замыкания петли или лучше оставлять результат неизвестным до самого конца маршрута?
Когда я добавил в GeoConquest кланы, у игроков появилась общая территория. Это было важно: я изначально не хотел делить захваченные гексы между участниками.
Но довольно быстро стало понятно, что одной общей территории недостаточно.
Клан мог выглядеть впечатляюще на карте, но при этом почти всю работу выполнял один человек. Остальные участники видели общий результат, но не всегда понимали, зачем им выходить в игру именно сегодня.
Тогда я начал добавлять недельные события.
Каждую неделю игра предлагает кланам другую цель. Например:
больше двигаться;
захватывать нейтральные гексы;
отбирать территории у соперников;
замыкать большие петли;
помогать клану активностью;
участвовать в захвате новых мест.
В один период выгодно исследовать незнакомые районы, в другой — защищать уже захваченное, а в третий — искать соперников и отбирать их территорию.
Из-за этого одна и та же карта начинает играться по-разному.
Общая цель, но вклад каждого виден
Мне было важно не превратить событие в соревнование одного самого активного игрока.
Поэтому итоговый результат считается для клана, но вклад участников тоже сохраняется. Можно увидеть, кто больше двигался, кто захватывал территорию, кто помогал с заданиями, а кто просто числился в составе.
В игре есть и ежедневные задания: зайти, оставить след, замкнуть петлю, захватить чужую территорию, написать в клановый чат.
Это небольшие действия, но вместе они создают ощущение, что клан живёт не только на карте, но и внутри самой игры.
Сначала я чуть не сломал недельную гонку
У первой версии была очень неприятная проблема.
Текущее событие и его очки хранились только в оперативной памяти сервера. После перезапуска бэкенда игра могла выбрать совершенно другое событие, а накопленные результаты исчезали.
Получалось, что игроки всю неделю соревновались за «Неделю движения», а после обычного рестарта внезапно оказывались в «Неделе экспансии» с пустым рейтингом.
Для игрока это выглядело бы так, будто правила поменяли посреди турнира.
Пришлось вынести всю ивентовую систему в постоянное хранилище: текущее событие, результаты участников, дату окончания и награды. Теперь перезапуск сервера не должен менять ход соревнования.
Награды должны влиять на игру
Победа в событии — это не просто цифра в таблице.
Лучшие кланы получают медали и место в истории соревнований, а участники — ресурсы, которые можно использовать дальше. В магазине появились предметы и усиления, поэтому недельная гонка постепенно стала связана с остальными системами игры.
Сейчас я расширяю пул событий. В нём уже есть режимы для движения, экспансии, вторжений, первооткрывателей и сплочённости, а дальше их станет ещё больше.
Мне нравится, что это позволяет не балансировать одну-единственную стратегию навсегда. Клан не обязан всегда делать одно и то же: сегодня можно идти в дальнюю экспедицию, на следующей неделе — защищать границы, а потом устроить гонку за самые большие петли.
И, кажется, именно этого не хватало общей собственности.
Десять недель — десять способов играть
Сейчас в ротации десять ивентов. Это не десять вариантов одного и того же рейтинга: каждый из них заставляет клан по-другому смотреть на карту.
Неделя захватов Нейтральный гекс приносит 1 очко, территория одиночного игрока — 2, территория другого клана — 3. Это универсальный режим, который постепенно подталкивает игроков от спокойной экспансии к конфликту.
Неделя дуэлей Очки начисляются за выигранные состязания, а не за размер захваченной территории. Здесь важнее успешно отстоять или отвоевать конкретный участок, чем просто нарисовать огромную петлю.
Неделя экспансии Клан получает очки за каждый новый рекорд по размеру своей территории в течение недели. Этот режим поощряет устойчивый рост и заставляет следить не только за отдельными захватами, но и за общей площадью владений.
Неделя больших петель Маленькие захваты до 20 гексов не считаются, а за большие петли очки растут быстрее, чем их размер. Поэтому выгоднее заранее планировать длинный маршрут, а не закрывать множество маленьких фигур.
Неделя движения В зачёт идут подтверждённые переходы между гексами. Это самый прямой режим: клан соревнуется не за конкретную территорию, а за то, кто больше исследует карту ногами.
Неделя усилений Очки дают только покупки «Усиления клана» — по 120 за каждую. Захваты и движение в этот момент не помогают рейтингу. Идея в том, чтобы на неделю превратить развитие самого клана в общую задачу.
Неделя вторжений Считаются только гексы других игроков и кланов. Нейтральная территория ничего не приносит, поэтому приходится искать чужие границы и идти на прямое столкновение.
Неделя сплочённости Каждый участник, который заработал хотя бы одно очко активности за день, приносит клану одно очко ивента. Повторная активность в тот же день уже не добавляет баллы. Так система поощряет не одного сверхактивного игрока, а участие всей команды.
Неделя первооткрывателей В зачёт идут только захваты нейтральных гексов. Чужие территории не считаются. Этот режим нужен, чтобы игроки отправлялись в ещё не исследованные места, а новые кланы могли соревноваться не только там, где уже идёт война.
Неделя покупок За каждый потраченный в магазине жетон клан получает одно очко. Засчитываются только покупки участников кланов, поэтому это уже не личное соревнование, а попытка всей команды договориться, как использовать общий ресурс.
Получается, что одна неделя просит идти дальше, другая — искать соперников, третья — строить большую территорию, а четвёртая — просто убедиться, что клан не состоит из одного активного человека.
Это заставляет каждую неделю по-разному подходить к игре, иногда даже оставлять лакомые территории на будущее, потому что они больше повлияют на грядущий ивент, а сейчас заняться чем-то иным.
А какой недельный режим вы бы добавили в такую игру?
Играть можно прямо в телефонном браузере: geo.juju.ru
В начале мая я взял раннюю версию GeoConquest с собой в отпуск в Петербург.
Игра уже работала на настоящем GPS: можно было выйти со своей территории, оставить за собой след, замкнуть маршрут и захватить оказавшийся внутри участок реальной карты.
В Москве я протестировал эту механику и решил, что с сеткой всё в порядке.
Петербург довольно быстро доказал обратное.
Сначала я решил захватить город с теплохода
План казался прекрасным: сесть на прогулочный теплоход, проплыть по рекам и каналам и оставить за собой огромный след через центр Петербурга.
На практике всё закончилось примерно у первых мостов.
Под ними мой телефон начал терять GPS. В маршруте появились разрывы, а вскоре след оборвался окончательно. Надежду захватить половину города, лениво сидя на палубе, пришлось оставить.
попытка захватить Петербург с теплохода
На скриншоте ещё используется OpenStreetMap. На Яндекс Карты игра переехала значительно позже.
Зато этот кадр точно показывает возраст версии: он сделан 5 мая, примерно за неделю до одной из самых больших переделок всей игры.
Тогда я пошёл захватывать «Газпром»
Следующей целью стал Лахта Центр, где находится центральный офис «Газпрома».
Сначала я почти замкнул маршрут вокруг здания.
А ещё через несколько секунд Лахта Центр уже целиком находился внутри моей территории.
К сожалению, с тех пор перед публичным релизом я делал вайп, так что сейчас территория вновь свободная - your's for the taking! (а вообще в игре вайпов нет)
После этого я поднялся на экскурсии на 83-й и 86-й этажи. Получилась довольно полная программа посещения: сначала захватить небоскрёб на карте, затем посмотреть с него на город сверху.
Но именно во время петербургских прогулок я начал замечать странность.
За одинаковое пройденное расстояние игра выдавала здесь больше гексов, чем в Москве.
Я хотел сделать гексы размером 30 метров
Первую географическую сетку я написал самостоятельно.
Внутри игры каждый гекс имел обычные координаты q,r. Я накладывал эту бесконечную сетку на проекцию карты и задавал клеткам фиксированный размер: 30 метров от одной плоской стороны до другой.
Звучит логично. Метр в Москве должен быть таким же метром в Петербурге, Африке или Австралии.
Но карта Земли не является самой Землёй.
Для отображения мира использовалась проекция Меркатора. Чем дальше от экватора, тем сильнее она растягивает поверхность на экране. Моя сетка оставалась одинаковой в координатах проекции, но её реальный размер на земле менялся вместе с широтой.
У экватора условный 30-метровый гекс действительно занимал примерно 30 метров.
В Москве его реальный размер уменьшался примерно до 17 метров.
В Петербурге — уже примерно до 15.
Получалось, что за одно и то же расстояние петербургский игрок мог пересечь примерно на 12% больше гексов, чем московский. А игроку ближе к экватору пришлось бы ходить почти вдвое больше.
География сломала игровой баланс
В GeoConquest количество гексов — не просто визуальная условность.
За каждый гекс игрок получает опыт движения. Гексами измеряется площадь захвата, размер владений, задания и активность клана. Чем мельче клетки в конкретном городе, тем быстрее там можно было развиваться.
Петербург получал преимущество перед Москвой.
Москва получала огромное преимущество перед Сингапуром.
А на совсем высоких широтах сетка продолжала бы сжиматься ещё сильнее.
Для обычной карты такое искажение терпимо: пользователю важно увидеть улицы и построить маршрут. Но для игры, в которой сама поверхность карты является общим соревновательным полем, это превращалось в фундаментальную несправедливость.
Нельзя делать всемирную стратегию, в которой сложность зависит от широты города.
Исправить одну формулу не получилось
Первой мыслью было просто компенсировать масштаб проекции через широту.
Но тогда начинали расползаться остальные части системы.
Клиент самостоятельно рассчитывал форму каждого гекса. Сервер хранил территории под идентификаторами вроде -7442,332795. По этим же координатам вычислялись соседи, расстояния, маршруты, видимая область и захваты.
Для отдаления карты я уже построил несколько уровней детализации: маленькие клетки объединялись в более крупные, чтобы показать территорию города, страны или континента.
Все эти системы предполагали, что мир является одной идеально регулярной плоской сеткой.
Можно было продолжать чинить её по частям. Добавить поправку на широту, отдельно исправить отрисовку, придумать новые правила для соседей и переделать уровни детализации.
Но чем дальше я смотрел, тем яснее становилось: проблема находилась в самой основе.
Выбор пал на H3
Вместо собственной сетки я решил использовать H3 — географическую систему, которая делит поверхность Земли на иерархию вложенных ячеек.
Она изначально предназначена для работы с глобальными координатами. Для любой точки можно получить идентификатор ячейки, её границы, соседей и родительскую клетку более крупного уровня.
Самое важное: размеры ячеек остаются сопоставимыми в разных частях планеты. Они не уменьшаются систематически при движении от экватора к полюсам только из-за проекции карты.
На плоском изображении всё выглядит даже немного парадоксально: северные гексы кажутся крупнее южных. Но это карта растягивается к полюсам, а не реальные ячейки на поверхности Земли.
Заодно H3 уже имела готовую вложенность. Мелкие игровые ячейки можно объединять в более крупные родительские и показывать на разных уровнях масштаба.
Это заменяло значительную часть моей самодельной системы отображения мира.
А потом начался страшный рефакторинг
Перейти на H3 означало не поменять одну библиотеку, а заменить язык, на котором вся игра описывала карту.
У старого гекса были две числовые координаты: q и r.
У нового появился непрозрачный H3-идентификатор. Его границы больше нельзя было самостоятельно восстановить простой формулой на клиенте. Даже форма ячеек могла немного различаться, а среди обычных шестиугольников на планете существуют специальные пятиугольные ячейки.
Пришлось переделать почти всё:
преобразование GPS-координат в игровую клетку;
хранение территорий и следов;
поиск соседних гексов;
расчёт расстояния;
движение игроков и тестовых ботов;
заполнение области внутри маршрута;
отрисовку границ на клиенте;
загрузку территорий вокруг игрока;
уровни детализации на дальнем масштабе;
тесты, которые раньше оперировали координатами q,r.
Геометрию я перенёс на сервер. Теперь именно сервер сообщает клиенту центр и настоящие границы каждой ячейки, а клиент только отображает полученные данные.
Старую тестовую карту пришлось очистить: прежние идентификаторы территорий не имели честного взаимно однозначного соответствия новым H3-ячейкам.
В одном основном коммите изменились 24 файла, добавилась примерно тысяча строк и удалилось больше двухсот. Но реальный объём работы был больше: до этого я несколько дней выстраивал границу между старой сеткой и остальной игрой, чтобы не менять всё одновременно.
Гексы стали немного менее красивыми, но игра — честнее
На идеальной плоской сетке каждый шестиугольник выглядит совершенно одинаково.
H3 покрывает не плоскость, а почти сферическую Землю. Поэтому ячейки могут быть слегка вытянутыми, а их форма и площадь не абсолютно идентичны по всей планете.
Но теперь это небольшие особенности глобальной географической системы, а не двукратная разница между экватором и северными городами.
Игроки в Петербурге больше не получают систематическое преимущество перед Москвой только из-за широты. Можно открыть игру в другой стране и рассчитывать на сопоставимый масштаб территории, движения и наград.
Через неделю после прогулки на теплоходе GeoConquest уже работала на H3.
Поэтому старые петербургские скриншоты для меня выглядят немного странно: на них ещё видна первая сетка, которая смогла пережить Москву, но не выдержала поездки в отпуск.
А вам что кажется важнее для игры на реальной карте: идеально одинаковая форма клеток на экране или максимально близкий физический размер по всему миру?
Вчера решил прокатиться на велосипеде, а жена пошла пешком нахаживать челлендж в 10000 шагов.
Договорились встретиться в определенном месте.
Понятно, что я приехал туда быстрее, в по пути хотел узнать примерную свою скорость (ехал по дороге). Включаю Яндекс навигатор, и он мне показывает скорость 3-4 километра в час. Часто вовсе 0.
Ну понятно - GPS опять тупит, или его глушат (беспилотную опасность отменили несколько часов назад).
Вопрос 1
И у меня возник вопрос. Что-то давно нет никаких новостей о распиаренном несколько лет назад ГЛОНАСС. Он даже стоит в автомобилях (время, кстати, там тоже часто сбивается).
Телефон поддерживает и GPS, и ГЛОНАСС. Но навигатор показывает ерунду. Ладно ГэПэСэ, но ГЛОНАСС тоже глушат? Или он не работает?
Жене для трекинга нужна программа, записывающая трек, скорость, расстояние. Мы вместе с ней поставили разные программы для этого. Так вот они тоже работают через раз.
Моя прога вначале показала мое местоположение в другом месте, потом начала вести в противоположном направлении, в итоге локация скакнула ближе, но, несмотря на то, что я ехал по прямой, начала крутить меня на одном месте и показывать скорость 0.3 км/час.
Жена тоже не смогла воспользоваться тренингом, и, соответственно не может подтвердить свой челлендж.
Вопрос 2
Знаю, что многие, кто занимается активным спортом - ходьба/бег/вело - используют программы - трекеры.
До недавнего времени была популярна Strava - народ из нее выкладывал свои данные. Не знаю - работает она сейчас или нет.
Для пеших популярны другие.
Если у вас есть опыт использования программ - порекомендуйте. Что сейчас адекватно работает? Или не вариант?
Не в тему
Выбираю теги для сообщения, и Пикабу предлагает "Рома Вопрос".