Разработать навигатор для игры? Смотрите! (часть 2.4)
Телефон как второй экран: локальный API вместо магии После телеметрии и калибровки оставался вопрос: как телефон вообще должен это видеть? Я не хотел ставить отдельное приложение на телефон. Идея была проще: ПК запускает локальный сервер, телефон в той же Wi-Fi сети открывает веб-страницу. Получается companion app без облаков и регистрации. На стороне сервера есть endpoint `/api/state`. Он отдает уже очищенное состояние машины: скорость, передачу, обороты, координаты на карте, направление, статус live/hold/waiting. ```python if path == "/api/state": self.send_json(STATE.get_snapshot()) return ``` На стороне браузера обычный polling: ```javascript async function pollTelemetry(){ try{ const r = await fetch('/api/state?ts=' + Date.now(), {cache:'no-store'}); telemetry = await r.json(); updateHud(); updatePlayerMarker(); } finally { setTimeout(pollTelemetry, 120); } } ``` 120 мс - достаточно часто, чтобы точка ощущалась живой, но не настолько часто, чтобы телефон начал страдать как ноутбук с открытым Excel на 200 тысяч строк. Еще пришлось обработать паузы и меню. Когда игра теряет фокус или стоит на месте, телеметрия может вести себя странно. Поэтому я храню последнюю хорошую позицию и не даю точке внезапно улететь в координатный ад. ```python pause_coordinate_hold = bool( speed_mps <= 0.20 and gear == 0 and self.last_good_position is not None ) if pause_coordinate_hold: pos_x, pos_y, pos_z, map_x, map_y, yaw, heading = self.last_good_position else: self.last_good_position = (pos_x, pos_y, pos_z, map_x, map_y, yaw, heading) ``` Фундамент серии получился такой: UDP -> struct -> координаты -> калибровка -> JSON -> телефон. После этого уже можно строить настоящее мясо: карту, POI, дорожный граф, маршрут и борьбу с развязками.
Если вам интересно посмотреть проект целиком - ссылка на мой GitHub в описании профиля.