GameDev: разработка игр
7.64K subscribers
859 photos
203 videos
1 file
1.22K links
Всё про геймдев для девелоперов, художников, левел- и геймдизайнеров, сценаристов

Разместить рекламу: @tproger_sales_bot

Другие каналы: @tproger_channels

Другие наши проекты: https://tprg.ru/media
Download Telegram
Разработчики Iron Nest отдали GameDiscoverCo выгрузку из Steamworks, и разбор запуска вышел с настоящими цифрами, а не с оценками: 366 тысяч копий и 4,74 миллиона долларов валовой выручки за пять дней, возвраты 4 процента, вдвое ниже обычного.

Что из этого можно унести к себе:

Демо решает больше, чем кажется. В него сыграли 876 тысяч человек при медианном времени 2 часа 19 минут. Но 400 тысяч вишлистов было ещё ДО демо — набрались на коротких роликах, в основном чужих и органических.

Соавтор игры говорит прямо: короткие видео дали первый разгон, а дальше их вклад сравнялся с остальными форматами — плейтестами, демо, фестивалем. То есть это инструмент старта, а не постоянный двигатель.

И отдельный сюжет: игра открыто сделана по мотивам PVKK, чей трейлер два года назад придумал жанр «маленькая комната, механизмы, стрельба». Вывод автора разбора неприятный, но честный: показал уникальную идею — выпускайся быстро. 26 процентов вишлистеров Iron Nest держат в списке и PVKK.

@make_game
83
Способ, которым игрок нашёл игру, связан с тем, сколько он в ней потом просидит.

GameDiscoverCo опросили больше 16 тысяч игроков Steam и разложили ответы по времени в игре. Стримы как источник растут с 40,6 процента у тех, кто наиграл полчаса, до 44,5 у тех, кто перевалил за пятьдесят часов. Текстовые соцсети идут вниз: 38,2 процента у наигравших час и 33 у долгожителей.

Разброс между играми ещё интереснее. Короткие ролики назвали источником 50,9 процента игроков R.E.P.O., 39,4 у ARC Raiders и всего 34,2 у Clair Obscur. Средний возраст при этом 25 лет против 31. То есть «работают ли шортсы» — вопрос не про жанр вообще, а про вашу аудиторию.

Важная оговорка: отвечали люди с открытыми профилями, согласившиеся на опрос, то есть заметно более вовлечённые, чем средний покупатель. А группа «50+ часов» вдобавок состоит из тех, кому игра подошла.

@make_game
👍3
Человек собрал себе Arch с Hyprland в теме «Аватара» и выложил его целиком — вместе с пятью играми на Python, которые лежат в том же репозитории и запускаются отдельно от всего окружения.

Тетрис на 766 строк живёт прямо в терминале: семь фигур с поворотами и подкрутками у стены, удержание фигуры, превью следующих, ускорение по уровням, вспышка на очистке линий и разлетающиеся частицы на game over. Рядом лежит тот же тетрис на pygame, с холстом 760×760. Змейка на 423 строки подгоняет поле под размер терминала и заворачивает края, а рекорды змейка и оба тетриса складывают в один общий JSON.

Вокруг игр — девять согласованных тем оформления, обои с Аангом, свой выбиратель тем на Rofi, гайд по сборке и шпаргалка по горячим клавишам. Автор просит не ставить всё подряд, а забирать понравившиеся куски.

@make_game
👍5
Разброс внутри одного стримингового показа огромный: на картинке разбор Triple-I Initiative, где 35 игр, медиана прироста вишлистов за неделю 36 тысяч, у верхних десяти процентов 154 тысячи, у нижних — 996.

Поэтому GameDiscoverCo советуют задать пять вопросов до того, как соглашаться.

Сколько игр в программе: у PC Gaming Show и Future Games Show доходило до восьмидесяти, у Triple-I тридцать пять-сорок. Чем меньше, тем больше внимания вашей.

Сколько стоит: от примерно тысячи долларов до сотен тысяч. Сильный анонс от инди могут взять и бесплатно — показам самим нужны громкие премьеры.

Сколько там настоящих премьер: от этого зависит, соберёт ли эфир зрителей вообще.

Можно ли блогерам пересобирать трансляцию со своими комментариями — у крупных показов это заметно расширяет охват.

И сколько всё длится: короткие программы теперь заметно выигрывают.

@make_game
1
Доминик Шаблевски описал, как перенёс свой C-движок high_impact на Nintendo 64 и довёл Xibalba 64, шутер в духе Wolfenstein 3D, до физического картриджа для клона M64.

Бэкенд для платформы на Libdragon занял несколько вечеров, игровой код не менялся. Дальше началось железо: 93 МГц MIPS, 4 КБ текстурной памяти, максимум 64×64 на текстуру и медленная её загрузка. Отсюда сортировка тайлов по текстуре, до 17 квадов в одном 64-битном вызове Tiny3D и небо из одной текстуры 32×32. Уровни редактор хранит в JSON, но сборка компилирует их в бинарные структуры, потому что разбор JSON на консоли стоил около 100 мс на загрузке. Порт занял две недели, доводка — ещё несколько месяцев, стабильные 60 FPS.

Отладочный стенд: SummerCart64 по USB, ROM заливается прямо из сборки, видео через капчур-карту за 10 $. Эмулятор Ares точный, но медленную память N64 проверяет только настоящая приставка :)

@make_game
❤‍🔥5
Автор ретро-шутера WOBLO пишет игру на Python с raylib, без движка: геометрия, коллизии, свет, редактор уровней, физика и сохранения свои. В девлоге после 90 дней молчания он рассказывает вещи, полезные независимо от того, на чём вы делаете игру.

Про архитектуру. Мультиплеер он сделал наследником обычной игры и не поменял в основном коде ни строки. Это, по его словам, и есть проверка, что движок внутри правда разделён, а не выглядит аккуратным для того, кто сам этот беспорядок и устроил. На втором месяце работы такое не проверишь — нужно положить сверху что-то странное и посмотреть, сломается ли.

Про баги. Игрок упирался в невидимую стену; починил — стал проходить сквозь пол снизу; починил — вернулась стена. Оказалось, это один баг, видимый с двух сторон. Теперь он всегда проверяет оба случая сразу: проверять один — значит просто перекладывать баг.

Про платформы. На Mac все стены стали чёрными: там Metal, данные в шейдер приходят иначе, и свежее освещение получало мусор.

И вывод, ради которого он вообще сел писать: вишлисты набираются в месяцы до релиза, а не в день релиза. Молчание не бесплатно.

@make_game
👍2
В Defold завезли свет. Версия 1.13.1 добавляет компоненты Light: четыре типа источников, редактор их показывает, кастомные шейдеры получают данные через LightBuffer. Ограничения на старте честно перечислены: до восьми источников в редакторе, в WebGL1 и ES2 не работает, а layout LightBuffer должен совпадать с тем, что лежит в lighting.glsl.

Второе, что заметно на практике, это инстансинг morph targets. Веса морфов уезжают в per-instance buffer через атрибут morph_targets_weights, так что толпа персонажей с мимикой перестаёт быть отдельной болью.

Геймпады перевели на базу контроллеров SDL с сопоставлением сначала по GUID, добавили настройку input.gamepad_deadzone, а gdc умеет генерировать новые mappings; старый формат .gamepads поддерживается временно. Editor Scripts получили немодальные диалоги с изменяемым размером, вкладки, картинки, editor.fetch_libraries(), загрузку файлов по HTTP и endpoint /preview, который отдаёт сцену в PNG.

Тёплая сборка, по замерам авторов, ускоряется до 19%. Это верхняя граница из их измерений, а не обещание для вашего проекта, так что на большом проекте замерьте до и после сами.

@make_game
4
Bevy отметил шесть лет и подвёл итоги года: 47 529 звёзд, 1527 участников, 13 543 коммита. Главное, что появилось за год и что можно взять в проект.

BSN, новая система сцен: композиция и наследование иерархий сущностей прямо в Rust-макросе bsn!, с зависимостями и ассетами. Разработчик Exofactory после переноса на BSN убрал из проекта 7364 строки. Приземлились базовые UI-виджеты без стилей: кнопки, чекбоксы, слайдеры, списки, модалки, меню и наконец текстовое поле, а поверх них набор Feathers для внутренних инструментов. В рендере GPU-driven pipeline: пример bevy_city рисует город на 55 000 сущностей при 60 FPS; развиваются трассировщик Solari, язык шейдеров WESL и виртуальная геометрия. Сообщество на этих же основах собрало прототип редактора Jackdaw с визуальным редактированием сцен и инспектором ECS. Bevy Metrics теперь на каждый коммит меряет производительность, время компиляции и размер бинарника.

Отдельный раздел про ошибки: автор признаёт, что BSN должен был приземлиться быстрее и что раньше разработка шла в изоляции, пока не станет «достаточно хорошо».

@make_game
👍1👌1
Как собрать убедительный кристалл в Unreal, не платя за прозрачность.

Анастасия Горбань расписала свой мастер-материал по шагам. Материал непрозрачный: глубина внутри камня подделана двумя цветовыми слоями, которые при повороте камеры смещаются на разное расстояние. Именно разрыв между ними даёт объём, а не смесь двух цветов.

Перед цветом идёт стадия глубины, и там на выбор параллакс с картой высот или дешёвое смещение по яркости. Оба пути берут высоту из одного источника с одним тайлингом — поэтому подделанная глубина всегда ложится ровно на тот цвет, который смещает.

Переливы снаружи сделаны через синус: интерференция периодична по углу обзора, поэтому плавный градиент превращается в повторяющиеся полосы. Слой отключаемый — кварцу и рубину он не нужен, опалу и лунному камню нужен.

В конце автор приводит арифметику. Вариант на новой системе слоёв стоит 445–517 инструкций шейдера, а тот же вид на обычном материале — 291–369. Автор честно пишет: если цель просто выпустить этот кристалл дёшево, обычный материал правильнее.

@make_game
🤣2
Godot 4.7.2 это ремонтный релиз: 39 контрибьюторов, 57 исправлений, совместимость с 4.7.1 сохранена.

Главное для Windows: починили просадку производительности при движении мыши с высокой частотой опроса. Там же поправили залипание при одновременном отпускании Shift и позиционирование Wayland IME при дробном масштабировании.

В сети репликация больше не встаёт, когда удаляют узел, созданный через MultiplayerSpawner; заодно обновили источник энтропии в mbedTLS. В рендере починили тени PCSS, которые брали начало shadow range не в том пространстве, двойное копирование billboard-частиц и запуск игры на Android при выключенном экране.

Из мелкого, что легко словить: запрет отрицательных весов в RandomPCG::rand_weighted, падение при невозможности открыть файл лога и проверка родителей в GDExtension. Обновление недорогое, а проверять после него стоит ровно то, что чинили: ввод с высокой частотой опроса, спавн по сети, сцены с PCSS и экспорт под Android и Windows.

@make_game
4
Карта, погода, враги и лут получают по своему генератору случайных чисел, чтобы правка одной системы не ломала другую. Но если все они засеяны одним seed, они выдают одну и ту же последовательность, и игрок, увидев результат в одной системе, предсказывает остальные. Автор блога knives for cats разобрал три способа с этим справиться.

Смещение начала последовательности для каждого генератора — пластырь: сдвиги надо делать большими, не все RNG умеют перепрыгивать, и учёт превращается в отдельную работу. Отдельный генератор для раздачи seed работает, но состояние каждой системы теперь зависит от порядка создания генераторов, и добавление новой ломает старые. Вариант автора — хэшировать общий seed с именем системы: new RNG(gameSeed, "Weather"), генераторы независимы, а связать два нарочно можно, подмешав выход одного в seed другого. Хэш нужен детерминированный, HashCode из C# не подходит.

Через шесть часов после публикации выяснилось, что MegaCrit используют почти ту же схему в Slay the Spire 2: в первой части System.Random при линейно растущих seed выдавал коррелированные последовательности, и runSeed + hash("id") давал всем генераторам одни числа со сдвигом. Сам автор берёт Squirrel3 из доклада Сквиррела Айзерло: два uint состояния и прыжок в любую позицию.

@make_game
2🆒1
Если ваш мультиплеер в GameMaker сделан на откате состояния — не обновляйтесь. В ветке 2026.100.0 эту подсистему удалили полностью, а в заметках просто советуют оставаться на 2026.0, пока не найдёте замену. Чем заменять, не сказано.

Остальное в ветке, последняя запись от 13 августа:

Появились layer_sequence_get_alpha() и layer_sequence_get_blend() — читают текущие цвет и прозрачность последовательности. Менеджер пакетов научился проверять и переустанавливать испорченные пакеты, из-за которых заготовка могла намертво застрять. Для Switch добавили настройку, отключающую поддержку сенсорного экрана.

Из правок в самом коде игр стоит знать три: инкремент внутри аксессора больше не срабатывает дважды при присваивании, draw_set_alpha() теперь влияет на отрисовку сразу, а не после ближайшего изменения масштаба объекта, и оператор ^= в компилируемом режиме перестал считать входные значения логическими.

Остальное — редактор: вкладки, рабочие области, вставка текста, набор иероглифов. Разделение окон на части готовят, но в интерфейсе ещё не включили.

@make_game
Соло-разработчик выложил цифры по своей Paranormal Observation: Steam в октябре 2022 года, Switch в мае 2026-го, демо на GameJolt как ранняя проверка идеи.

Всплеск от стримеров, в основном от Insym, дал примерно 225 добавлений в список желаемого за день, лучший день продаж около 65 копий. За первый месяц Steam принёс примерно 400 копий, Switch около 200: на консоли не было ни маркетингового толчка, ни накопленного списка желающих, и вторым запуском порт не стал.

Выводы автора: и ранний доступ, и выход версии 1.0 стоит считать полноценными маркетинговыми событиями, скидка от 20% помогает превратить список желаемого в покупки, а ограниченные окна видимости в Steam лучше тратить в начале. Отдельно напоминает, что первые десять отзывов критичны для показа оценки, а ключи покупками не считаются.

Все числа округлены, сырых данных Steamworks и выручки в посте нет. Но даже так это редкий случай, когда кто-то показывает Switch-порт без прикрас :)

@make_game
👍1
Dear ImGui 1.92.9 поменял поведение числовых полей, и это заметят все, у кого на нём внутриигровые редакторы и отладочные панели. DragXXX, SliderXXX и InputScalar теперь применяют значение после валидации или потери фокуса, а не на каждое нажатие клавиши; старое поведение возвращает флаг ImGuiItemFlags_LiveEditOnInputScalar. Релиз вышел 25 июля, 31 июля за ним последовал 1.92.9b.

Стоит помнить и о предыдущей 1.92.8, где поменялись сигнатуры ImDrawList::AddRect, AddPolyline и PathStroke; устаревшее поле ImDrawData::CmdListsCount теперь положено заменять на CmdLists.Size. Хотфикс 1.92.9b закрыл три регрессии: Ctrl-клик, границы таблиц и обнулённый CmdListsCount. Если обновляете движок с ImGui внутри, стоит прочитать раздел Breaking Changes до сборки, а не после :)

@make_game
🥱1
jMonkeyEngine — открытый 3D-движок на Java, живущий с середины двухтысячных. Вторая бета версии 3.10.0 вышла 21 июля и целиком про то, что ломается на стыке движка с операционной системой.

Для тех, кто выпускается на настольные платформы: в зависимостях появилась Windows на ARM64, а 32-битные библиотеки удалены.

Дальше — набор багов, знакомых любому, кто делал полноэкранную игру. Починили восстановление захвата мыши и курсора после Alt-Tab и нажатия клавиши Windows. Смещение мыши больше не учитывается, пока окно не в фокусе. При удалении привязок клавиш очищаются зависшие состояния ввода, а виртуальные курки геймпада наконец ведут себя правильно. В редакторе такое не видно, у игрока проявляется сразу.

Ещё: исправлено масштабирование обработчиков сцены при высокой плотности пикселей, починен фатальный сбой на macOS при аппаратном размножении объектов, а генерация мип-уровней теперь предупреждает, если свалилась с видеокарты на процессор — раньше это молча стоило производительности.

Замеров в заметках нет, стабильность не обещана: это бета.

@make_game
Скриншотник. Правила прежние: показываем, над чем сидели неделю.

В комментарии идут скриншоты, гифки, ролики, демки и ссылки на страницы игр. Отдельно интересно то, что обычно не показывают: редактор уровней, отладочная отрисовка коллизий, кривая графика профилировщика, инструмент, который вы написали для себя.

Если на этой неделе двигалось туго — покажите то, что почти работает, тут за это не ругают. Ссылки на свои каналы разрешены.

@make_game
51
Статья 2004 года, которую до сих пор скидывают всем, у кого пружины взрываются, а объекты проваливаются сквозь пол: «Fix Your Timestep!» Гленна Фидлера.

Суть проблемы: если считать физику с шагом, равным длине кадра, поведение игры начинает зависеть от частоты кадров. На мощной машине одно, на слабой другое, а при просадке до пяти кадров объект успевает пролететь сквозь стену, потому что между шагами он телепортируется на полметра.

Решение разбирается по шагам. Сначала фиксированный шаг, например одна шестидесятая секунды. Потом полуфиксированный: большой промежуток режется на несколько мелких. Дальше — накопитель, который копит реальное время и тратит его целыми шагами симуляции.

Отдельно объясняется спираль смерти: если симуляция не успевает переварить накопившееся время, она набирает ещё больше долгов и окончательно тонет. Отсюда правило ограничивать число шагов за кадр.

Последний кусок — про плавность: состояние интерполируется между предыдущим и текущим шагом, повороты через сферическую интерполяцию. Тот же фиксированный шаг потом даёт воспроизводимость реплеев и детерминированный сетевой код.

@make_game
3👍3
Читер с просвечиванием стен не может увидеть то, чего клиенту не отправили. На этой мысли построена серверная система видимости в VALORANT, и разбор Пола Чемберлена из Riot полезен любому, кто делает сетевую игру с авторитетным сервером.

Идея простая, а цена реализации — нет. Сервер отправляет клиенту данные о противнике, только если игрок реально может его видеть. Первый прототип проверял линию взгляда от каждого сетевого объекта к каждому игроку на каждом такте и съедал 50 процентов серверного кадра. В финальной версии — меньше 2 процентов: помогли дополнительные лучи к ограничивающему объёму, его расширение и проверка «куда объект попадёт через мгновение», а поверх этого — отсечение по видимости на стороне сервера.

Отдельная проблема, о которой обычно не думают заранее: объект появляется в зоне видимости с уже идущим эффектом. Riot хранит эффекты так, чтобы их можно было перезапустить и промотать к нужному моменту — например, разминирование продолжается с оставшегося времени, а не начинается заново.

И практика, которую стоит скопировать: боты в автотестах на каждой сборке специально входят в туман войны и выходят из него, а телеметрия меряет каждый запрос видимости с разбивкой по картам и персонажам.

@make_game
👍1