Всем привет, пикабушники. Продолжаю сервию игр для рубрики "Игры в один файл"
Вспомнил старую мобильную Flight Control — ту самую, где ты диспетчер, тянешь пальцем линии от самолётиков, и они красиво заходят на посадку. Играл в неё лет 10 назад, а она до сих пор снится в кошмарах.
Короче, за пару вечеров собрал браузерную версию в одном HTML-файле. Без движков, без npm, без 500 мегабайт node_modules. Просто canvas + ванильный JS. Можно скачать и открыть двойным кликом, даже интернет не нужен (ну почти).
Как играть:
🛬 Тянешь от самолёта линию — он летит по ней. Отпустил — летит по прямой.
🎯 Цветные самолёты — на полосу внизу. Жёлтые вертолёты — на площадку «H» справа.
💥 Два борта столкнулись — конец. Без «жизней», без «второй попытки». Как в жизни.
📈 Чем больше посадил — тем чаще появляются новые. Игра постепенно превращается в хаос.
Что есть внутри:
— 4 типа самолётов + вертолёты с крутящимся винтом — Рекорд сохраняется в браузере (у меня пока 47, побейте) — Статистика после каждого рейса: сколько посадил, сколько пролетело рядом (так называемые «почти столкновения» — отдельный вид боли) — Счётчик игроков, чтобы понимать, что ты не один такой в этом небе — Таймер, счётчик бортов в воздухе — всё как у взрослых
Почему это сложнее, чем кажется:
Первый борт — легко. Второй — тоже. А вот когда их пять, и один летит с севера, второй с юга, третий вообще с востока, а полоса одна — вот тут начинается настоящий авиадиспетчерский ад. Я после нескольких партий понял, почему у диспетчеров зарплата выше средней.
Технические детали (для тех, кому интересно): — ~700 строк кода, один файл — Canvas 2D, никаких библиотек — Управление: мышь или палец — Работает на телефоне (проверено на своём, самолёты слушаются)
Если кто-то дойдёт до сотни посаженных — снимаю шляпу, у меня после 50-го борта в воздухе начинается паника и я теряю контроль над ситуацией.
Пишите в комментах свои рекорды, скрины с «почти столкновениями» и истории о том, как один маленький вертолётик разнёс всю мою карьеру диспетчера.
Решил немного развлечься и, возможно, развлечь вас.
Поэтому начинаю создание серии игр в одном HTML-файле.
Это серия игр, которые будут состоять всего из одного HTML-файла.
Игры будут небольшие: кликеры, викторины и так далее. Так сказать, игрушка на один раз, но, возможно, что-то из таких поделок будет вам интересно, и она окажется игрой на два раза.
Первой в серии будет «ДТП Кликер». Суть простая: несколько перекрёстков и полный хаос. Всё смешалось: люди, кони.
Нам предстоит устранить этот хаос, добавляя светофоры, пешеходные переходы и так далее.
Всем привет, это я, VALHAISTO GAMES! Я знаю что здесь меня абсолютно никто не знает, наверное даже не слышали. Хотел бы рассказать про свой GameDev как инди-разработчик. Студией свою команду сложно назвать, потому что я всего лишь один создаю игры и приложения (если что инди-разработчик это и есть 1 человек или максимум две энтузиаста). Игры и приложения я не прям успеваю делать, да и обновления выкачивать тоже, но сейчас на сегодняшнее время проекты у меня такие:
Из игр: MiSide: Universe, MiSide: Erased, MiSide: Error, MewSim: First Love
Из приложений: MiFab – MiSide 3D Models Hub, BLINDER – 3D Models App
Привет, Пикабу! и всем кто читает мой пост) Строго не судите, я всё еще учусь над своими ошибками в разработке)
Сидел я как то вечером и думал как можно переосмыслить морской бой но так что бы было интересно и начал записывать в блокнот какие то идеи и тут понеслось)
Было решено самое главное это реализовать игру 2-х игроков на 1 устройстве по очереди и 2-х игроков против 1 босса) через череду проб и ошибок всё получилось но на этом я не стал останавливаться. Мне как то прислали в тг канале голосовое сообщение что моя игра нравится но нужно реализовать для плохо зрячих людей, что бы всё озвучивалось и я подумал почему бы и нет, это же крутая идея, за вечер я преодолел и это. Дальше больше, много идей еще пришло но не всё реализовал.
Что в игре есть:
обычный морской бой 1×1 и 2×2 с живыми игроками;
у кораблей есть способности: радар, торпеда, залп;
боссы: Кракен, Левиафан, Призрачный линкор;
кланы, рейды вдвоём на босса, клановые войны;
озвучка для незрячих игроков.
1/7
игровые режимы, профиль, модели кораблей, настройки
Для меня было сложнее всего реализовать полноценно Кланы, но и это преодолел хотя еще есть над чем поработать.
А самое приятно что есть игроки которым понравилось эта реализация и они вносят свои предложения в развитие проекта.
Так же хочу реализовать компанию в игре, в виде новеллы.
1/5
бой против босса вдвоём, лобби перед боссом, бой одиночный против босса, pvp
Игра бесплатная БЕЗ ПОДДЕРЖКИ ДОНАТА, работает в браузере на телефоне и ПК. Поиграть можно тут: my-battleship.ru
Буду рад критике и идеям в комментариях! Что бы поиграть не обязательно регистрироваться, можно зайти как гость. Всем спасибо и добра!)
Всем привет! Решил разбавить ленту классическим инди-хардкором.
Пока игровая индустрия бьется над фотореалистичной графикой и гигабайтами текстур, я по вечерам пишу свою браузерную текстовую RPG. Да-да, на том самом «умирающем» PHP и старом добром PDO для работы с базой данных. Без тяжелых современных фреймворков и лишней мишуры.
Помните времена, когда мы сутками пропадали в текстовых онлайн-стратегиях и бойцовских клубах, обновляя страницу ради исхода боя? Мне захотелось вернуть то самое ощущение контроля и чистого геймплея, где все решает логика, баланс и характеристики, а не видеокарта.
Вот так сейчас выглядит интерфейс моего проекта (всё верстаю сам под мобилки, чтобы удобно было играть одной рукой):
Весь бэкенд держится на PHP. База данных — MySQL, общаюсь с ней строго через PDO. Я намеренно отказался от ORM: когда проект разрастется, мне хочется вручную контролировать каждый SQL-запрос, оптимизировать индексы и спать спокойно, зная, что база не ляжет от пары сотен одновременных игроков в онлайне.
Каждое действие игрока — это выверенный запрос, проверка сессии и мгновенный расчет характеристик.
Что я уже успел реализовать ??
• Базовые характеристики: Сила, Жизнь, Удача, Защита (все по хардкору, как у истинного Админа на скрине — по 100 пунктов для тестов).
• Система благословений и бустов: Добавил баффы на параметры и опыт (например, +25% к опыту).
• Сражения: Готовы вкладки под Арену, Дуэли и Колизей. Сейчас докручиваю логику пошагового боя.
• Мир и экономика: Заложил фундамент для Кузницы (руны, заточка), Лаборатории (эликсиры) и Магазинов.
• Клановая система: Кнопка уже есть, структуру таблиц под кланы в БД подготовил.
Зачем я это делаю и для чего ?
Для меня это идеальный pet-проект «для души», который прокачивает навыки архитектуры БД и чистого кодинга. Но в планах — довести игру до ума, сбалансировать экономику и выкатить в онлайн для всех любителей олдскульных текстовых RPG.
Интересно послушать мнение здешних программистов и геймеров: имеет ли такой формат право на жизнь в наше время? Рубились в такие игры раньше?
Интересно послушать мнение здешних программистов и геймеров: имеет ли такой формат право на жизнь в наше время? Рубились в такие игры раньше?
Если пост зайдет, в следующий раз подробно распишу, как я реализовал механику боя или как устроена таблица инвентаря в БД, чтобы PHP не захлебывался при расчете шмота.
Спойлер: сейчас в GeoConquest захвачено уже 24,6 миллиона гексов (или примерно 8107 км²). Но в сентябре игра была под угрозой отключения. Две недели я потратил на оптимизации сервера и снизил нагрузку на RAM в 44 раза, значительно ускорил захваты и также снизил нагрузку на CPU.
Однажды я выкатил небольшое обновление и стал ждать обычного редеплоя. Но GeoConquest не поднялась: сервер пытался загрузить в память уже накопленные территории и не справился. К тому моменту игроки захватили больше 13 миллионов гексов.
Важно: никто не захватил 13 миллионов одним махом. Это был общий результат игры, который серверу предстояло восстановить после перезапуска. Данные не пропали, у меня были резервные копии, но игра оказалась недоступна — и я не знал, когда удастся вернуть её в строй.
Я тогда временно поднял лимит heap, чтобы сервер хотя бы запустился. Но мысль «добавить ещё памяти» не могла быть решением навсегда. Позже даже попытка поднять лимит с 4 до 5 ГБ не помогла. А в голове крутилась совсем простая мысль: что будет, когда игроки захватят ещё миллион гексов? Неужели придётся покупать сервер подороже?
Незадолго до этого игра уже пережила захват примерно 3,23 миллиона нейтральных гексов. Результат появился меньше чем через девять минут, сервер продолжал работать. Тогда это выглядело хорошим испытанием. Но оказалось, что обработать большое изменение и заново загрузить в память весь уже накопленный мир — две разные задачи. Проблема проявилась не во время того захвата, а после обычного обновления.
Две разные нагрузки
Когда игра ожила, я стал смотреть на масштабирование шире. Если я хочу дальше развивать игру и приводить новых игроков, недостаточно просто надеяться, что текущий сервер как-нибудь справится.
У GeoConquest оказалось две отдельные проблемы роста. Первая — сам мир: игроки захватывают всё больше гексов, и их нужно хранить и показывать на карте. Вторая — количество одновременных действий: игроки двигаются, оставляют следы, запрашивают карту. Оптимизация одной нагрузки не решает другую. И ещё третья проблема - скорость расчёта захватов стала уже неприлично долгой.
Я отдельно занялся частыми запросами, следами и отображением игроков. По графику загрузки процессорных ядер стало видно, что среднее напряжение немного снизилось и пиков стало меньше. Но вопрос оставался: что будет, если кто-то захватит ещё миллион гексов — или даже сто миллионов?
А одна из первых попыток разобраться с памятью дала обратный результат: прогрев сервера занял аж 4 минуты 40 секунд, а расход RAM вырос ещё примерно на 0,8 ГБ. Тут уже стало понятно, что нужно менять сам подход к данным.
"За 2 дня до гибели"
Карта перестала помещаться в одну копию
Сначала я занялся обзорной картой. До этого сервер при запуске строил для неё большую копию в оперативной памяти. Я начал сохранять готовые фрагменты карты в базе данных, чтобы сервер мог доставать их по мере необходимости, а не держать целый мир в памяти, ещё и на разных масштабах.
Переход пришлось разделить на этапы. Для проверки нужно было подготовить почти 50 тысяч фрагментов карты на основе примерно 14 миллионов занятых гексов. На первичное заполнение базы ушло около трёх часов: всплывали ошибки, приходилось исправлять их и запускать процесс заново. Это был неприятный простой, но он помог подтвердить, что новая схема сохраняет и обновляет данные корректно.
После переключения карта стала загружаться из базы, а в памяти оставались только недавно просмотренные фрагменты. Потребление памяти основным процессом снизилось примерно с 3,7 до 1,86 ГБ. Перезапуск, который раньше занимал до 170 секунд, на этом этапе сократился примерно до 72. При ручной проверке карты около 84% запросов обслуживались из памяти, среднее время ответа было около 45 миллисекунд.
Но это была проверка прокруткой карты, почти без одновременных захватов. Она не доказывала, что игра уже выдержит тысячи игроков. Зато стало ясно, что у нас появился запас для следующего шага. Я смог выдохнуть и уже не бояться нависающей угрозы.
Миллионы гексов — сотни тысяч записей
Следующая идея была в том, чтобы не хранить каждый маленький гекс отдельно, если большая территория целиком принадлежит одному владельцу. В H3 есть вложенные друг в друга уровни шестиугольников: однородную область можно представить ячейкой покрупнее, а там, где владельцы различаются, снова разбить её на более мелкие.
Перевод шёл постепенно, в фоне и со сверкой данных. Это было важно: речь шла о реальных территориях игроков, и ошибка могла стоить им захватов.
В итоге 15,64 миллиона игровых гексов удалось представить примерно 354 тысячами укрупнённых записей — примерно в 44 раза меньше. На одном из промежуточных этапов все территории занимали около 36,5 МБ RAM. После финального этапа весь игровой процесс использовал около 645 МБ оперативной памяти; собственно JavaScript heap — около 292 МБ. Для моего сервера с 8 ГБ RAM запас более чем достаточный.
Тогда же перезапуск удалось сократить до 18–20 секунд. Но это улучшение оказалось не вполне устойчивым: после следующего выката один из перезапусков снова занял около 170 секунд. Так что я не хочу выдавать промежуточную цифру за гарантированную скорость после всех изменений.
Последний шаг был уже про ожидание захвата. В локальной эмуляции тяжёлого реалистичного примера расчёт сократился с 9,36 до 1,45 секунды — примерно в 6,5 раза. На проде к расчёту добавляется запись результата, поэтому это не обещание, что каждый захват теперь занимает ровно столько же. Но это хороший признак: расчёт наконец тоже начал ускоряться, а не только занимать меньше памяти. В реальности скорость захватов увеличилась в десятки раз, потому что записывать в БД владельцев гексов теперь тоже быстрее (из-за сворачивания через h3).
В игре уже 6 кланов-миллионников! А всего захвачено 26,4 миллиона гексов.
В течение 2 недель я боялся, что следующий большой мир просто не даст серверу запуститься. В тот момент оптимизация не добавила на карту новой кнопки или красивого эффекта. Зато её результат игроки должны почувствовать в обычных вещах: меньше ждать загрузки, перезапуска и расчёт гигантских захватов за секунды. Теперь я могу спокойно развивать проект дальше, уже выпустил и клиентскую оптимизацию, и приложение на Google Play, и множество других улучшений и фичей.