Лет 8 назад пришла идея создать игру, где игрок сможет программировать космические аппараты, управлять его системами, управлять полётом и так далее. Концептуально игра должна была быть похожей на Kerbal Space Program, но вместо конструирования космических аппаратов игрок должен их программировать. Также KSP мне не нравился тем, что игрок по сути управляет космическим аппаратом вручную, вручную совмещает точки, стыкует космические аппараты «на глаз». Хотелось больше автоматизации (космическая станция должна расти). И в этот момент у меня зародилось приблизительное и далёкое видение моей игры.
На тот момент я интересовался программированием, но моих знаний не хватало для того, чтобы создать самому игру такой сложности. Однако примерно 3 года назад, уже имея профессиональный опыт в программировании, я решил, что пора, поэтому приступил к написанию. Конечно, как оно всегда бывает, финальный вариант далеко отличается от того, каким он задумывался, многие фичи сложно реализовать, некоторые выглядели в воображении лучше, чем оказалось на практике, однако основную идею, на мой взгляд, мне удалось воплотить, и я могу сказать, что вполне доволен результатом.
Общий обзор:


Игроку предоставляется возможность писать и тестировать код в специальной тестовой среде, которую можно перезапускать много раз, чтобы тестировать код снова и снова. В верхней части размещены кнопки start/stop — запуск и остановка выполнения кода, reset — для перезапуска конфигурации, при этом положение и скорость космических кораблей будут сброшены до начальных. save — для сохранения кода, чтобы продолжить работу позже, а submit — для того, чтобы «отправить» код на космический корабль. Если код был отправлен, он больше не может быть изменён через submit.
Системы корабля:
Каждый космический корабль обладает набором систем, который формирует адресное дерево, с которыми пользователь может взаимодействовать через предусмотренные методы. Вот пример систем для корабля Crew Dragon:

То есть это можно считать абстрактным слоем взаимодействия с «железом» корабля. Игрок может создавать поверх свои слои абстракций, оборачивая эти команды в свой функционал.Для примера можем рассмотреть методы, которые управляют маневровым двигателем. Двигатели управляются с помощью следующих команд.

Cхема расположения маневровых двигателей на корабле:
Здесь показан процесс стыковки к космической станции. В программном обеспечении был прописан маршрут, по которому следует Dragon. Система координат привязана к стыковочному порту, к которому должен пристыковаться корабль.
Алгоритм стыковки на каждой итерации запрашивает данные от системы LaserRangeFinder (
лазерный дальномер), которая предоставляет актуальную позицию всех космических кораблей и их стыковочных портов. Запрос данных:
const data = System.RPO.LaserRangeFinder.scan();
и метод возвращает JSON‑структуру, где указывается расстояние по двум осям до стыковочных портов всех космических кораблей, находящихся неподалёку. Поэтому Dragon постоянно мониторит обстановку вокруг себя и знает расстояние до близко расположенных космических аппаратов.
LRF (LaserRangeFinder) — для точного определения размеров и расстояния до космического аппарата. Предоставляет информацию обо всех космических аппаратах в радиусе 150 метров. Жёлтыми точками обозначаются стыковочные порты
PR (ProximityRadar) — радар для дальнего обнаружения объектов (1 — 50 км)

Также был добавлен оверлей, отображающий в углу экрана дополнительную информацию о выбранном аппарате: id, название аппарата, координаты, скорость и так далее. При достаточном удалении камеры космические аппараты практически не видны, и вокруг них для удобства появляется рамка. Синяя стрелка указывает направление на выбранный из списка аппарат относительно основного (к которому прикреплена камера), а также отображает расстояние до него и относительную скорость по двум осям. Фиолетовая стрелка указывает направление к Земле.
Ещё одним интересным примером является работа роботизированной руки, которая может перемещать модули и таким образом менять конфигурацию станции. За работу этой руки отвечает отдельная система System.Canadarm. Игрок может управлять отдельно каждым звеном, задавая направление вращения, по часовой стрелке или против. Без обратной кинематики здесь не обойтись:). Параллельно с работой манипулятора модуль Harmony стремится удерживать всю станцию «ровно» с помощью маневровых двигателей, поскольку перемещение модуля создает крутящий момент, который необходимо компенсировать.
Data link:
По сути это наземная радиостанция — инструмент, который позволяет отправлять радиокоманды космическим кораблям (в данном примере — спутнику), получать ответ, а также в принципе прослушивать радиоэфир на любой частоте. Игрок также имеет возможность программировать эту радиостанцию, например, для того чтобы периодически связываться с космическими кораблями, передавать полезные данные и получать какую‑то информацию, например телеметрию. Также предусмотрена возможность отправлять команды вручную в окне uplink, команды должны быть заранее описаны в коде. Полученный сигнал от космических аппаратов также доступен в самом коде и для наглядности дублируется в окне downlink в шестнадцатеричном и ASCII форматах.
В данном сценарии я вызываю команду, которая отправляет сигнал (последовательность байтов Uint8). В качестве параметра передаю id спутника — 10. Этот параметр будет отправлен в радиосигнале отдельным байтом, чтобы спутник знал, что обращаются именно к нему.
System.RadioCommunication.Transmitter.sendMessage(msg);
Спутник принимает сигнал, анализирует байты и таким образом узнает, что от него требуется, запрашивает информацию о температуре бортовых систем:
const data = await System.TCS.info(); // TCS: Temperature Control System
метод возвращает объект, на его основе формирует ответ по заданному шаблону и отправляет обратно. Наземная радиостанция (graundComSystem) получает ответ и отображает информацию в консоли вывода.
#onNewSignalReceived(msg) { // Обработка входного сигнала }
Рядом со спутником появляются соответствующие значки в тот момент, когда он получает или отправляет радиосигнал.
Радиообмен возможен также между двумя космическими аппаратами. Радиопередатчик‑приёмник можно настраивать на разные частоты и таким образом одновременно поддерживать связь с несколькими аппаратами по разным каналам.
Command console:
Если космический корабль пилотируемый, тогда есть возможность управлять им через командную строку, будто это делает космонавт на борту корабля. Команды, доступные в консоли, должны быть заранее прописаны в программном обеспечении космического корабля, то есть игрок имеет возможность создавать команды для своих нужд, для разных ситуаций и сценариев.
В данном случае управление освещением осуществляется с помощью командной строки:(Рисовать я особо не умею, поэтому не получилось создать реалистичное и приятное освещение в модуле)
Пример посадки Falcon 9:
Здесь алгоритм посадки управляет отклонением двигателей от осевой линия ракеты для того, чтобы контролировать горизонтальную и вертикальную скорости. Также топливная система работает так, что игрок должен сначала запустить турбонасос, установить нужный поток топлива и после этого зажечь двигатели. Таким образом тяга двигателей дросселируется через частоту оборотов турбонасоса.
index — номер двигателя, всего 9
System.FuelSystem.TurboPump.setValveThrottle(40, index); // установка потока топлива для конкретного двигателя — 40 % от максимального System.EngineBlock.Engine[index].start(); // запуск двигателя
Надеюсь, мне удалось донести основную идею этого проекта, эта версия служит только для демонстрации идеи в целом и является по сути песочницей без каких‑либо миссий, уровней, заданий и так далее. Мне было бы очень интересно узнать, будет ли это в принципе кому‑то интересно «играть», поэтому я был бы очень рад почитать ваши комментарии с оценкой этого проекта. Было бы также интересно почитать, какого рода контент вы бы хотели в такой игре (технологии нашего времени или будущее с лазерами, силовыми щитами и дронами), идеи для сюжета, сеттинга. Возможно, помимо классического программирования, также было бы хорошо реализовать программирование с помощью блоков, вроде Scratch.
Надеюсь, это был интересный материал, спасибо всем, кто дочитал до конца, с радостью отвечу на ваши вопросы.
Комментарии (2)

Wizard_of_light
05.08.2026 09:41В принципе интересно, по крайней мере на андроиде игр с таким сеттингом не помню. На ПК есть Space Engineers, где корабли можно и построить, и запрограммировать)
Krada
О, «Посадка на Луну» подъехала. Бессмертная тема, в которую ещё на перфокартах играли.