В наше время очень популярна тема разработки игр, я еще заставший сеги, с удовольствием играющий в первый старкрафт всегда хотел начать что-то разрабатывать самостоятельно. Конечно во влажных фантазиях были крутые идеи и кучи бабок с них. Однако время шло и всю свою школьную жизнь я больше посвятил робототехнике, электронике и программированию более реальных задач.
Тем не менее мечты никуда не делись и набравшись сил было принято решение сделать хоть что-то, выложить хоть где-то и чтобы это принесло что-нибудь кроме опыта и страданий.
С чего я начинал:
Знание синтаксиса популярных языков программирования и опыт в разработке приложений на c#
Отсутствие навыков в геймдизайне и рисовании
Потомственная игромания и страсть к компьютерным играм
Попытки разрабатывать игры в детстве
Тут не будут рассматриваться код и в целом это больше обзор моей деятельности.
Скрины более ранних работ:
Попытка сделать игру про алхимика и алхимические преобразования, закос под винду
Супер ранний кликер, я думаю все кто делает игры делал что-то подобное
Среда программирования роботов, меньше чем игра, но более достойная работа, есть анимации и в целом какой-никакой функционал
Итак, после такого прекрасного опыта, выбор движка пал на бесплатный Godot, в виду своей простоты и бесплатности. Конечно, в начале было сделано несколько простеньких проектов, которые бы познакомили меня с движком:
2д игра про стрельбу шариками, познакомился с базовыми понятиями движка
Простенький работающий платформер, проверка работы физики и коллизии.
Обязательная попытка сделать 3д-шутер, можно бегать, стрелять и даже убивать противников.
Куда без попытки сделать майнкрафт, можно ставить и ломать блоки. Инвентаря и прочих вещей конечно же нет.
После ознакомления с движком, собрав пару друзей была попытка разработать что-то серьезное. Хотелось сделать что-то наподобие растений против зомби, поэтому вид сверху и постройка защитных башен была обязательна. Так как хотелось, чтобы проект был полностью сделанным нами, было решено рисовать все вручную, я думаю результат очевиден:
Воин ящер, срисованный с меня, я считаю получился отлично
Пещера, где живут ящеры
Прудик, которая нарисовала моя жена, самая достойная работа
Ящер, нарисованный моим другом
Все рисовалось в программе Aseprite и это был ад, с учетом того, что навыков в рисовании особо не было. Зато появился первый билд:
Снаряды не летают, юниты ничего не умеют, куча ошибок в логах
Естественно, первый билд был успешно заброшен и с идеей переписать все с нуля, была сделана более-менее рабочая версия, в которую уже можно было играть:
Выглядит не очень, но хотя-бы в это можно играть
После этого игра была выложена в более менее рабочем виде на itch и newgrounds, на последнем портале мне поставили более менее даже хорошие оценки.
2.63, что больше половины, с учетом первой игры наверное неплохо
Конечно в игре бесконечное количество ошибок, в игре юниты двигается без системы физики/хит боксов. Спрайты были сохранены с расположением влево/вправо, хотя в движке есть возможность поворачивать картинки. Плохой код повсеместно, короче красота. Игра была сделана в течении 3-5 месяцев, уже точно не помню. Основные все моменты, такие как переписывание всей игры проводились раза 3 точно и в течении всей ночи.
Далее из-за того что нравилось бегать и стрелять, была сделана следующая игра в виде кликера про стрельбу:
Сводись и стреляй, думаю всем знакомый геймплей.
Магазинчик, куда же без него
Игра проста, сделана за пару ночей и в целом все что в игре есть в плане графики уже было взято с бесплатных ассетов. Оценки соответствующие:
В целом, вместо 4-5 месяцев страдания, сделать игру за пару ночей и получить не сильно ниже оценки, уже неплохо наверное
Основная проблема кроме плохого кода является невозможность рисования нормальных ассетов. Как художник я очень плох, чтобы нарисовать что-то нормальное уходит бесконечное количество времени. Поэтому бесплатные ассеты наше все. Следующая игра родилась как раз во время просмотра бесплатных ассетов, один пак настолько попал в душу, что было решено сделать игру про строительство:
Главное меню, на фоне летает остров, есть режим песочницы и выживания. В песочнице можно настраивать размер генерируемого острова.
Про что игра: генерируется случайный остров с камнями, деревьями и реками. Наша задача обеспечивать продовольствием людей, которых с каждым ходом становится все больше. А помогут нам в этом различные строения:
Такое вот обучение в игре, дешево и уныло.
Главная проблема именно в отсутствии еды. На каждую нехватку еды, остров будет разваливаться. Это и делает весь геймплей, строй фермы, пытайся добывать ресурсы и выжить на этом маленьком клочке земли.
Процесс генерации мира в режиме выживания
В целом лично мне эта игра нравится, все ещё код оставляет желать лучшего, есть множество вещей которые можно сделать лучше, но это уже похоже на что-то серьезное, оценки на newgrounds были выше чем обычно и в целом я был доволен.
3.33? Игра года, не иначе
Далее нужно выложить продукт на какую-нибудь площадку и начать уже зарабатывать миллионы, а то уже заждались. В качестве площадки были выбраны Яндекс игры, платформа открытая, а большего мне и не надо. И вот я уже выкладываю на ней свою игру:
Выглядит красиво, а это главное)
А вот и самое интересное - деньги. Они капают только с рекламы, реклама показывается в начале, после смерти и баннеры висят слева и снизу экрана на самом сайте Яндекса. Моя задача как разработчика - заставить игрока играть именно в мою игру, к сожалению, игра не сильно справляется.
Люблю графики, жаль цифры не очень высокие.
Итак, в среднем 20 игроков за неделю и каждый из них проводит по 4 минуты в игре. Звучит как провал, а что по деньгам?
70 рублей в месяц, на удивление на момент написания поста, игра смогла что-то даже заработать
Вот общий график как игра приносит деньги. Все конечно же в рублях
По графикам видно, что лучше бы вкладывал в кладовки игра в среднем приносит почти ничего, с учетом сегодняшней инфляции, это даже не смешно. Но опыт есть опыт. Если у вас есть какие-то вопросы или пожелания, жду в комментариях. Также не сильно бейте, это почти первый пост.
Если вам всё ещё интересен наш проект и вы хотите его поддержать, то можете добавить игру в Список желаемого в стим и там же нажать Подписаться, чтобы следить за обновлениями.
В этот раз покажу вам большой кусок геймплея. Он ещё сыроват, заметны фризы и всякие нелепости. Мы работаем над этим.
1. Низкий уровень хардкора и отсутствие большинства механик классического выживача. Игра больше похожа на Valheim, главный упор сделан на исследование мира. Например, как и в Valheim, еда и сон в игре не обязательны, но дают полезные баффы.
2. Наличие дружественных NPC и квестов. Подобное есть в Don't Starve: Hamlet и свежих обновлениях Valheim. В мире можно встретить NPC и помочь с решением его проблемы, за это получить артефакт или доступ в новую локацию. На видео есть часть выполнения таких квестов по сбору хвороста и починке моста, они должны дать игроку возможность выйти из первой локации. Большинство квестов будут необязательны, можно сделать только один из перечисленных квестов или не делать их вообще и найти выход другим способом.
3. Боевая система более динамичная, чем в Don't Starve, есть простые однокнопочные комбо, метание предметов, пинок. Это так же можно увидеть в видео, но тайминги и анимации ещё не отполированы, не пугайтесь.
4. 'Нелинейный крафтинг', чем то схожий с Project Zomboid крафтинг. У вас есть рецепт предмета с несколькими слотами, и вы можете экспериментировать с ресурсами для этих слотов. Например, для изготовления верёвки можно использовать кожу и крапиву в разных пропорциях и получать верёвки разной прочности.
5. Мир игры генерируется случайно, но подразумевается некоторая последовательность локаций. Так же есть заранее созданные точки интереса, которые могут располагаться в разных местах определённой локации. Перемещение между локациями свободное и не подразумевает прохождение одним путём.
Сейчас работа над игрой идёт не быстро, мы в поиске финансирования. Ещё точно не решили, стоит ли пробовать краудфандинг или сразу идти к издателю. Так что, если вы издатель и вы заинтересованы, то можете написать и я вышлю вам питч и билд игры. cgcfss@pm.me
Ну а теперь смотрим видео, буду рад любым отзывам и предложениям.
Для тех кто первый раз читает мой гоблинский блог - расскажу кратко что тут происходит. Я сам являюсь зеленым новичком в разработке игр и в своем блоге описываю этапы изучения столь сложного дела. На данный момент - это работа с движком Godot 4.
Чтобы не мучать вас длинными статьями, я разбиваю этот путь на кучу мелких блоков. Один пост - одна механика движка. Все гоблинские заумные слова расшифровываются на человеческий, так что даже пациент из Кащенко поймет о чем речь. Погнали!
● Создание сцены с персонажем:
В прошлой статье мы создали редактор карт с автоматическим заполнением, кто не читал - почитайте, будет полезно. Теперь нам нужно сделать персонажа, которым мы будем бегать по данной карте. Для этого нам нужен узел типа "CharacterBody2D", на основе которого мы и создаем новую сцену. Сделать это можно выбрав вкладку "Другой узел".
Как выглядит узел "CharacterBody2D"
● Визуальное изображение персонажа:
Узел это конечно хорошо, но мы пока ни черта не видим - нам нужен визуальный образ. Добавляем дочерний узел "Sprite2D". В его настройках находим вкладку текстуры и добавляем иконку Godot. В будущем мы заменим спрайт на анимацию, но пока нам хватит такой затычки.
Узел "Sprite" -> Texture -> Быстро загрузить
● Настройка зоны столкновения:
Чтобы наш персонаж не проваливался в текстуры и реагировал на поверхности мы должны настроить зоны столкновения. В прошлом уроке мы работали со слоем Collision в нашем TileMap. Тут же мы добавляем узел "CollisionShape2D", который представляет из себя выделение зоны столкновения в виде простой геометрической фигуры. Вид этой фигуры мы выбираем во вкладке "Shape".
Узел "CollisionShape2D" -> Shape -> Новый RectangleShape2D
● Начальные данные для физики и управления:
Создаем скрипт для нашей сцены и первым делом зададим константы. Константа - это постоянное значение, которое не будет меняться в ходе работы программы.
Чтобы создать константу мы пишем: const название_константы = значение
Переменные же создаются по другому: var название_переменной = значение
Давайте разберемся за что отвечают указанные нами значения:
speed и acceleration - от этих значений будет зависеть скорость передвижения по оси X (влево-вправо)
jump_velocity - это значение влияющее на высоту прыжка. Ось Y в Godot перевернута с ног на голову и отрицательное значение означает вверх.
friction - значение влияющее на скорость остановки при прекращении передвижения.
Так выглядят наши константы в коде
Так же мы добавляем значение гравитации, однако оно выставляется из внутренних настроек проекта.
var gravity = ProjectSettings.get_setting("physics/2d/default_gravity")
● Общая функция для управления персонажем:
Задав исходные данные мы можем приступать к настройкам функций нашего персонажа. Для этого мы пишем стандартную функцию Godot:
func _physics_process(delta):
Для тех кто не знает - эта функция вызывается перед каждым физическим кадром, который привязан к физическому fps, он по умолчанию равен 60 раз в секунду.
var input_axis = Input.get_axis("ui_left","ui_right")
Get_axis - это функция которая присваивает переменной одно из двух значений при нажатии одной из двух кнопок. Первое значение равно -1 и задается при нажатии клавиши "влево". Второе же равно 1 и задается при нажатии клавиши "вправо". Если на момент кадра не нажата ни одна из этих кнопок, значение равно 0. Это позволяет нам определить нужное направление для изменения координат персонажа.
Влево = -1 | Вправо = 1 | Стоим на месте = 0
● Движение по оси X (влево-вправо), создаем новую функцию:
handle_acceleration (input_axis, delta)
В нее мы добавляем условие, что должна быть нажата одна из клавиш - влево или вправо.
if input_axis !=0:
Если данное условие выполнено, то мы совершаем перемещение в заданном направлении. Для этого используется функция move_toward.
velocity.x - это переменная отвечающая за перемещение по оси X.
В move_toward мы задаем три параметра через запятую. Изначальная точка, точка в которую мы должны прийти, шаг в сторону нужной точки за один кадр.
Каждый кадр мы двигаемся в выбранную сторону, начальная точка меняется и это создает замкнутый круг движения. А чтобы его запустить, мы добавляем нашу функцию под physics_process и в конце пишем move_and_slide().
move_toward ( начальная точка, точка прибытия, расстояние шага за один кадр )
▸ А где тормоза то !?
● Как сделать остановку?
Мы начали двигаться и если не нажмем кнопку в противоположную сторону - улетим за край карты. Чтобы разорвать наш круг постоянного движения мы должны сделать функцию тормоза.
Копируем нашу прошлую функцию и переименовываем ее:
handle_friction (input_axis, delta):
Так же меняем заданное условие, input_axis должен быть равен нулю. Главное помнить, что знак равенства при сравнении выглядит вот так "==".
if input_axis == 0:
В функции move_toward заменяем значения. Первое остается прежним, на втором ставим ноль, а на третьем стираем acceleration и пишем friction. Все это в сумме обеспечит нам быструю остановку.
Функции обратные друг другу
● Движение по оси Y (прыжок, гравитация), создаем новую функцию:
aplay_gravity(delta):
Если мы не на земле, то бишь в воздухе - нас должно тянуть вниз.
if not is_on_floor():
velocity.y += gravity * delta
Ставим именно "+=", так как это сделает плавное падение с нарастающим ускорением. Не забудьте умножить на delta, иначе все произойдет за долю секонды.
● Следующая функция для прыжка:
handle_jump(delta):
Для нас важны два условия - нахождение на земле в момент прыжка и нажатие нужной клавиши.
if is_on_floor() and Input.is_action_just_pressed("ui_accept"):
Если данное условие соблюдено мы приравниваем параметр оси Y к значению высоты прыжка.
velocity.y = jump_velocity
Добавляем эти функции под physics_process, а после переходим на сцену "world". Туда из общего списка ресурсов перетаскиваем сцену "player".
.tscn - это формат сцены в Godot
Как выглядит наш блок с функциями
● Что у нас получилось в итоге?
✓ Если вы нажимаем клавишу влево или вправо - персонаж двигается в выбранном направлении.
✓ Если ни одна из клавиш направления не нажата - мы останавливаемся.
✓ Если мы находимся в воздухе - нас тянет вниз с каждой секундой все сильнее.
✓ Если находясь на земле, мы жмем прыжок - нас подкинет вверх.
▸ Оно живое!
Вот так при помощи четырех простых функций мы создали основу физики и управление персонажем. Надеюсь разобрал каждый шаг максимально подробно и понятно.
✓ Зеленые новички - крепитесь и подписывайтесь, скоро новая статья. На очереди две темы - "анимация персонажа" или "двойные прыжки и прыжки от стены".
✓ Опытные шаманы - запасайтесь успокоительным, ибо дальше будет еще куча попыток освоить gamedev.
✓ Ну и все кто имеет свое мнение, поддержку или усмешку - пишите комменты!
Такую задачу поставил Little.Bit пикабушникам. И на его призыв откликнулись PILOTMISHA, MorGott и Lei Radna. Поэтому теперь вы знаете, как сделать игру, скрафтить косплей, написать историю и посадить самолет. А если еще не знаете, то смотрите и учитесь.
Для тех кто первый раз читает мой гоблинский блог - расскажу кратко что тут происходит. Я сам являюсь зеленым новичком в разработке игр и в своем блоге описываю этапы изучения столь сложного дела. На данный момент - это работа с движком Godot 4.
Чтобы не мучать вас длинными статьями, я разбиваю этот путь на кучу мелких блоков. Один пост - одна механика движка. Все гоблинские заумные слова расшифровываются на человеческий, так что даже пациент из Кащенко поймет о чем речь. Погнали!
● Узлы, сцены и прочие слова не связанные с BDSM - это интерфейс Godot 4:
▸Наглядно показываю что и где
Основа движка Godot - это узлы и их древо. Блоки могут быть самого разного назначения, от визуального изображения, до настроек звука. Сцена - это отдельная группа узлов. Она нужна чтобы структурировать элементы и не путаться. Например, можно создать отдельную сцену с узлами нашего персонажа, а после добавлять эту сцену как узел в другую.
Создадим сцену нашей карты и назовем ее World. Для этого выбираем "2D сцена" как на скрине выше. Теперь можем добавить к сцене дочерний узел, нажав на плюсик. В поиске ищем TileMap - это узел для работы с тайл-сетами будущей карты.
● Что такое TileMap:
TileMap - это крайне полезный инструмент, который позволяет создать автоматическое заполнение карты. В разделе TileSet выбираем новый, внизу выбираем "Набор тайлов" и в открывшемся окне загружаем заранее подготовленный файл.
▸Шаблон для создания тайл-сета
Тайл-сет - это набор элементов из которых будет состоять будущая карта. Его можно нарисовать или поступить как истинный гоблин и взять ассеты в интернете. Чтобы не перетаскивать каждый кусок этого набора в нашу сцену, мы настроим автоматическое заполнение.
● Настройка рисования карты в TileMap:
В правом блоке узла TileMap вы найдете вкладку "Terrain Sets" (набор местности). В ней мы нажимаем "Добавить элемент" и в открывшемся блоке снова жмем "Добавить элемент". Теперь в центральном блоке выбираем вкладку "Рисовать" -> "Свойства рисования" - > Terrains.
▸Настройка местности
В обоих выделенных вкладках выбираем созданный нами элемент Terrain. С его помощью мы настраиваем области тайл-сета. Именно по ним Godot определяет какой кусок ставить следующим.
▸Настроенный TileMap
● Зоны столкновения для TileMap:
Помимо визуального изображения, нам нужно добавить для карты физический слой. Выбираем Physics Layer и добавляем новый элемент. Далее в разделе рисования выбираем "Физика" и наш слой. Так как наша карта состоит из блоков - выделаем каждый квадратом.
Теперь другие объекты будут видеть нашу карту и воспринимать ее как физическое препятствие.
● Как работает настроенный TileMap:
▸Рисуем что хотим
Теперь мы можем буквально рисовать карту, создавая любые формы. Алгоритм определяет какую часть нашего тайл-сета ставить в зависимости от соседних элементов. Просто води курсором с зажатой ЛКМ, а Godot сделает все остальное.
▸А вот это уже что-то похожее на элемент игры
Создание основы для уровня теперь занимает всего пару минут. Но помимо карты нам нужен наш персонаж, опасности и условия для завершения уровня. Этим мы займемся в следующем уроке.
Надеюсь гоблин смог пояснить за механику тайлов и вы смогли дочитать эту графоманию до конца.
✓ Зеленые новички - крепитесь и подписывайтесь, скоро новая статья.
✓ Опытные шаманы - запасайтесь успокоительным, ибо дальше будет еще куча попыток освоить gamedev.
✓ Ну и все кто имеет свое мнение, поддержку или усмешку - пишите комменты!