1. Шаг 1. Дожимаем ТЗ до конкретики
Портал разобран, карта есть — и Тёма со спокойной совестью возвращается к мечте. На руках у него честное ТЗ от Лёхи — пять пунктов: вид от первого лица, перемещение, поставить блок, убрать блок, небольшой замкнутый мир. Но прежде чем отдать это Сане, Лёха дожимает постановку ещё на шаг — до вещей, которые агенту реально нужны, чтоб не гадать.
— Пять пунктов — это костяк, — говорит Лёха. — Но давай добавим, чем именно управлять и в чём это живёт, иначе Саня опять пойдёт переспрашивать. Мышь крутит голову, WASD — ходьба. Клик левой — сломать блок, правой — поставить. Мир — плоская площадка из кубов, скажем, двадцать на двадцать, и стенка по краю, чтоб не свалиться в пустоту. И пусть это будет один index.html, открываешь двойным кликом — как все твои игрушки.
Тёма собирает финальное ТЗ — уже сам, Лёха только поправляет формулировки:
Собери браузерный voxel-мир в одном index.html.
- вид от первого лица; мышь — осмотреться, WASD — ходьба;
- мир: плоская площадка 20×20 из кубов, по краю стенка;
- левый клик — сломать блок, на который смотрю; правый — поставить;
- открывается двойным кликом по файлу, без установки.
2. Шаг 2. Саня ищет готовую библиотеку
Тёма уже тянется жать Enter, но Саня отвечает не кодом, а вопросом-предложением:
— Трёхмерный мир с нуля в браузере — это тысячи строк возни с графикой. Но есть готовая библиотека для 3D — three.js. Она берёт на себя всю тяжёлую часть: сцену, камеру, отрисовку кубов. Подключим её и соберём мир поверх — быстро и надёжно. Ок?
Тёма ухмыляется — знакомая история. Ровно как вчера с шахматами: не писать правила игры руками, а взять готовую chess.js, где всё уже придумано. Здесь то же самое, только для 3D.
— О, я это уже проходил, — говорит он вслух. — Не изобретать велосипед, взять готовое колесо. Давай через эту твою three.js.
Ему даже не нужно разбираться, что там внутри библиотеки. Главное усвоил ещё вчера: если задача типовая — почти наверняка кто-то уже написал под неё библиотеку, и агент её найдёт. Твоё дело — не писать движок, а попросить агента взять правильный готовый.
3. Шаг 3. Агент собирает мир по шагам
Саня не вываливает всё разом — идёт понятными шагами, и каждый Тёма видит в чате как отдельное действие:
● Подключаю three.js по CDN в index.html # готовая 3D-библиотека
● Создаю сцену, камеру от первого лица, отрисовку # scene, camera, renderer
● Строю пол 20×20 из кубов + стенку по краю # мир из блоков
● Вешаю управление: мышь — обзор, WASD — ходьба # PointerLockControls
● Добавляю «прицел»: на какой блок смотрю # Raycaster
● Левый клик убирает блок, правый — ставит
● Готово. Открой index.html двойным кликом.
Тёма не вчитывается в имена — scene, Raycaster, ему это ничего не говорит. Но общую логику ловит: агент подключил готовую библиотеку, построил из кубов площадку, повесил на мышь и клавиши управление, а «прицел» — это чтоб понимать, на какой именно куб он смотрит, когда бьёт. Не магия из ниоткуда, а понятные куски, собранные из готового.
А потом приходит «готово». И вот тут Тёму на секунду накрывает: палец над запуском.
— Ну, — говорит он вслух. — Или сейчас, или весь год мечтал зря.
Жмёт.
Экран гаснет. Чёрный квадрат, доля секунды.
А потом картинка проявляется — и его будто втягивает внутрь. Он не смотрит на мир сверху, как на карту, — стоит прямо в нём, все от первого лица. Перед ним блоки. Жмёт «вперёд» — мир сдвигается, будто он правда сделал шаг. Поворачивает — вокруг разворачивается кубический ландшафт во все стороны.
— Да ладно, — выдыхает он.
Тянется поставить блок — блок встаёт ровно там, куда целился. Бьёт по соседнему — тот исчезает, оставив пустоту. Тёма не верит и проверяет: ставит ещё, ломает, ставит три подряд, лепит кривую косую башенку, обходит её кругом — башенка стоит, никуда не девается, он реально ходит вокруг.
— Год пялился на эту картинку, — говорит он в пустую комнату, обходя башенку ещё раз. — А теперь хожу по ней ногами.
Не «что-то похожее на». Не демка ради галочки, не картинка, на которую можно только смотреть. Именно та штука, про которую он год думал как про недостижимую, — и она слушается его рук, прямо сейчас. По крайней мере ее первая часть.
4. Результат: работающий проект
И прямо посреди этого его дёргает мысль. Не выходя из мира, он открывает рядом вторую вкладку — то самое утреннее видео из первого дня. Отматывает к доске желаний, к кривоватому скрину в углу. Ставит два экрана впритык.
Слева — кубик с доски его будущего. Справа — то, по чему он только что ходил.
Они одинаковые.
Тёма переводит глаза с одного на другое и обратно. Те же блоки. Тот же вид от первого лица. Та же кубическая земля до горизонта. Год назад постаревший Тёма скользнул по этому скрину голосом, вскользь, и обронил: «это все у тебя могло быть в будущем».
— «В будущем», — повторяет Тёма и хмыкает. — Ну вот оно и наступило. Сегодня.
В первый день между этим кубиком на доске и им самим лежала пропасть, которую он даже измерить не мог: за плечами ноль, ни строчки кода, ни одной собранной вещи. Тогда он бы не поверил ни на секунду. Огрызнулся и закрыл.
А дошёл-то он сюда не чудом. Тем же путём, что до змейки, до лендинга, до радара: захотел, срезал мечту до выполнимого ТЗ, поставил задачу словами, агент собрал, запустил, проверил руками. Тот же конвейер — просто на этот раз на другом его конце оказалась не игрушка, а та самая невозможная мечта.
— Пусть руками агента, — говорит он вслух. — Пусть маленькое. Пусть кривая башенка из десяти блоков. Но собрал-то я. Сам захотел, сам поставил задачу, сам довёл.
Год назад он бы такое без сарказма не выговорил. А сейчас — взял и сделал.
5. Тот же приём на больших задачах
И тут его накрывает вторая волна — уже не про прошлое, а про будущее. Раз голая коробка из кубов собралась за полчаса — а что, если не останавливаться? Он открывает чат и, не собираясь пока ничего запускать, набрасывает Сане следующую мечту, ту самую полную, из детства:
На будущее прикидка. Хочу дорастить этот мир до GTA-в-кубах:
машины, по которым можно ездить; город из блочных зданий;
прохожие; день сменяется ночью; миссии.
Саня отвечает спокойно, без «невозможно»:
— Каждый пункт — отдельный кусок работы, и каждый решаемый: физика машин, генерация города, простые боты-прохожие, цикл дня и ночи. Собирается тем же способом — по одной фиче за заход, на готовых библиотеках. Не за день, но собирается.
Тёма перечитывает и ловит странное спокойствие. Год назад «GTA из кубиков» было волшебным заклинанием, за которым — пустота и «мне такое никогда не поднять». А сейчас под теми же словами — список задач, каждая по плечу. Мечта перестала быть недостижимой и стала просто работой которую нужно сделать. Он закрывает чат: сегодня — ядро, остальное потом. Но теперь он уверен, что «потом» реально будет.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ