Привет, пикабу! Сегодня мы рассмотрим один из возможных жизненных циклов игровых сессий на примере моей онлайн игры Make World. А своим опытом или мыслями вы можете поделиться в комментариях. Рассматривать мы всё будем с технической стороны с небольшими вкраплениями того, как это выглядит для пользователя. А в конце есть ссылка, где вы можете попробовать и покликать это всё на практике, а так же подписаться на мои соцсети :)
Итак, всё начинается с создания игровой сессии, это может быть как создание лобби, так и создание сессии через матчмейкинг (автоматический поиск соперников). В нашем случае рассмотрим простой пример с ручным созданием лобби: пользователь жмёт кнопку "Создать" и создается игровая сессия.
Создание сессии на клиенте
На стороне сервера же у нас имеются следующие методы (синтаксис языка c#, методы пронумерованы на скриншоте ниже):
1) Создать игру с заданными параметрами (примеры параметров на скриншоте выше)
2) Начать игру (когда пользователь жмёт кнопку)
3) Начать игровые ходы (когда сервер инициализировал все необходимые параметры и готов транслировать состояние игры)
Методы игровой сессии на стороне сервера
Учитывая, что игра у нас многопользовательская, и к ней могут подключаться другие игроки, то необходимо приправить нашу сессию вспомогательными методами подключения/отключения игроков (см. скриншот ниже):
1) Подключается игрок. Что мы при этом делаем?
- Смотрим, был ли он уже в этой сессии (это могло произойти, если он играл в игру и отключился из-за пропавшего интернета).
- Если был, то ставим его на нужную ячейку игрока (чтобы у него был доступ ко всем его городам и юнитам в игре).
- Если не был - создаем новую ячейку игрока с базовыми ресурсами для основания города.
2) Убрать игрока. Этот метод доступен, например, хосту игры - если ему по какой либо причине не нравится игрок, а так же доступен самому серверу - если например игра не активна и её необходимо закрыть для экономии ресурсов (об этом будет дальше)
3) Игрок выходит из сессии по одной из причин:
- Потерялось подключение. В этом случае мы оставляем ячейку игрока за ним (чтобы в будущем вернуть ему доступ ко всем его городам и юнитам)
- Он сам нажал кнопку выхода. В этом случае всё интереснее: если мы видим, что в игре не осталось ни одной активной ячейки игрока (т.е. теоретически никто не может вернуться в игру с "восстановившимся" интернет соединением) - то мы переходим к пункту (4) и закрываем игру, таким образом освобождаем ресурсы сервера, чтобы другие игроки тоже могли наслаждаться своими играми "без лагов"
4) Закрытие сессии. Если упустить этот пункт при разработке своей игры/приложения, то рано или поздно сервер будет "захламлен" и производительность может сильно упасть. Поэтому мы вызываем этот метод рано или поздно ВСЕГДА для каждой сессии, в случае моей игры причины этому могут быть: - Все игроки вышли из игры вручную. Когда последний игрок жмёт кнопку выхода - сразу инициализируется закрытие игры.
- Не осталось активных соединений и прошел какой-то промежуток времени (который даётся игроку, чтоб восстановить соединение и продолжить игру).
- Игровые ходы закончились и в игре определился победитель.
Методы манипуляции игроками и закрытия сессии
Ну чтож, сегодня мы разобрали базовый цикл игровой сессии (а в более широком смысле почти все "сессии" в компьютерных приложениях работают именно так), и, как и говорил, попробовать всё это бесплатно вы можете тут (и даже на мобильных устройствах): https://plugfox.dev/make-world-ru/
Всем привет! Я разработчик онлайн стратегии Make World и сегодня мы рассмотрим механику "соседства" зданий, которая и заставляет хоть немного применять ум в казалось бы простой игре. Итак, у нас есть 2 "лесника": верхний у нас будет под номером 1, а нижний - под номером 2.
Вот эти ребята
И в начале игры оба они дают 0.5 "производства" каждый ход
Половинка молоточка в ход
Но стоит нам изучить первую технологию "Лесничество" и всё поменяется: помимо разблокировки новых зданий эта технология улучшает наших лесничих и даёт им тем больше производства, чем больше леса на соседних клетках.
Учёные в гм... мочёные
И вот теперь то разница в доходах уже очевидна, у лесника №2 рядом два леса (как иронично), и его производство уже в три раза мощнее.
Сравнение
Дальше - больше, по мере изучения технологий есть возможность изучить "Плотничное дело", которая тему соседства сделает ещё более "острой". Ну а если вам нравятся подобные механики - в конце есть ссылка где вы можете попробовать эту мультиплеерную стратегию совершенно бесплатно (лучше с друзьями, мультиплеер всё таки) на ПК или телефонах с андроидом.
Один известный персонаж так же был плотником
И вот плотничное дело разблокирует нам ещё одну постройку, которую нужно будет удачно впихнуть между лесниками - лесопилку.
Лесопилка даёт бонусы за соседство с лесниками
И это не конец, есть ещё технологии которые улучшают как лесников, так и лесопилки. А помимо этого есть ещё куча замечательных построек, но вот незадача, количество клеточек ограничено!
Такую задачу поставил Little.Bit пикабушникам. И на его призыв откликнулись PILOTMISHA, MorGott и Lei Radna. Поэтому теперь вы знаете, как сделать игру, скрафтить косплей, написать историю и посадить самолет. А если еще не знаете, то смотрите и учитесь.
Привет, пикабу! Доделал первую версию бота для своей онлайн стратегии типа "Катан". На гифке ИИ бот сам играет и побеждает в игре. Ну а вы можете попробовать победить его бесплатно на мобильных устройствах с андроид, компьютерах с windows или в браузере. Ссылки для каждой платформы найти можно тут: https://plugfox.dev/make-world-ru/
Меня зовут Алексей, я из Казахстана, занимался созданием игры с 2019 года по май 2024, как хобби в свободное время, вдохновлялся играми, такими как Max Payne, GTA.
Наверное, создание игры - мечта детства, сделать продукт, который понравится друзьям, близким и просто даже незнакомым мне людям, где я смогу воплотить какие-то свои идеи и замыслы.
Возможно, текст написан сумбурно, без какой-то стилистики и маркетинговых фишек. Хотел поделиться своей радостью, что проект я не забросил и смог выложить в релиз, ссылку оставлю в описании, прошу людей написать отзывы, попробовать мой продукт.
По поводу цены пишите, как считаете адекватно ли просить 600 рублей за мое детище из 30 уровней? Вопросы и предложения по игре приветствуются.
Кратко об игре: игра про мужскую дружбу и солидарность, где бывшие сослуживцы друг друга выручают, враги - роботы, монстры, зомби. Фишка - замедление времени, тайники.
Приветствую конструктивную критику, спасибо, что прочли данный пост и перешли по ссылке!
Добро пожаловать в CodingRabbits; интерактивная игра по программированию, сочетающая в себе как развлечение, так и знания!
Мы все знаем, что найти вдохновение, чтобы начать изучать что-то новое, не всегда бывает проще простого, особенно с учетом того количества внимания, которое это может потребовать. Однако мы находим время для игр, когда захотим, так почему бы не заняться и тем, и другим?
CodingRabbits познакомит вас с основами кодирования в трех интерактивных и увлекательных режимах:
*Режим истории: многоуровневое путешествие, в котором вы ведете кроликов, используя коды, которые вы изучаете, следуя инструкциям.
*Многопользовательский режим: играйте против своих друзей в многопользовательской игре в реальном времени, пройдите уровень раньше, чем другие игроки, чтобы победить.
*Режим обучения: проверьте свои навыки программирования на случайном уровне.
Если вы готовы начать это еще увлекательное, познавательное путешествие; тогда мы, в том числе и наши Кролики, ждём Вас!
Обновлено : 17 дней назад
Опубликовано : 18 ноября 2020 г.
Статус : выпущен
Платформы : Windows, Android
Оценка : 5,0 из 5 звезд
Автор : Dragonaz
Жанр : Образовательные, Приключения, Головоломки
Теги : 2D, Смешные, GameMaker, Локальный мультиплеер, Сверху вниз
Продолжаю серию материалов о своей «хакерской» игре. Ранее я рассказывал об ее процессе разработки, а сегодня затрону не менее важную часть — маркетинг.
Для продвижения игры я начал публиковать Shorts на YouTube, но это отнимало много времени и ресурсов. Будучи инженером, я стараюсь автоматизировать рутинные задачи, поэтому сделал решение, которое самостоятельно нарезает видео на 60-секундные фрагменты.
Проблема инди-игр
Gamedev-разработчикам недостаточно просто создать игру, чтобы она пользовалась популярностью у пользователей. Неотъемлемой частью процесса является маркетинг. Разумеется, можно рассчитывать, что игра сама найдет свою аудиторию. Но будем реалистами: даже самый крутой проект может остаться незамеченным, если о нем не рассказать.
Существует огромное количество гайдов по маркетингу инди-игр. Мне удалось не только ознакомиться с ними, но и опробовать на практике. Ниже делюсь своими выводами, которые могут помочь начинающим gamedev-разработчикам.
Контента должно быть много. Необходимо показать игру как можно большему количеству людей, чтобы они узнали и добавили ее в вишлист.
Частота публикации важнее уникальности. Конечно, адаптировать контент под каждую соцсеть — круто, но это отнимает много времени и ресурсов. Эффективнее публиковать несколько простых материалов, чем один уникальный.
Вертикальные видео дают хорошие охваты. Причем необязательно даже записывать свой голос, достаточно показать игровой процесс.
Таким образом, я стал нарезать горизонтальные видео на множество Shorts, чтобы получать дополнительные просмотры.
Небольшой лайфхак для увеличения охвата на YouTube. Если при постинге видео убрать галочку Publish to subscriptions feed and notify subscribers, то знакомые с игрой люди не будут видеть его в своей ленте.
Окно с параметрами видео перед публикацией
Что было раньше
Сейчас у меня есть два основных YouTube-канала — игровой и личный. На первом публикую горизонтальные и вертикальные видео для продвижения своей игры. Часть из них уходят в GameJolt, Reddit и другие площадки. На втором — только горизонтальные, но некоторые из них посвящаю разработке игр.
Для монтажа я использую CapCut. В личном канале делаю видеоряд и накладываю звук, а в игровом — добавляю сгенерированный голос. Процесс этот довольно затратный, из-за чего нередко страдает стабильность публикаций. Подливает масла в огонь неудобство генерации голоса из-за ограничений в 300 символов за раз. Приходится генерировать озвучку в несколько этапов, что сильно замедляет подготовку нового контента.
Ограничение по тексту
Возможности для автоматизации
Решение автоматизировать процесс долго вынашивать не пришлось, но какие здесь есть возможности для этого? Рассмотрю несколько примеров.
Нарезать горизонтальные видео, чтобы получать больше охватов.
Автоматизировать генерацию голоса и визуала для создания видео. Более того, можно анимировать маскот, от лица которого буду вести повествование.
Маскот игры
3. Автоматизировать производство горизонтальных видео за счет подбора визуала. Для этого буду использовать контент из пула видео и хэш-таблицы тегов на основе семантического анализа текста.
В статье начну с малого и реализую только первый пункт. Остальные решения оставлю для следующих материалов.
Итак, мне нужен «черный ящик» для горизонтальных видео, который будет:
менять формат с 16:9 на 9:16,
заполнять лишнее пространство размытым фоном,
нарезать видео в соответствии с таймкодом, но не более 60 секунд,
добавлять текст с нумерацией выпуска и призывом посмотреть полное видео.
Выбор инструментария и философия
Не вижу смысла заморачиваться с UI, поэтому буду использовать bash-скрипты. Для обработки видео выбираю библиотеку FFMPEG — поверхностное изучение показало, что ее будет достаточно. Устанавливаю на MacOS с помощью Homebrew:
Чтобы продолжить движение этого проекта в рамках философии UNIX, я нашел инструмент для загрузки YouTube-видео из терминала — youtube-dl. С его помощью я удалил свое первое отрендеренное видео.
Утилита проста в использовании. Сперва запрашиваю доступные форматы для скачивания видео:
Команда запускает библиотеку FFMPEG, чтобы передать на вход файл video.mp4. Применяю к нашему потоку filter_complex. Ниже расскажу, какие фильтры я использовал.
Вторая строка скрипта пропорционально меняет ширину нулевого видеопотока 0:v на его длину scale=-1:1920. Обрезает видео до вертикального формата crop=1080:1920 и размывает фон gblur-sigma=20. После — возвращает преобразованное видео в новый поток bg.
Третья строка снова берет 0:v, пропорционально меняет его длину на ширину scale=1080:-1 и возвращает результат в новый поток ov.
Аналогично преобразовываю аудио, чтобы оно не исчезло. Возможно, получится сделать это намного проще, но напрямую аудиопоток в map не отправить. Поправьте в комментариях, если вы знаете другой способ.
В четвертой строке смешиваю потоки bg и ov и располагаю видео в центре экрана overlay=(W-w)/2:(H-h)/2. Результат перемещаю в mix. После — отправляю потоки в финальный файл при помощи -map"[mix]" -map "[audio]". Выставляю 60 FPS и сохраняю результат в result.mp4. Флаг -y перезаписывает файл, если он уже существует.
Результат
Начало положено! Нам удалось сэкономить минуту работы ценой всего нескольких часов исследований. Разве это не прекрасно?
2. Нарезка видео
Если длительность видео превышает 60 секунд, то YouTube не пропустить его в раздел Shorts. Для этого нужно модифицировать предыдущий скрипт.
Более того, хочу нарезать видео не просто на куски по 60 секунд, а разделять их на логические части. В описании под видео есть проставленные таймкоды. Значит я могу просто скопировать этот текст и передать в скрипт, а он уже обрежет видео автоматически. Приступим!
Для таймкодов на YouTube использую следующий формат:
00:00 - Text 01:40 - Text2
Их легко можно преобразовать в массив секунд:
time_codes=()
while read -r line; do
minutes=${line:0:2}
seconds=${line:3:2}
minutes="$(printf "%.0f" "$minutes")"
seconds="$(printf "%.0f" "$seconds")"
time_codes+=("$(($minutes*60+$seconds))")
done < $2
Если расстояние между таймкодами больше 60 секунд, их нужно отредактировать. Конечно, можно автоматизировать это разбиение, но так я рискую обрывать видео на нелогичных моментах.
Далее смотрю на длительность видео с помощью команды ffprobe:
Здесь я добавил флаг -ss ${time_codes[$i]} для рендеринга с заданного момента в секундах, а также -t ${lengths[$i]}, который задает соответствующую длительность видео.
Отлично! Теперь видео подходят для раздела Shorts.
3. Добавление текста
Видео готово, осталось добавить текст. Сверху я буду выводить название видео и номер части, а снизу — призыв посмотреть полную версию. Центрировать текст не получится, поэтому приходиться генерировать каждую строку отдельно. Для удобства закину текст в файл с таймкодами и разобью его на две строки.
Далее модифицирую код, который считывает таймкоды:
Несмотря на большое количество кода, все довольно просто. В блоке с размытием фона появилось пять команд drawtext. У каждой есть текст, шрифт, цвет, размер, позиция по x, позиция по y, цвет и толщина обводки.
Результат.
Заключение
У меня получилось довольно удобное решение, которое уже не раз помогло мне сэкономить время. Некоторые строки я захардкодил, но это поправимо. Также планирую добавить выбор языка при помощи флага в shell-скрипте. Для русского все работает уже так.
Изначально у меня были мысли встроить в пайплайн загрузку готовых видео, но YouTube воспринимал их как спам и блокировал. Если у кого-то получилось адекватно автоматизировать данный процесс, делитесь своим опытом в комментариях. Буду очень благодарен.
Решил попробовать сделать приложение для мобильных устройств, используя многострадальный Delphi, переделав одну из своих программ для ПК. Получилось как-то так:
Проверял на нескольких устройствах, для древних Андроидов (четыре и ниже) не подойдет скорее всего. Я просто не нашел настолько старый рабочий SDK.
Что могу сказать от себя - делать мобильные приложения тот еще геморой. Эта простая игра из меня все соки выпила. Было не очень интересно, скорее даже напряжно. Чтобы портировать простой код пришлось решить кучу вспомогательных технических задач. Даже не ожидал, что будет так сложно. Наверно, если бы был программистом, то было бы легче, но имеем то, что имеем.