Сообщество - Лига Разработчиков Видеоигр
Добавить пост

Лига Разработчиков Видеоигр

6 591 пост 22 078 подписчиков

Популярные теги в сообществе:

Раздача минималистичного скайбокса super simple skybox на asset store Unity

Раздача минималистичного скайбокса super simple skybox  на asset store Unity Asset store, Unity, Asset, Unity3D, Gamedev, Инди игра, Разработка, Инди, Видео, YouTube, Длиннопост, YouTube (ссылка)
Раздача минималистичного скайбокса super simple skybox  на asset store Unity Asset store, Unity, Asset, Unity3D, Gamedev, Инди игра, Разработка, Инди, Видео, YouTube, Длиннопост, YouTube (ссылка)

ЗАБРАТЬ

Промо код : OCCASOFTWARE

Создавайте красивое динамичное небо в Unity за считанные секунды. Простой, чрезвычайно настраиваемый и очень простой в использовании. Управляйте солнцем, луной, небом, облаками, звездами и многим другим!

Совместимость конвейера рендеринга

Встроенный конвейер рендеринга — это конвейер рендеринга Unity по умолчанию. Это конвейер рендеринга общего назначения с ограниченными возможностями настройки. Универсальный конвейер рендеринга (URP) — это скриптовый конвейер рендеринга, который быстро и легко настраивается и позволяет создавать оптимизированную графику для широкого спектра платформ. Конвейер рендеринга высокого разрешения (HDRP) — это конвейер рендеринга с поддержкой сценариев, который позволяет создавать передовую высококачественную графику на высокопроизводительных платформах.

Версия Юнити 2022.3.0f1

Встроенный Совместимый

УРП Совместимый

HDRP Не совместимо

Описание

Удобен для пользователя, совместим с URP + BIRP и включает в себя уникальные функции, такие как физическое затемнение конечностей и настраиваемые закаты.

Этот Skybox включает в себя следующие активы:

  • Материалы для скайбокса

  • Простой материал для скайбокса

  • Шейдеры для скайбокса

  • Простой граф шейдера Skybox

  • 5 подграфов шейдерного графа Utility Skybox — облака, звезды, солнце, положение света и Skybox UV

  • Искусство

  • 30 текстур облаков Skybox

  • 10 текстур ночного скайбокса

  • Скрипты

  • Простой в использовании скрипт, который позволяет вашей солнечной лампе вращаться, имитируя цикл день/ночь.

  • Одно определение сборки для сценариев Skybox.

  • Сцены

  • Демо-сцена скайбокса

  • Пример профиля постобработки

————————————————————————————

Динамичное, красивое небо за считанные секунды

Создавайте красивое динамичное небо за считанные секунды без необходимости программирования. Наш скайбокс, совместимый с URP + BIRP, а также перспективными и орфографическими видами, предоставляет художникам множество функций, которые можно настраивать и расширять в соответствии со своими потребностями.

Подключи и играй

Перетащите этот материал скайбокса в слот материала скайбокса вашей сцены Unity. Перетащите префаб Солнца и Луны в свою иерархию. Вы готовы к работе :) Этот ассет идеально подходит для низкополигонального скайбокса, стилизованного или реалистичного скайбокса. Вы можете получить тот вид, который хотите.

Расширяемый код бесплатно

Художники приветствуются! Все шейдеры, включенные в этот пакет, снабжены Unity Shadergraph, что позволяет легко расширять и улучшать этот скайбокс-шейдер в соответствии с вашими потребностями без написания кода.

Широкие возможности настройки

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

140+ обзоров. 4.9 Звезды. Более 29 000 загрузок.

Разработчики Unity любят наши ресурсы.

https://www.occasoftware.com/community-love

Список функций

Цикл день-ночь с обратными вызовами на основе событий

Мощный, производительный динамический материал для скайбокса.

Настраиваемое солнце, луна, небо, облака и многое другое

Сделано с помощью Shader Graph

Включено 40 текстур облаков и ночного неба.

Широкая совместимость

Версии редактора

✅ 2021.3 ЛТС

✅ 2022.3 ЛТС

Конвейеры рендеринга

✅ Универсальный

✅Встроенный

❌ HDRP

Пути рендеринга

✅ Отложенный

✅ Вперед

API

✅ ДиректХ

✅ OpenGL

✅Вулкан

✅Металл

Платформы

✅Консоль

✅ПК

✅ ВебГЛ

❌Мобильный (вместо этого попробуйте Vybe)

✅VR

ЗАБРАТЬ

Промо код : OCCASOFTWARE

Показать полностью 2

Продолжение поста «Трейлер игры "Лучшие в аду"»

Продолжение поста «Трейлер игры "Лучшие в аду"» Компьютерные игры, Игры, Unreal Engine 5, Gamedev, Unreal Engine, Инди игра, Ответ на пост, Длиннопост, Инди

@ultrabeat, ,
Модели автомобилей и скутера взяты из сети для теста физики и отладки техпроцессов.
Всё остальное сделано вручную бесплатно мною своими руками для своего этого проекта - здания, ландшафт, дороги, материалы, здания, элементы улицы и прочее.
Я делаю оптимизацию, но я не делаю преждевременную оптимизацию. Тому, у кого слабое железо, можно понизить качество графики. Проект планируется на будущее железо. То, которое будет актуально на момент выхода + 5 лет жизни проекта (Видеокарты от GF3000 - до 5000 серий).
Реализм - потому что я захотел реализм. Хочется сделать долгоживущий качественный проект, чтобы потомкам не пришлось делать ремастеры и ремейки.
И да, я не инди-студия, которая в погоне за деньгами делает очередной хоррор или шутер.

@Denys19752434, о проекте можно почитать на kknights.com

О проекте
Бензоколонка
Записки о проекте

или на cr5.space

Показать полностью

MMORPG Rage Battles: Выпьем по колбочке?) | Девлог 4

MMORPG Rage Battles: Выпьем по колбочке?) | Девлог 4 Gamedev, Инди игра, Telegram, RPG, Инди, Разработка, Квест, MMORPG

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

На старте доступно малое зелье энергии, которое восстанавливает от 1 до 2 единиц энергии. Сообщения о получения расходников, в отличии от получения экипировки не будут приходить в общий чат. Также исправили некоторые баги.

Полный список изменений:

  • В игру введено Малое зелье восстановления энергии

  • Новый вступительный текст при первом запуске бота

  • Кнопка Invite to Game не работала в английской локализации, исправлено

  • Сообщения от Глашатого теперь приходят в соответствии с локализацией чата

  • При первом запуске бота, исправлен неправильный формат закрепа, который не показывал здоровье в бою

  • Исправлен баг со стальной крысой, при котором она иногда не появлялась

  • Уведомление "Хочет что-то сказать..." теперь идёт в чат в соответствии с языком автора

А еще напоминаем, что каждый из вас может забрать до 3 уникальных шлемов с помощью нашей реферальной системы, играть вместе с друзьями намного интереснее!

MMORPG Rage Battles: Встреча со стальной крысой | Девлог 3

Показать полностью 1

Раздается шаблон + редактор Jelly Merge | Template + Editor asset store unity

Внимание!! Раздача закончится примерно 17:59 МСК в четверг 18.04.24.

Раздается шаблон + редактор Jelly Merge | Template + Editor asset store unity Asset store, Gamedev, Раздача, Разработка, Инди игра, Asset, Unity, Unity3D, Инди, Головоломка, Видео, YouTube, Длиннопост

ЗАБРАТЬ

Промо код : WATERMELONGAMES

Совместимость конвейера рендеринга

Встроенный конвейер рендеринга — это конвейер рендеринга Unity по умолчанию. Это конвейер рендеринга общего назначения с ограниченными возможностями настройки. Универсальный конвейер рендеринга (URP) — это скриптовый конвейер рендеринга, который быстро и легко настраивается и позволяет создавать оптимизированную графику для широкого спектра платформ. Конвейер рендеринга высокого разрешения (HDRP) — это конвейер рендеринга с поддержкой сценариев, который позволяет создавать передовую высококачественную графику на высокопроизводительных платформах.

Версия Юнити : 2022.3.20f1

Встроенный :Не совместимо

УРП : Совместимый

HDRP : Не совместимо

Описание

Jelly Merge — полноценная игра от Watermelon Games.

Эта полностью настраиваемая игра-головоломка отличается простым, но очень увлекательным игровым процессом.

Идеальная отправная точка для вашего следующего хита!

НАШИ ПРЕИМУЩЕСТВА

🧑🏻‍💻 Поддержка Discord

🗃️ Подробная документация

🛠️ Простые в использовании инструменты.

🎨 Руководства по настройке

✨ Чистая структура и код

ШАБЛОН ВКЛЮЧАЕТ

🎮 Захватывающий геймплей

🏗️ Редактор уровней:

🔹 50 уникальных уровней + бесконечный рандомизатор уровней

🔹 Удобное создание уровней

🔹 Подробная документация

💰 Монетизация:

🔸 Адмоб

🔸 Unity Ads

🔸 ИАП

📱 Оптимизирован для Android/iOS

ЗАБРАТЬ

Промо код : WATERMELONGAMES

Показать полностью 1

Ответ на пост «Трейлер игры "Лучшие в аду"»

Тем временем в соседнем городе Н потихоньку делается свой проект на Unreal Engine 5.4

Ответ на пост «Трейлер игры "Лучшие в аду"» Компьютерные игры, Игры, Unreal Engine 5, Gamedev, Unreal Engine, Инди игра, Ответ на пост, Длиннопост

Часть карты. В процессе разработки.

Ответ на пост «Трейлер игры "Лучшие в аду"» Компьютерные игры, Игры, Unreal Engine 5, Gamedev, Unreal Engine, Инди игра, Ответ на пост, Длиннопост

Магазин. В процессе разработки.

Ответ на пост «Трейлер игры "Лучшие в аду"» Компьютерные игры, Игры, Unreal Engine 5, Gamedev, Unreal Engine, Инди игра, Ответ на пост, Длиннопост

Бензоколонка. В процессе разработки.

Ответ на пост «Трейлер игры "Лучшие в аду"» Компьютерные игры, Игры, Unreal Engine 5, Gamedev, Unreal Engine, Инди игра, Ответ на пост, Длиннопост

Один из пляжей. В процессе разработки.

Ответ на пост «Трейлер игры "Лучшие в аду"» Компьютерные игры, Игры, Unreal Engine 5, Gamedev, Unreal Engine, Инди игра, Ответ на пост, Длиннопост

Тестирование автомобиля. В процессе разработки.

Ответ на пост «Трейлер игры "Лучшие в аду"» Компьютерные игры, Игры, Unreal Engine 5, Gamedev, Unreal Engine, Инди игра, Ответ на пост, Длиннопост

Скутер. В процессе разработки.

Ответ на пост «Трейлер игры "Лучшие в аду"» Компьютерные игры, Игры, Unreal Engine 5, Gamedev, Unreal Engine, Инди игра, Ответ на пост, Длиннопост

Автомобили. Тестирование. В процессе разработки.

Ответ на пост «Трейлер игры "Лучшие в аду"» Компьютерные игры, Игры, Unreal Engine 5, Gamedev, Unreal Engine, Инди игра, Ответ на пост, Длиннопост

Часть карты. В процессе разработки.

Показать полностью 7

Продолжение поста «Делаю Vampire Survivors Like игру»

Привет! Спустя несколько месяцев работы, я наконец решился показать демку!

Для демки я подготовил 16 уникальных персонажей, 10 видов построек и 1 игровой уровень! Каждый из персонажей имеет свои индивидуальные базовые статы, скиллы и оружие.

Продолжение поста «Делаю Vampire Survivors Like игру» Vampire Survivors, Unity, Инди игра, Gamedev, Инди, Разработка, Steam, Ответ на пост

Меню выбора персонажа

Продолжение поста «Делаю Vampire Survivors Like игру» Vampire Survivors, Unity, Инди игра, Gamedev, Инди, Разработка, Steam, Ответ на пост

Меню строительства

В ближайшее время я планирую обновить тизер чтобы он соответствовал всем изменениям и обновлениям, а далее сосредоточусь на полировке демки к предстоящим ей фестивалям. Сейчас демо версия уже доступна в Steam и в неё можно поиграть!

Показать полностью 1

Делаю игрулю на Playdate на чистом C. Глава 3

Глава 1

Глава 2

Я пишу игру на игровую консоль Playdate на чистом C. Игра в жанре "выживальщик" наподобие Vampire Survivors. Так как в чистом C отсутствуют многие современные объектно-ориентированные удобства мне приходится по-всякому изворачиваться чтобы адаптировать свои идеи в код. В этих заметках ты узнаешь из первых уст как создаётся игруля с нуля от идеи до публикации.

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

GameUpdate это функция-колбэк, которая вызывается каждый тик. А значит её задача это реализовать святую троицу любой игры:

  1. считать ввод от игрока

  2. обновить состояние игры

  3. отрисовать обновлённое состояние игры.

Если ты когда-нибудь был на собесе в геймдев контору, то 90% вероятность, что у тебя спрашивали про эти три шага. А ещё если ты когда-нибудь писал код для Arduino, то ты должно быть помнишь две функции, которые там всегда должны быть: setup и loop. Вот GameUpdate это как раз аналог loop.

На сцене есть машина, которая двигается от нажатия крестовины, и есть реквизит: кактусы, песчаные насыпи и перекати-поле. Перекати-поле двигается прям как в жизни. То есть, оно меняет позицию по-горизонтали (по оси X) и ещё прыгает вверх-вниз как бы отскакивая от земли. Чтобы реализовать движение нам нужно совладать со временем. Для этого нам в каждом тике нужно знать сколько точно прошло времени с прошлого тика. Из коробки этого параметра в событии Update нет, однако мы можем этот параметр высчитать при помощи функции API playdateApi->system->getElapsedTime();. Эта функция возвращает количество секунд прошедших с момента запуска игрули. Это не разница в тиках, но уже что-то. Для разницы времени в тиках надо ещё знать значение полученное из той же функции в прошлый тик. Потому в структуре Game есть поле float previousElapsedTime;. В конце функции GameUpdate мы сохраняем в это поле результат вызова getElapsedTime, а в начале GameUpdate мы вычитаем разницу между нынешним значением getElapsedTime и previousElapsedTime. Это значение и есть тот самый dt, который равняется количеству секунд прошедших с прошлого тика. Так как на старте игры в файле main.c в первой главе я установил FPS равный 30, то в среднем dt у меня равен 0.033 секунд.

Делаю игрулю на Playdate на чистом C. Глава 3 Продолжение следует, Gamedev, Австралия, Сафари, Длиннопост, Playdate

Начало функции GameUpdate

Далее мы процессим инпут - собираем значения нажатых кнопок и в зависимости от них обновляем данные.

Делаю игрулю на Playdate на чистом C. Глава 3 Продолжение следует, Gamedev, Австралия, Сафари, Длиннопост, Playdate

Процессинг инпута

PDButtons это битовая маска объявленая в Playdate SDK. Битовые маски в сишке реализуются либо как enum, либо просто как int в отличие от Свифта, где битовая маска это совершенно иной особый класс данных.

Делаю игрулю на Playdate на чистом C. Глава 3 Продолжение следует, Gamedev, Австралия, Сафари, Длиннопост, Playdate

Описание битовой маски PDButtons

Битовая маска PDButtons содержит в себе список нажатых и ненажатых кнопок консоли.

Ещё, возможно, у тебя есть вопрос что за такая функция PlayerVehicleAngleCreateFromButtons на строке 72. Это способ определения одного из восьми направлений машины имея на руках нажатые кнопки девайса:

Делаю игрулю на Playdate на чистом C. Глава 3 Продолжение следует, Gamedev, Австралия, Сафари, Длиннопост, Playdate

Реализация функции PlayerVehicleAngleCreateFromButtons

Зачем нужен параметр oldValue в ней? Дело в том, что нам надо что-то возвращать даже если ни одна кнопка не нажата. А что вернуть если ни одна кнопка не нажата? Какое направление? В Свифте/C++/C# я бы вернул зануляемое значение (Optional в Свифте, std::optional в C++ и Nullable в C#), но в сишке это не так удобно потому что нет дженериков/шаблонов, потому я решил передавать старое значение направления потому что в случае когда ни одна кнопка не нажата направление машины просто не меняется. Это логично потому что в жизни если ты не трогаешь руль, то направление автомобиля тоже не меняется. Вот потому мы передаём старое значение и возвращаем его тогда, когда в Свифте/C++/C# вернули бы null. Если бы я работал в корпорации с отжайл-митами, ретроспективами, эффективными менеджерами, тимбилдингами и код-ревью, то обязательно появился бы ревьювер, который мне рассказал, что аргумент oldValue, если посмотреть на ситуацию под определённым углом, переносит логику того как движется машина внутрь функции PlayerVehicleAngleCreateFromButtons, а это неправильно потому что если следовать SOLID, стремиться писать идеальный код, утром и вечером чистить зубы, ходить на йогу, участвовать в городских марафонах, отказаться от мяса, глютена, молока, сахара, соли, глутамата натрия и кока-колы, то эта функция должна отвечать исключительно за создание инстанса перечисления PlayerVehicleAngle и больше ничего, а логика передачи старого значения обязательно, прям кровь из носу, век воли не видать, без разговоров, обсуждений и переговоров, должна находиться за пределами функции PlayerVehicleAngleCreateFromButtons потому что чисто теоретически у нас может эта функция использоваться не только для машины, а для чего-либо другого, что имеет также 8 направлений, но в случае если ничего не нажато направление будет, например, сбрасываться вверх. И пофиг ревьюверу на то, что такое случится примерно когда рак на горе свистнет, в четверг после дождя и ровно в следующую секунду после второго пришествия.

Если отбросить иронию и сформулировать ответ для занудного воображаемого ревьювера, то он (ответ) будет таким: значение oldValue это прекрасный подход реализации кода очень схожий с построением электрических цепей. Значение словно ток по цепи идёт сквозь функцию, и при определённых условиях оно может измениться на выходе, а может остаться таким же. Вообще код в стиле электрических цепей популярен в сишке, и при этом не так популярен в объектно-ориентированных языках. Я, понятное дело, не призываю всех на сишке писать именно в такой парадигме, но за себя я отвечаю вот таким вот образом.

Фух. Далее. Есть ещё функция GameAnyArrowIsPressed. Она возвращает 1 если хотя бы одна кнопка на крестовине нажата и 0 в противном случае:

Делаю игрулю на Playdate на чистом C. Глава 3 Продолжение следует, Gamedev, Австралия, Сафари, Длиннопост, Playdate

Реализация функции GameAnyArrowIsPressed (возможно, следовало разнести операторы & по отдельным строкам для красоты кода)

Штош, мы пришли к следующему невероятно важному шагу нашего жизненно-важного тика - обработка перекати-поле.

Делаю игрулю на Playdate на чистом C. Глава 3 Продолжение следует, Gamedev, Австралия, Сафари, Длиннопост, Playdate

Процессинг перекати-поле в тике

Констанцията screenSize пока не нужна - она пригодится позже. Далее мы проходимся по массиву старым проверенным методом: достаём количество объектов в нём и описываем цикл for. Получив очередной объект перекати-поля на строке 118 я готов его менять (потому указатель на Tumbleweed неконстантный). Разминаю руки и говорю себе "делай красиво!". Первым делом процессим позицию потому что перекати-поле перекатывается по полю по-горизонтали. Каждый тик двигающийся объект сдвигается (вот это поворот!), а значит мы должны проделать нехитрые манипуляции с позицией. Это требует базовые знания раздела механики из физики (того самого про "скорость равняется пройденный пуць делить на время", а ещё я обожаю слово "пуць" которое я подцепил в Беларуси когда жил там три года. Я стараюсь говорить "пуць" везде вместо слова "путь" и рекомендую тебе тоже так делать так как от такого русский язык станет только краше!). Чтобы лучше понять как происходит процесс движения в коде в первую очередь надо понять что нам нужно в конце концов сделать за тик. За тик нам нужно изменить позицию каждого объекта перекати-поле. Точнее, понять насколько изменилась позиция объекта перекати-поле относительно старой позиции за тик. Это изменение как раз хранится в константе dTumbleweedPosition, которая создаётся на строке 121. Высчитывается она очень просто: скорость перекати-поле умножается на dt, то есть, скорость умножаем на прошедшее время за один тик. А далее изменение позиции dTumbleweedPosition просто прибавляется к позиции этого же перекати-поле.

Подобным образом движение работает у всего вообще везде, не только в моей игре, а во всех играх и не только играх - всякие плавно двигающиеся кнопки в пользовательском интерфейсе, прыгающая иконка загрузки в яблочном браузере Safari, всплывающее окно антивируса Avast, падающие пуш-уведомления на iOS и многое другое что можно перечислять тут ещё до полуночи.

Окэй, с движением мы разобрались. Идём далее. А далее мы процессим прыжок. Дело в том, что перекати-поле подпрыгивает в движении. Значит нам в нашем мире который мы создаём своей мыслью и кодом нужно запрограммировать аналогичные прыжки перекати-поле и желательно чтобы результат выглядел правдоподобно, а не топорно как анимация в Героях 4. Вот только как сделать подпрыгивания чтобы они выглядели достаточно правдоподобно? Просто линейно как движение? Но это будет обсосно так как в реальности в любом движении по-вертикали участвует ускорение свободного падения, а это делает функцию движения квадратичной, а значит линейное движение не подойдёт. Функция нужна точно квадратичная, то есть, аргумент в ней обязательно должен хотя бы в одном месте возводиться в квадрат. Самое банальное это парабола. Она самая подходящая тут потому что в реальной жизни всё падает по параболе (конечно если игнорировать ветер и вообще если экспериментировать на сферических цыплятах в вакууме). Но если перекати поле будет лениво лететь в сторону земли по параболе, то тогда при столкновении с землёй мне надо будет иметь реализованную логику этого самого столкновения для отскока. Тут я оценил-взвесил прям как Экшон-мэн (помнишь такого супергероя? я в детстве обожал мультик "Экшон-мэн", и особенно мне нравилась его трёхмерная компьютерная рисовка. Тогда мне казалось, что это лучшая графика на свете. Недавно я решил пересмотреть этот мультик и офигел от того какая оказывается ужасная графика там на самом деле! RDR2 меня разбаловала! В общем, Экшон-мэн в момент кульминации каждой серии произносил "оценить, взвесить", просчитывал свои движения до мельчайшей точности, а в следующие 10 секунд нагибал всех врагов ультой) и решил сделать проще: я использую уравнение окружности, точнее, уравнение косинуса (или суниса если угодно, потому что график синуса это график косинуса сдвинутый на 90 градусов).

Делаю игрулю на Playdate на чистом C. Глава 3 Продолжение следует, Gamedev, Австралия, Сафари, Длиннопост, Playdate

График синуса собственной персоной y = sin(x)

Вот только для наших целей мы график синуса чуть модернизируем - засунем его в модуль. Засовывание любой функции в модуль делает с её визуальным отображением занимательный фокус - отображает нижнюю половину вверх словно ось x превратилась в зеркало.

Делаю игрулю на Playdate на чистом C. Глава 3 Продолжение следует, Gamedev, Австралия, Сафари, Длиннопост, Playdate

График модуля синуса y = abs(sin(x))

И вот такой вариант прям идеально похож на траекторию движения перекати-поля, и при этом нам не нужно писать логику столкновения с землёй и последующего отскока. Это тот редкий случай когда та фигня, которой тебя пичкали в школе, тебе пригодилась в работе!

Для адаптации данного математического фокуса в код нам нужно чтобы каждый объект перекати-поля имел значение "поворота" прыжка, а также скорость этого поворота (на сколько радиан значение поворота изменится за 1 секунду). Почему поворот? Потому что график синуса принимает в качестве переменной именно направление. Для пущего понимания на это можно смотреть как на фазу, которая крутится. Таким образом, у структуры Tumbleweed есть поля jumpVelocity и jumpAngle. На строке 125 мы высчитываем значение dTumbleweedJumpAngle равное количеству радиан на которое изменился jumpAngle, на строке 126 прибавляем это значение к jumpAngle, а на строке 127 нормализуем jumpAngle. Нормализация направлений это вещь, которую иногда следует делать если работаешь с направлениями - примерно как убирать какашки за кошкой если ты живёшь с кошкой (или она с тобой, лол). Так как значение направления циклично (0 радиан и 2*π радиан это одно и то же значение, например), можно для чистоты кода, совести и кредитной истории после операций над направлением приводить его в диапазон [0; 2*π) если вдруг это направление вышло за пределы (если кошка покакала мимо лотка надо всё вытереть, потому что сама кошка это вряд ли сделает).

Делаю игрулю на Playdate на чистом C. Глава 3 Продолжение следует, Gamedev, Австралия, Сафари, Длиннопост, Playdate

Реализация функции normalizeAngle

Вообще будь у нас С++ я, возможно, нормализацию бы засунул прям внутрь класса Angle в оператор присваивания, который можно невозбранно перегружать. А может и нет - неявности порой делают код хуже. Как бы там ни было, именно таким образом мы процессим прыжки перекати-поля.

Итого, мы разобрались с процессингом позиции перекати-поля, прыжков (на самом деле процессить прыжки это лишь полдела, надо ещё их кошерно отрисовать, а это я покажу далее), осталось запроцесить кадр. Да, перекати-поле в моей игруле имеют несколько кадров для красивости. Я так сделал так как иначе если бы у перекати-поля был бы один кадр это выглядело бы обсосно. А я не хочу чтобы моя игруля выглядела обсосно. Вот для процессинга кадра я в структуру Tumbleweed добавил поле frameIndex. Вообще в игре у много чего будет такое поле и подобная логика. Ну и скорость изменения frameIndex тоже есть: это поле frameIndexVelocity. Да, это поле есть у каждого объекта Tumbleweed, хотя у всех объектов оно имеет одинаковое значение. Можно было бы не добавлять это поле потому что вроде как оно избыточно, но пусть будет - вдруг я решу сделать скорость разной у разных инстансов перекати-поля (а такие мысли в момент написания кода у меня были), а экономить память на спичках это путь в сумасшедший дом. Всего кадров у перекати-поля сделано 4. В одной из прошлых глав ты видел константу TumbleweedSpritesCount = 4 - вот это про это. frameIndex - это число с плавающей точкой, которое меняется в диапазоне [0; 4) со скорость указанной в frameIndexVelocity. Логика строк 130 - 134 осуществляет именно это.

Вот так устроен процессинг перекати-поля. Как тебе? Меня лично вставляет. Идём дальше.

Порой надо создавать перекати-поле, а не только процесить. Для этого надо решить по какой логике оно будет создаваться. Когда я усердно играл в Minecraft я частенько читал вики по нему. И в вики по Майнкрафту рассказывали каким образом спаунятся различные сущности. И логика спауна примерно такая: шанс один из десяти тысяч что в конкретном тике заспаунится сущность. Вот такую же логику я решил впиндюрить потому что это просто и понятно.

Делаю игрулю на Playdate на чистом C. Глава 3 Продолжение следует, Gamedev, Австралия, Сафари, Длиннопост, Playdate

Создание перекати-поля

Строка 139 говорит нам, что с шансом 1 к 100 (tumbleweedSpawnChangePercentage равна 1) создастся новое перекати-поле в тике. На строке 154 создаётся инстанс перкати-поля функцией TumbleweedCreate, а на следующей строке этот инстанс отправляется (на самом деле копируется) в массив game->tumbleweeds.

Для создания перекати-поле нам нужно 4 аргумента: позиция на карте, скорость передвижения, скорость подпрыгивания и скорость изменения кадра. Позиция на карте высчитывается суперхитрым образом - новое перекати-поле появляется просто ровно за границей экрана левой либо правой. И едет в сторону машины игрока по-горизонтали. Можно, конечно спаунить "по-честному" в случайной точке достаточно большого игрового поля, но тогда игрок просто будет редко видеть перекати-поле, особенно в начале игры, а это ухудшает пользовательский опыт. Скорость подпрыгивания это количество радиан прошедших за секунду для значения от которого мы считаем синус график которого я ранее показывал. А про скорость изменения кадра ты уже и так знаешь: у перекати-поля 4 кадра, как я говорил ранее, и их надо с определённой скоростью менять.

Далее на строке 158 смещению камеры присваивается позиция машины чтобы машина всегда была в центре экрана куда бы она не ехала. А на строке 160 вызывается функция GameDraw, которая весь описываемый мной тут балаган отрисовывает чтобы игрок видел что происходит, иначе зачем всё это?

Отрисовку мы рассмотрим в следующей главе, а тебе спасибо что дочитал. Если нравится как я пишу и хочешь меня поддержать денюшкой, то я есть на патреоне и бусти.

Показать полностью 10

Misspell - 2D платформер в жанре метроидвания

В процессе разработки игры мы часто сталкиваемся с проблемами, о которых на старте разработки не могли даже предположить. Забавно, что про многие специфичные вещи и подходы почти нигде не упоминают, а исправление ошибок часто требует уйму времени, которого всегда не хватает. Хочется хотя бы в качестве разнообразия (надеемся не только него) поделиться с вами какими-то моментами, встретившимися нам на пути. Собственно именно о них и будет данная серия постов.

И начнем мы с "лица" любой игры - графики. В этом посте мы бы хотели рассказать, почему нам пришлось перерабатывать все спрайт-листы и наглядно показать, как это изменило восприятие игровых локаций. В прошлом году начался активный этап проработки сцен, как раз в процессе которого мы и поняли, что в визуальной части сцен все чаще и чаще всплывают специфичные изъяны. Больше всего смущала разрозненность композиций по цвету и яркости, причиной чему стали как сами спрайт-листы, так и организация работы в рамках игрового движка.

Закономерным исходом стала практически полная переработка спрайт-листов, а именно:
- Выравнивание спрайтов по тону (причем в силу специфики Unity пришлось делать спрайты гораздо ярче изначального варианта);
- Избавление спрайтов от излишней черноты в местах оттенений;
- Приведение всех спрайтов к более-менее единому уровню детализации;
- Перенос работы с воздушной перспективой из спрайтов на уровень движка (в рамках Unity наконец получилось добиться нужного эффекта);
- Правильное соотношение размеров спрайтов относительно персонажа и между друг другом;

В рамках же игрового движка тоже была осуществлена куча положительных изменений, связанных не только с инструментами разработки, но и самим подходом к выстраиванию графики. Упомянем только самые основные моменты, потому что перечислить все нюансы в рамках подобного формата весьма сложно:
- Выстраивание иерархии объектов, которая позволила бы учесть специфику Unity в совокупности с большим кол-вом объектов и биением их по слоям параллакса (удивительно, что об это вообще никто не говорит, так как задача крайне не простая);
- Проработка визуального стиля и общих правил выстраивания уровней с точки зрения графики;
- Использование источников освещения в приоритете над конфигурацией конкретных спрайтов, что с одной стороны ускорило создание сцен, а с другой добавило гармонии в общую композицию и избавило ее от "эффекта пестрения", который часто резал нам глаза.
- Активное использование шейдеров, компетенцию в создании которых пришлось значительно нарастить (на самом все еще наращиваем :D )

На самом деле про каждый из пунктов можно написать отдельный пост, но пока нет уверенности, что подобного рода технические нюансы действительно интересны большинству читающих этот пост. Так что... по крайней мере пока не будем углубляться в детали.

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

Как вам результат проделанной работы? Будем рады обратной связи!

До и после переработки спрайтов.

ВКонтакте: https://vk.com/boneskeeperstudio
Telegram: https://t.me/boneskeeperstudio
Artstation: https://www.artstation.com/boneskeeperstudio
Boosty: https://boosty.to/boneskeeper
Patreon: https://www.patreon.com/boneskeeper

Показать полностью 5
Отличная работа, все прочитано!