Три способа, которыми хобби-разработка игр идёт наперекосяк — я наблюдал их лично, и каждый из них учит вас тому, как выглядит правильная настройка, оставляя после себя беспорядок.
Ошибка первая: доверять браузеру ведение счёта
Самая распространённая и самая легко предотвратимая. Кто-то делает игру с таблицей лидеров, подключает WebSocket для мультиплеерной части и позволяет клиенту вычислять итоговый счёт перед отправкой POST-запроса на сервер. Никакой проверки на входе. Я видел это своими глазами — скучающему игроку понадобилось около четырёх минут, чтобы открыть DevTools, найти вкладку сети и начать отправлять девятизначные результаты. Не потому что он был хакером. Потому что игра сама вручила ему ручку и попросила оценить свой же тест.
Решение не хитрое, просто утомительное: никогда не доверяй клиенту, точка. Каждое действие перепроверяется на сервере, каждый такт физики сверяется с тем, что сервер считает истиной, и вы платите задержкой за пересылку состояния туда-обратно вместо того, чтобы рендерить локально и надеяться, что никто не заглянет под капот. Именно поэтому серверный авторитет здесь не приятное дополнение, а обязательная планка. Игра, которую можно обыграть из консоли браузера, считается сломанной — с той же серьёзностью, что и краш, потому что по сути это он и есть.
Ошибка вторая: элемент canvas и пищалка, названные игрой
Такая игра прекрасно смотрится на демо и разваливается за девяносто секунд реальной игры. Пара CSS-переходов, проверка столкновений, синусоида вместо звука удара — на записи экрана выглядит нормально, а затем первый же реальный игрок говорит, что движение ощущается неправильно, и не может объяснить почему. Дело в физике. Самописный код вида «если пересекаются — отскок» никогда не воспроизводит массу, трение и реакцию столкновения как надо, и игроки чувствуют этот разрыв, даже не умея его назвать.
Игровые сборки здесь используют настоящий рендеринг движка вместо этого:
- Физика и рендеринг — three.js с реальной симуляцией физики для веб-проектов, настоящий Unity 6 в лаборатории для всего более тяжёлого.
- Арт — от арт-директора, а не из стокового набора ассетов.
- Аудио — сэмплированные инструменты, а не осциллятор, пытающийся изобразить шаг.
Более развёрнутое объяснение, почему это не опция, — в статье Настоящие движки, настоящие сборки.
Цепочка верификаторов выявляет сбои, которые скриншот не покажет:
- Нажимает клавиши.
- Проверяет, что счёт действительно меняется.
- Слушает аудиовывод.
Звучит почти слишком просто, чтобы быть полезным, пока не осознаёшь, сколько сборок рендерят идеальный первый кадр, а затем молча зависают, потому что обработчик события так и не подключился. Статичное изображение этого не покажет. Верификатор, которому нужно пережить три раунда игры, — покажет.
Ошибка третья: заставлять друга запускать сервер, чтобы поиграть в вашу игру
Хорошие мультиплеерные прототипы постоянно умирают на этом шаге — не потому, что игра плохая, а потому, что «сначала сделай npm install для сервера, потом задай эти три переменные окружения» — это слишком много для человека вечером во вторник. Вы сделали что-то классное и похоронили это под инструкцией по настройке.
Одиночные игры здесь публикуются так же, как и любой сайт — один клик до живого поддомена, без отдельного процесса, который нужно изучать. Мультиплеер отличается тем, что там есть реальный серверный процесс, который должен где-то работать постоянно, поэтому такие проекты публикуются на публичную страницу игры с хостингом, который берётся на себя. Вся суть проста: «хочешь сыграть?» должно быть ссылкой, вставленной в групповой чат, а не README-файлом.
Что остаётся после этого сравнения
Обратите внимание, чего не хватает во всех трёх ошибках выше: локального режима для двоих. Одна клавиатура, два человека, обычно WASD против стрелок, толкающиеся локти — это режим, который недооценивают, потому что у него нулевая проблема с распространением. Не нужна ссылка, не нужен сервер, не нужен друг, который должен кликнуть что-то в 11 вечера. Просто кто-то сидит рядом с вами, и тридцать секунд разговора «нет подожди, ты второй игрок, используй стрелки».
| Локальный режим для двоих | Онлайн-мультиплеер | |
|---|---|---|
| Онбординг | «Нет подожди, ты второй игрок, используй стрелки» — тридцать секунд | Подбор соперников, пустые экраны «ожидание соперника» |
| Распространение | Ноль — ни ссылки, ни сервера, никому не нужно ничего нажимать в 23:00 | Нужна публичная страница игры и кто-то ещё онлайн одновременно |
| Конверсия | Практически 100% — единственное трение — «повернуть стул» | Отваливается в ожидании соперника |
Именно на этом построены сборки аэрохоккея и арена-файтера в галерее.
Сложите три исправления вместе — серверный авторитет, настоящие движки, размещённые публичные страницы игры — плюс встроенное преимущество локальной игры на двоих, и получите реальный диапазон возможностей:
- Одиночная игра — базовый уровень.
- Локальная игра на двоих — бесплатный выигрыш.
- Онлайн-мультиплеер — рассчитан на то, чтобы пережить скучающего подростка с открытыми DevTools.
Каждая игра попадает в библиотеку «Мои игры» со статусом публикации по каждой игре, так что не нужно рыться в старых переписках, чтобы найти удачную сборку. А если вы уже упаковали что-то под Android, процесс сразу продолжается по пути в магазин, а не начинается заново с нуля.



