GoblinCave

GoblinCave

Dev Blog от гоблина который пытается с нуля и без каких либо навыков войти в разработку игр. Считайте это списком граблей для таких же новичков как я...
На Пикабу
поставил 16 плюсов и 0 минусов
427 рейтинг 54 подписчика 1 подписка 19 постов 3 в горячем

Молодой гоблин щупает движок Godot за всякое... Продолжаем изучение Godot на примере 2D платформера!

Молодой гоблин щупает движок Godot за всякое... Продолжаем изучение Godot на примере 2D платформера! Gamedev, Разработка, Инди игра, Программирование, Программист, Инди, Godot, Godot Engine, Разработчики, Разработчики игр, Indiedev, Платформер, Длиннопост

Приветствую, человеки и прочие расы фентезийного болота. В первой статье мы познакомились с движком Godot, сделали простенькую карту и настроили управление персонажем.

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

Молодой гоблин щупает движок Godot за всякое... Продолжаем изучение Godot на примере 2D платформера! Gamedev, Разработка, Инди игра, Программирование, Программист, Инди, Godot, Godot Engine, Разработчики, Разработчики игр, Indiedev, Платформер, Длиннопост

Пока что у нас есть вот это нечто...

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

Этот гад способен менять свое направление прямо в воздухе и к примеру развернутся на пол пути к пропасти. В каких то платформерах это нормально и является частью игровой механики, но у нас игрок будет СТРАДАТЬ!

Молодой гоблин щупает движок Godot за всякое... Продолжаем изучение Godot на примере 2D платформера! Gamedev, Разработка, Инди игра, Программирование, Программист, Инди, Godot, Godot Engine, Разработчики, Разработчики игр, Indiedev, Платформер, Длиннопост

"Игрок может двигаться по оси X (влево-вправо) только находясь на земле"

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

func handle_acceleration (input_axis, delta):

if is_on_floor() and input_axis !=0 :

velocity.x = move_toward(velocity.x, SPEED * input_axis, ACCELERATION * delta)

Молодой гоблин щупает движок Godot за всякое... Продолжаем изучение Godot на примере 2D платформера! Gamedev, Разработка, Инди игра, Программирование, Программист, Инди, Godot, Godot Engine, Разработчики, Разработчики игр, Indiedev, Платформер, Длиннопост

Теперь если игрок неверно рассчитал расстояние для прыжка - сменить направление полета в воздухе он уже не сможет...

Казалось бы, на этом можно закончить, но есть нюанс.

Игроку нужно сначала взять хотя бы минимальный разбег в нужную сторону, чтобы избежать прыжка на одном месте. Грубо говоря, он должен сперва нажать клавишу "ВПРАВО", а уже потом "ПРОБЕЛ" иначе не сработает. Это неудобно, особенно когда нам нужно запрыгнуть на выступ находясь у стены. Дело поправимое, залазим обратно в эту же функцию и дополняем ее.

func handle_acceleration (input_axis, delta):

if is_on_floor() and input_axis !=0 :

velocity.x = move_toward(velocity.x, SPEED * input_axis, ACCELERATION * delta)

elif not is_on_floor() and input_axis != 0 and velocity.x == 0:

velocity.x = move_toward(velocity.x, SPEED * input_axis, ACCELERATION * 10 * delta)

Понимаю, выглядит сложновато, потому переведу на человечий.

Передвижение влево-вправо доступно только при нахождении на земле. Если игрок нажал сначала "ПРОБЕЛ", то произойдет прыжок на месте. Сдвинуться по оси X (влево-вправо) он уже не сможет, так как находится не на земле.

Нам нужно определить, находится ли персонаж в состоянии прыжка - это not_is_on_floor()

Раз происходит прыжок на месте, то ось X остается неизменной - это velocity.x == 0

Наша попытка передвижения вызывается нажатием клавиши направления - это input_axis !=0

Если все три условия соблюдены, то мы позволяем совершить передвижение по оси X, однако произойдет оно только один раз и только в одном из выбранных направлений. Все потому, что в следующем кадре значение velocity.x уже не будет равно нулю и данное условие перестает работать. Чтобы этот одноразовый рывок имел смысл, нам нужно увеличить значение ACCELERATION. Можем сделать для этого отдельную переменную, но я обошелся простым умножением на 10.

Что мы получили по итогу?

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

Для чего обычно вводят такую механику? Для повышения ценности действий игрока. Зная, что нельзя повернуть назад в полете игрок будет куда осторожнее вымерять расстояние для прыжка над опасностью. К слову об опасности...

Самое популярное препятствие в платформерах - это пики точеные!

Молодой гоблин щупает движок Godot за всякое... Продолжаем изучение Godot на примере 2D платформера! Gamedev, Разработка, Инди игра, Программирование, Программист, Инди, Godot, Godot Engine, Разработчики, Разработчики игр, Indiedev, Платформер, Длиннопост

Рисуем пики 16 х 16 в любом удобном графическом редакторе...

Молодой гоблин щупает движок Godot за всякое... Продолжаем изучение Godot на примере 2D платформера! Gamedev, Разработка, Инди игра, Программирование, Программист, Инди, Godot, Godot Engine, Разработчики, Разработчики игр, Indiedev, Платформер, Длиннопост

Путь: Рендеринг - Текстуры - Default Texture Filter;

Нарисовав препятствие - загружаем его в ресурсы проекта. Создаем новую сцену "Spikes" и добавляем дочерний узел "Sprite2D". Как подцеплять к нему текстуру мы проходили в первой статье - советую почитать если еще незнаком. Чтобы наша картинка не замылилась ввиду ее пиксельного стиля - поменяем текстурный фильтр на Nearest.

Молодой гоблин щупает движок Godot за всякое... Продолжаем изучение Godot на примере 2D платформера! Gamedev, Разработка, Инди игра, Программирование, Программист, Инди, Godot, Godot Engine, Разработчики, Разработчики игр, Indiedev, Платформер, Длиннопост

Узел "Area2D" и раздел "Collision"...

Area2D - куда тебя ведать?

Создаем еще одну сцену (не узел) и за ее основу берем "Area2D" (вот это уже узел). Данная штука нужна чтобы обнаруживать пересечения объектов. У многих объектов есть такой раздел как "Collision", а в нем слои и маски.

Для того, чтобы было проще понять - объясню на примере:

Слой - это область, где данный объект МОГУТ увидеть другие объекты и взаимодействовать с ним.

Маска - это область, где данный объект МОЖЕТ увидеть другие объекты и взаимодействовать с ними.

Например, мы поставим объект "StaticBody2D" из которого состоит наша карта на первый слой. "CharterBody2D" который является нашим игроком мы поместим на второй слой.

Если у "CharterBody2D" в разделе маска мы укажем второй слой вместо первого, на котором находится "StaticBody2D" - наш персонаж его просто не увидит. А это значит, что игрок просто провалится в пол.

Молодой гоблин щупает движок Godot за всякое... Продолжаем изучение Godot на примере 2D платформера! Gamedev, Разработка, Инди игра, Программирование, Программист, Инди, Godot, Godot Engine, Разработчики, Разработчики игр, Indiedev, Платформер, Длиннопост

Объект World находится на первом слое, объект Player на втором. Маска Player видит объекты лишь на втором слое.

Молодой гоблин щупает движок Godot за всякое... Продолжаем изучение Godot на примере 2D платформера! Gamedev, Разработка, Инди игра, Программирование, Программист, Инди, Godot, Godot Engine, Разработчики, Разработчики игр, Indiedev, Платформер, Длиннопост

Из-за этого зоны столкновения у объектов Player и World не взаимодействуют и мы проваливаемся вниз. 

Молодой гоблин щупает движок Godot за всякое... Продолжаем изучение Godot на примере 2D платформера! Gamedev, Разработка, Инди игра, Программирование, Программист, Инди, Godot, Godot Engine, Разработчики, Разработчики игр, Indiedev, Платформер, Длиннопост

Если выставить у Player маску первого слоя - он начнет его видеть и взаимодействовать с ним. По этой причине мы вновь твердо стоим на поверхности.

Теперь, когда мы знаем для чего нужен данный узел - пора сделать точеные пики действительно опасными. Заходим в сцену и выбрав узел Area2D переименовываем в "HazardArea". В разделе "Collision" выставляем третий слой, а вот маску оставляем пустой. Наши пики никого не должны искать - они сами выступают объектом поиска.

Молодой гоблин щупает движок Godot за всякое... Продолжаем изучение Godot на примере 2D платформера! Gamedev, Разработка, Инди игра, Программирование, Программист, Инди, Godot, Godot Engine, Разработчики, Разработчики игр, Indiedev, Платформер, Длиннопост

Теперь переходим в сцену Spikes и нажимаем на кнопку добавления дочерней сцены. Она находится рядом с кнопкой добавления узла. Выбираем нашу сцену "HazardArea2D". Добавляем для "HazardArea2D" два дочерних узла "CollisionPolygon", определяя область столкновения.

Молодой гоблин щупает движок Godot за всякое... Продолжаем изучение Godot на примере 2D платформера! Gamedev, Разработка, Инди игра, Программирование, Программист, Инди, Godot, Godot Engine, Разработчики, Разработчики игр, Indiedev, Платформер, Длиннопост

Можно создать область для одной пики и просто скопировать ее...

Теперь мы переходим в сцену "Player" и создаем дочерний узел "Area2D", называем его "HazardDetecter". Уже к этой области привязываем дочерний"CollisionShape". В узле "HazardDetecter" выбираем раздел "Collision" и оставляем графу слоя пустой. Но в разделе маски и выбираем третий слой - именно в нем мы будем искать область опасности "HazardArea".

Молодой гоблин щупает движок Godot за всякое... Продолжаем изучение Godot на примере 2D платформера! Gamedev, Разработка, Инди игра, Программирование, Программист, Инди, Godot, Godot Engine, Разработчики, Разработчики игр, Indiedev, Платформер, Длиннопост
Молодой гоблин щупает движок Godot за всякое... Продолжаем изучение Godot на примере 2D платформера! Gamedev, Разработка, Инди игра, Программирование, Программист, Инди, Godot, Godot Engine, Разработчики, Разработчики игр, Indiedev, Платформер, Длиннопост

Графа слоя - пустая, графа маски - выставлена на третий слой...

Осталось настроить сигналы... вы еще не знакомы с ними?

У многих узлов есть доступные сигналы и узел Area2D - не исключение. Посмотреть доступные сигналы можно в колонке справа, перейдя в раздел "Узел". Нас в первую очередь интересует сигнал "area_entered", что в переводе на человеческий означает "Обнаружена область".

В графе маска указан третий слой и именно на нем находится "HazardArea". Когда наш узел "HazardDetecter" обнаружит другой узел типа Area2D - сигнал сработает. Но что нам делать с полученным сигналом?

Сделаем простенькую систему смерти и возрождения!

Молодой гоблин щупает движок Godot за всякое... Продолжаем изучение Godot на примере 2D платформера! Gamedev, Разработка, Инди игра, Программирование, Программист, Инди, Godot, Godot Engine, Разработчики, Разработчики игр, Indiedev, Платформер, Длиннопост

Свет, камера - мотор!

Для начала добавим камеру, которая будет следовать за нашим персонажем. В разделе "PositionSmoothing" выставим "Speed" на 5 пикселей в секунду. Эта небольшая задержка сделает движение камеры более плавным.

Теперь нам потребуется зафиксировать точку для возрождения. Ей будет выступать стартовая позиция с которой мы начинаем игру. Создаем переменную стартовой позиции и при запуске игры закладываем в нее координаты начального положения игрока.

@onready var starting_position = global_position

Молодой гоблин щупает движок Godot за всякое... Продолжаем изучение Godot на примере 2D платформера! Gamedev, Разработка, Инди игра, Программирование, Программист, Инди, Godot, Godot Engine, Разработчики, Разработчики игр, Indiedev, Платформер, Длиннопост

Теперь переходим в узел "HazardDetecter" к разделу сигналов и ищем "entered_area". Нажимаем правой кнопкой мыши, тыкаем присоединить и выбираем наш объект "Player".

Это создаст в скрипте новую функцию, под которой мы пишем всего одну строку.

global_position = starting_position

Молодой гоблин щупает движок Godot за всякое... Продолжаем изучение Godot на примере 2D платформера! Gamedev, Разработка, Инди игра, Программирование, Программист, Инди, Godot, Godot Engine, Разработчики, Разработчики игр, Indiedev, Платформер, Длиннопост

Присоединение сигнала к узлу...

Молодой гоблин щупает движок Godot за всякое... Продолжаем изучение Godot на примере 2D платформера! Gamedev, Разработка, Инди игра, Программирование, Программист, Инди, Godot, Godot Engine, Разработчики, Разработчики игр, Indiedev, Платформер, Длиннопост

"Если будет обнаружена Area2D - позиция игрока вернется на стартовую"

Остается только расставить наши точеные пики по карте и мы можем смело отлетать на стартовую точку при столкновении с ними!

Молодой гоблин щупает движок Godot за всякое... Продолжаем изучение Godot на примере 2D платформера! Gamedev, Разработка, Инди игра, Программирование, Программист, Инди, Godot, Godot Engine, Разработчики, Разработчики игр, Indiedev, Платформер, Длиннопост

Вот они слева направо - пик, кол, штык, клык и острие...

Молодой гоблин щупает движок Godot за всякое... Продолжаем изучение Godot на примере 2D платформера! Gamedev, Разработка, Инди игра, Программирование, Программист, Инди, Godot, Godot Engine, Разработчики, Разработчики игр, Indiedev, Платформер, Длиннопост

Разбежавшись прыгну со скалы...

Молодой гоблин щупает движок Godot за всякое... Продолжаем изучение Godot на примере 2D платформера! Gamedev, Разработка, Инди игра, Программирование, Программист, Инди, Godot, Godot Engine, Разработчики, Разработчики игр, Indiedev, Платформер, Длиннопост

Вот я был и вот я у респауна...

Остался чисто косметический момент, а именно - анимация персонажа. 2D сеты анимации вы можете легко откапать на просторах интернета, я же расскажу вам как их правильно настроить.

Заменяем узел спрайта на "AnimatedSprite2D" и в разделе "Sprite Frames" создаем новый. Перед вами откроется окно кадровой анимации, куда вы и будете загружать кадры.

Молодой гоблин щупает движок Godot за всякое... Продолжаем изучение Godot на примере 2D платформера! Gamedev, Разработка, Инди игра, Программирование, Программист, Инди, Godot, Godot Engine, Разработчики, Разработчики игр, Indiedev, Платформер, Длиннопост
Молодой гоблин щупает движок Godot за всякое... Продолжаем изучение Godot на примере 2D платформера! Gamedev, Разработка, Инди игра, Программирование, Программист, Инди, Godot, Godot Engine, Разработчики, Разработчики игр, Indiedev, Платформер, Длиннопост

Стой, прыгай и беги...

Создаем три анимации - "idle", "jump" и "run". Первые две состоят из одиночных спрайтов, так как это статичные позиции. А вот для бега я решил добавить три спрайта. В окошке с FPS мы устанавливаем частоту кадров при анимации, в нашем случае поставили 12.

Теперь переносим зажав ctrl узел "AnimatedSprite2D" в наш код в виде переменной и создаем функцию update_animation.

func update_animation (input_axis, delta):
if velocity.x == 0:
animated_sprite_2d.play("idle")
if input_axis !=0:
animated_sprite_2d.flip_h = (input_axis < 0)
animated_sprite_2d.play("run")
if not is_on_floor():
animated_sprite_2d.play("jump")

Снова переведу для вас на человечий язык:

Если мы стоим на месте - запустить анимацию стоячего положения;

Если нажата одна из кнопок движения, то мы проверяем направление. Если нажата кнопка "влево" - то зеркально разворачиваем объект анимации. Проигрываем анимацию бега.

Если мы не на земле - запускаем анимацию прыжка.

Молодой гоблин щупает движок Godot за всякое... Продолжаем изучение Godot на примере 2D платформера! Gamedev, Разработка, Инди игра, Программирование, Программист, Инди, Godot, Godot Engine, Разработчики, Разработчики игр, Indiedev, Платформер, Длиннопост

Добавьте готовую функцию в список под phisics_process

Молодой гоблин щупает движок Godot за всякое... Продолжаем изучение Godot на примере 2D платформера! Gamedev, Разработка, Инди игра, Программирование, Программист, Инди, Godot, Godot Engine, Разработчики, Разработчики игр, Indiedev, Платформер, Длиннопост

Теперь наш персонаж действительно ожил...

Наконец-то мы получили подобие игры!

У нас есть анимированный персонаж подчиняющийся законам физики, карта по которой он передвигается и даже опасности, которые могут его убить и отправить на старт.

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

Продолжим доводить данный проект до ума в следующей статье! А пока что подписывайся на мой блог и оставь пару комментариев. Тебе не сложно - а мне поможет!

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

Первые попытки освоить движок Godot - делаем простой платформер

Первые попытки освоить движок Godot - делаем простой платформер Gamedev, Разработка, Инди игра, Программирование, Программист, Инди, Python, Godot, Godot Engine, Новичок, Код, Разработчики игр, Игровой движок, Платформер, IT, Unity, Unreal Engine, Длиннопост

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

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

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

Первые попытки освоить движок Godot - делаем простой платформер Gamedev, Разработка, Инди игра, Программирование, Программист, Инди, Python, Godot, Godot Engine, Новичок, Код, Разработчики игр, Игровой движок, Платформер, IT, Unity, Unreal Engine, Длиннопост

Тут наша сцена и связанные с ней узлы...

Создаем карту

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

Первые попытки освоить движок Godot - делаем простой платформер Gamedev, Разработка, Инди игра, Программирование, Программист, Инди, Python, Godot, Godot Engine, Новичок, Код, Разработчики игр, Игровой движок, Платформер, IT, Unity, Unreal Engine, Длиннопост

Все мы иногда статичное тело...

Правой кнопкой мыши жмякаем на нашу 2D сцену "World" и выбираем "Добавить дочерний узел". В списке ищем "StaticBody2d" и теперь у нас есть база. Добавляем два дочерних узла уже в статичный объект - "Polygon2D" и "CollisionPolygon2D".

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

Первые попытки освоить движок Godot - делаем простой платформер Gamedev, Разработка, Инди игра, Программирование, Программист, Инди, Python, Godot, Godot Engine, Новичок, Код, Разработчики игр, Игровой движок, Платформер, IT, Unity, Unreal Engine, Длиннопост

Рисуем будущую карту при помощи CollisionPolygon2D...

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

Первые попытки освоить движок Godot - делаем простой платформер Gamedev, Разработка, Инди игра, Программирование, Программист, Инди, Python, Godot, Godot Engine, Новичок, Код, Разработчики игр, Игровой движок, Платформер, IT, Unity, Unreal Engine, Длиннопост

Код приравнивающий форму фигуры к форме области столкновения...

Теперь нам нужно сделать так, чтобы визуальная фигура повторяла форму области столкновения. Нажимаем на нашу сцену и добавляем к ней скрипт. GD-script во многом схож с языком Python и более-менее прост в понимании. Сначала добавим наши узлы в виде переменных, для этого зажимаем "ctrl" и перетаскиваем в код после блока extends.

Прописываем функцию ready, она будет воспроизводится сразу во время запуска сцены. А дальше просто приравниваем форму фигуры к форме области столкновения (polygon_2d.polygon = collision_polygon_2d.polygon).

Первые попытки освоить движок Godot - делаем простой платформер Gamedev, Разработка, Инди игра, Программирование, Программист, Инди, Python, Godot, Godot Engine, Новичок, Код, Разработчики игр, Игровой движок, Платформер, IT, Unity, Unreal Engine, Длиннопост

Получаем дешевую и сердитую карту - все в гоблинском стиле!

Карта готова, но что делать теперь? Пора добавить нашего персонажа-марионетку.

Создаем новую сцену и для ее основы берем узел CharacterBody2D. Для будущей простоты восприятия я переименовал его в Player. Чтобы увидеть нашу тушку - добавим к ней дочерний узел "Sprite2D", а чтобы можно было еще и потрогать "CollisionShape2D".

Первые попытки освоить движок Godot - делаем простой платформер Gamedev, Разработка, Инди игра, Программирование, Программист, Инди, Python, Godot, Godot Engine, Новичок, Код, Разработчики игр, Игровой движок, Платформер, IT, Unity, Unreal Engine, Длиннопост

Добавляем иконку

Первые попытки освоить движок Godot - делаем простой платформер Gamedev, Разработка, Инди игра, Программирование, Программист, Инди, Python, Godot, Godot Engine, Новичок, Код, Разработчики игр, Игровой движок, Платформер, IT, Unity, Unreal Engine, Длиннопост

Выделяем область столкновения...

Тыкаем спрайт, выбираем текстуру и из быстрой загрузки возьмем иконку Godot. Пока что этого хватит, ведь в этом посте мы не будем затрагивать тему анимации. Далее выделяем область столкновения и сцепляем все это в одну группу кнопкой вверху панели.

Тело готово, пора научить его шевелиться и реагировать на физику. Для этого мы создаем для нашего Player свой скрипт.

Первые попытки освоить движок Godot - делаем простой платформер Gamedev, Разработка, Инди игра, Программирование, Программист, Инди, Python, Godot, Godot Engine, Новичок, Код, Разработчики игр, Игровой движок, Платформер, IT, Unity, Unreal Engine, Длиннопост

Наши переменные...

Задаем переменные через const (constants - постоянное значение). Значения констант не могут быть изменены в ходе самой программы, на то они и постоянные. Для чего нужны эти значения расскажу ниже.

const SPEED = 150.0

const JUMP_VELOCITY = -300.0

const FRICTION = 1000.0

const ACCELERATION = 600.0

На этот раз мы берем не функцию ready, а другую - physics_process. В отличии от простого process, здесь время между выполнением функции будет одинаковым. Это обеспечит нам стабильность при передвижении объектов.

Начнем с настройки гравитации!

Дело в том, что система координат X-Y в Godot имеет свои приколы. Ось X идет от отрицательной к положительной слева направо, однако ось Y идет от отрицательной к положительной сверху вниз. То есть ось Y буквально перевернута с ног на голову. Если непонятно - объясню проще:

Хотим передвинуть вправо - прибавляем к оси X;

Хотим передвинуть влево - вычитаем из оси X;

Хотим передвинуть вниз - прибавляем к оси Y;

Хотим передвинуть вверх - вычитаем из оси Y;

Первые попытки освоить движок Godot - делаем простой платформер Gamedev, Разработка, Инди игра, Программирование, Программист, Инди, Python, Godot, Godot Engine, Новичок, Код, Разработчики игр, Игровой движок, Платформер, IT, Unity, Unreal Engine, Длиннопост

Гравитация... беспощадная ты с*ка!

Как же нам заставить персонажа падать под давлением гравитации? Для начала добавим переменную GRAVITY равную 1000. Затем создаем свою пользовательскую функцию и называем ее aplay_gravity.

Мы должны падать когда находимся в воздухе, то есть не на полу. Буквально говорим программе "Если объект не на полу сделай следующее: измени положение по оси Y в положительную сторону на заданное нами расстояние".

if not is_on_floor():

velocity.y += GRAVITY * delta

Что такое delta? Это время между кадрами, благодаря чему перемещение будет стабильным вне зависимости от FPS.

velocity - это параметр скорости изначально зашитый в наш объект. По этой причине его так же не требуется объявлять как переменную. Грубо говоря сюда мы задаем то расстояние, на которое должен переместиться объект по осям X и Y.

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

Первые попытки освоить движок Godot - делаем простой платформер Gamedev, Разработка, Инди игра, Программирование, Программист, Инди, Python, Godot, Godot Engine, Новичок, Код, Разработчики игр, Игровой движок, Платформер, IT, Unity, Unreal Engine, Длиннопост

Отлично, нас прижало как после "Балтики 9"!

Теперь настраиваем прыжки!

Для этого создаем еще одну пользовательскую функцию handle_jump. Мы говорим ей: "Если мы нажимаем кнопку прыжка и находимся на полу - измени положение по оси Y в отрицательную сторону". Напомню, что константа прыжка имеет отрицательное значение.

if Input.is_action_just_pressed("ui_accept") and is_on_floor():

velocity.y += JUMP_VELOCITY

Первые попытки освоить движок Godot - делаем простой платформер Gamedev, Разработка, Инди игра, Программирование, Программист, Инди, Python, Godot, Godot Engine, Новичок, Код, Разработчики игр, Игровой движок, Платформер, IT, Unity, Unreal Engine, Длиннопост

К гравитации добавляются прыжки...

Первые попытки освоить движок Godot - делаем простой платформер Gamedev, Разработка, Инди игра, Программирование, Программист, Инди, Python, Godot, Godot Engine, Новичок, Код, Разработчики игр, Игровой движок, Платформер, IT, Unity, Unreal Engine, Длиннопост

Прыжок веры...

С прыжками и гравитацией мы освоились, теперь научимся ходить-бродить!

Надеюсь вы еще не забыли, что направление у нас зависит от отрицательного или положительного значения? Есть такая штука в Input как get_axis, где мы задаем две клавиши. Нажатие первой клавиши прировняет переменную к значению -1, нажатие второй клавиши наоборот к 1. Если ни одна из клавиш не нажата, переменная принимает значение 0.

Создаем переменную input_axis внутри physics_process, на этот раз через var, ведь она будет менять свои значения в процессе. А далее задаем машине установку "Если нажата одна из двух клавиш, то мы меняем значение по оси X в зависимости от выбранного направления".

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

Начальная точка - velocity.x

Конечная точка - наша скорость SPEED помноженная на направление (-1 или 1)

Промежутки - наше ускорение ACCELERATION помноженное на время между кадрами delta

if input_axis !=0 :
velocity.x = move_toward(velocity.x, SPEED * input_axis, ACCELERATION * delta)

Первые попытки освоить движок Godot - делаем простой платформер Gamedev, Разработка, Инди игра, Программирование, Программист, Инди, Python, Godot, Godot Engine, Новичок, Код, Разработчики игр, Игровой движок, Платформер, IT, Unity, Unreal Engine, Длиннопост

Вот наш код...

Первые попытки освоить движок Godot - делаем простой платформер Gamedev, Разработка, Инди игра, Программирование, Программист, Инди, Python, Godot, Godot Engine, Новичок, Код, Разработчики игр, Игровой движок, Платформер, IT, Unity, Unreal Engine, Длиннопост

А вот признаки жизни... беги Форест - БЕГИ!

Двигаться мы можем, а вот с остановкой проблема. Что не дает нам вечно кататься по земле? СИЛА ТРЕНИЯ!

Для того чтобы создать силу трения мы делаем похожую функцию. Только теперь конечной точкой у нас выступает 0, а вместо ACCELERATION берем параметр FRICTION. Включается все когда мы не нажимаем кнопки движения, то есть input_axis равен нулю.

if input_axis == 0 :

velocity.x = move_toward(velocity.x, 0, FRICTION * delta)

Первые попытки освоить движок Godot - делаем простой платформер Gamedev, Разработка, Инди игра, Программирование, Программист, Инди, Python, Godot, Godot Engine, Новичок, Код, Разработчики игр, Игровой движок, Платформер, IT, Unity, Unreal Engine, Длиннопост
Первые попытки освоить движок Godot - делаем простой платформер Gamedev, Разработка, Инди игра, Программирование, Программист, Инди, Python, Godot, Godot Engine, Новичок, Код, Разработчики игр, Игровой движок, Платформер, IT, Unity, Unreal Engine, Длиннопост

Бегаю, никого не трогаю... к земле притягиваюсь во время прыжка...

Вишенкой на торте внутри физической функции является move_and_slide которая и отвечает за все эти процессы. Без нее указанные выше шаманские обряды просто не запустятся.

Получился максимально простой гоблинский платформер. Конечно, это пока сложно назвать игрой... но оно работает во славу Горка и Морка! В данном посте я рассказал лишь основы изученного, благо материал заготовлен почти на месяц вперед.

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

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

P.S.

Вот так полностью выглядит код управления персонажем, если кому то нужно для ознакомления.

Первые попытки освоить движок Godot - делаем простой платформер Gamedev, Разработка, Инди игра, Программирование, Программист, Инди, Python, Godot, Godot Engine, Новичок, Код, Разработчики игр, Игровой движок, Платформер, IT, Unity, Unreal Engine, Длиннопост
Первые попытки освоить движок Godot - делаем простой платформер Gamedev, Разработка, Инди игра, Программирование, Программист, Инди, Python, Godot, Godot Engine, Новичок, Код, Разработчики игр, Игровой движок, Платформер, IT, Unity, Unreal Engine, Длиннопост

Традиционный тематический гоблин в конце!

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

Нейросеть Яндекса переводит и озвучивает видео с английского (и не только) на русский

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

Может это бич нашего поколения и мы правда разучились внятно воспринимать текстовую информацию, а может авторы туториалов не могут доходчиво объяснить некоторые детали. Факт в том, что по видео обучаться (лично мне уж точно) в разы проще. Однако видео на русском языке по Godot не шибко много...

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

Именно тут на помощь приходит новая нейросеть от Яндекса, которая переводит и озвучивает видео в режиме онлайн.

Нейросеть Яндекса переводит и озвучивает видео с английского (и не только) на русский Программирование, Разработка, Программист, Яндекс, Нейронные сети, Искусственный интеллект, Переводчик

Как это работает?

Для начала вам нужен Яндекс Браузер, через него включаем желаемое видео и нажимаем на появившуюся кнопку перевода.

- Сначала система распознает речь и проводит транскрибацию (перевод из видео/аудио в текст);

- Далее весь этот текстовый жмых скармливается другой нейронке - она делает его более читаемым и понятным;

- Следующая нейронка создает по данному тексту озвучку, сверяя паузы и скорость с оригиналом на видео;

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

Первые впечатления

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

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

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

P.S.

Через расширение можно использовать не только в ЯБ, но и на других браузерах: https://github.com/ilyhalight/voice-over-translation

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

Да начнется срач... что легче в освоении и больше подходит для 2D проекта? Unity VS Godot !!!

Да начнется срач... что легче в освоении и больше подходит для 2D проекта? Unity VS Godot !!! Разработка, Gamedev, Программирование, Инди игра, Программист, Unity, Godot, Игровой движок, Опрос, IT, Инди

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

Моя задумка подразумевает под собой 2D проект и именно в этом поле про Unity дурная молва. Одни говорят, что 2D там реализовано через костыли, другие ссылаются на громоздкость проектов и итоговой игры, а так же долгие загрузки.

Когда начинаешь искать альтернативу, вторым по популярности часто выступает Godot. Судя по отзывам, с 2D проектами он работает шустрее чем Unity, хотя из минусов отмечают сравнительно меньшее количество обучающей информации на русском языке.

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

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

P.S. В комментариях оставлю два ответа - Godot и Unity, ставьте плюсик тому который поддерживаете.

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

Продолжаю экспериментировать в C# - программа для игры в 21 (очко)

Продолжаю экспериментировать в C# - программа для игры в 21 (очко) Программист, Разработка, Gamedev, IT, Инди игра, Инди, Код, Csharp, Игры, Карты, Игральные карты, Длиннопост

Пока в курсе идут простые задания, я экспериментирую и умышленно усложняю себе задачу. Недавно наткнулся в Play Market на интересную игру Void Tyran, боевая механика данного рогалика завязана на игре в "очко".

Для тех кто не знает, 21 или "очко" - это карточная игра. Суть в том, что игроки поочереди берут карты, накапливая очки. Задача - набрать 21 или близкое к нему значение, но никак не больше - иначе проигрыш.

Так же и в Void Tyran, только вместо 21 стоит 12, а колода представляет из себя 24 карты (по 4 карты каждого значения от 1 до 6). Оба участника боя поочередно вытягивают карты из своей колоды накапливая очки, а когда оба решают остановиться - идет сравнение их результатов. Например, вы остановились на 11, а соперник на 8 - разница ровна 3 очкам. Значит, вы наносите по противнику три удара.

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

Продолжаю экспериментировать в C# - программа для игры в 21 (очко) Программист, Разработка, Gamedev, IT, Инди игра, Инди, Код, Csharp, Игры, Карты, Игральные карты, Длиннопост

Void Tyran - геймплей

Игра зацепила и я решил повторить ее механику на C#, но для начала нужно сделать базу игры в "очко" до 12. Для начала накидал простой алгоритм, который дает игроку выбор - сделать бросок или остановиться.

Продолжаю экспериментировать в C# - программа для игры в 21 (очко) Программист, Разработка, Gamedev, IT, Инди игра, Инди, Код, Csharp, Игры, Карты, Игральные карты, Длиннопост

База для игры в "очко"

Однако игра не имела смысла, потому что противник продолжал бросать пока не проиграет. Нужно "научить" его принимать решение, стоит ли останавливать выдачу или нет.

Шанс проиграть появляется в тот момент, когда сумма очков больше шести. Чем выше данный шанс, тем больше становится вероятность, что противник решит остановиться. Таким образом на 7-8 очках, он в большинстве случаев продолжит играть, но на 9-11 очках наверняка остановит свои броски.

Продолжаю экспериментировать в C# - программа для игры в 21 (очко) Программист, Разработка, Gamedev, IT, Инди игра, Инди, Код, Csharp, Игры, Карты, Игральные карты, Длиннопост

Противник поднял лапки и остановился

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

Продолжаю экспериментировать в C# - программа для игры в 21 (очко) Программист, Разработка, Gamedev, IT, Инди игра, Инди, Код, Csharp, Игры, Карты, Игральные карты, Длиннопост

Победа!

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

Конечно, в консоли это выглядит не так впечатляюще, но сам алгоритм работает, а это значит что я уже не такой криворукий. В следующий раз попробую реализовать данную систему в GDevelop или Godot.

Низкий гоблинский поклон всем кто дочитал до конца статьи! Если вам интересно наблюдать за развитием новичка (или посмеиваться над банальными ошибками) - подписывайтесь на мой блог!

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

Продолжаем изучать С# - даже калькулятор имеет свои нюансы

Продолжаем изучать С# - даже калькулятор имеет свои нюансы Программист, Программирование, Разработка, Gamedev, Инди, Indiedev, Инди игра, Код, Калькулятор, Csharp, Длиннопост

Классическое задание при изучении языка программирования - написать на нем калькулятор. И вот вроде все просто, сделай переменные для вводимых данных и добавь выбор операции. Реализовать все это можно через if - else или switch. Но есть пара нюансов...

Продолжаем изучать С# - даже калькулятор имеет свои нюансы Программист, Программирование, Разработка, Gamedev, Инди, Indiedev, Инди игра, Код, Калькулятор, Csharp, Длиннопост

Вариант работающий на switch

Продолжаем изучать С# - даже калькулятор имеет свои нюансы Программист, Программирование, Разработка, Gamedev, Инди, Indiedev, Инди игра, Код, Калькулятор, Csharp, Длиннопост

Вариант работающий на if - else

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

Продолжаем изучать С# - даже калькулятор имеет свои нюансы Программист, Программирование, Разработка, Gamedev, Инди, Indiedev, Инди игра, Код, Калькулятор, Csharp, Длиннопост

Вундервафля try - catch

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

В try мы помещаем данные для проверки, а в catch порядок действий при обнаружении исключения. В нашем случае мы выводим сообщение что пользователь ошибся и при помощи continue запускаем цикл по новой, минуя остальные операции.

Продолжаем изучать С# - даже калькулятор имеет свои нюансы Программист, Программирование, Разработка, Gamedev, Инди, Indiedev, Инди игра, Код, Калькулятор, Csharp, Длиннопост

Если бы оператор continue был человеком...

Но даже если мы ввели корректные числа, математика вновь может нагнуть нас. Напомню, что на ноль делить нельзя, но при этом его можно ввести как одну из переменных. Всего одна молитва Горку и Морку в виде if - else все исправляет...

Продолжаем изучать С# - даже калькулятор имеет свои нюансы Программист, Программирование, Разработка, Gamedev, Инди, Indiedev, Инди игра, Код, Калькулятор, Csharp, Длиннопост

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

Так как я еще только в начале пути программиста, а пощупать разработку игр уже хочется, я решил параллельно с освоением C# познакомиться с движками работающими по принципу no code. Пока что мой гоблинский взор пал на GDevelop и в ближайшее время я выложу первые впечатления.

Низкий гоблинский поклон всем кто дочитал до конца статьи! Если вам интересно наблюдать за развитием новичка (или посмеиваться над банальными ошибками) - подписывайтесь на мой блог!

Продолжаем изучать С# - даже калькулятор имеет свои нюансы Программист, Программирование, Разработка, Gamedev, Инди, Indiedev, Инди игра, Код, Калькулятор, Csharp, Длиннопост
Показать полностью 6

Когда один мелкий косяк руинит тебе весь код

Когда один мелкий косяк руинит тебе весь код IT, Разработка, Gamedev, Компьютерные игры, Программирование, Программист, Python, Unity, Инди, Инди игра, Веб-разработка, Разработчики, Разработчики игр

А если серьезно, если бы не лист ошибок - я бы дальше первых уроков из курса не ушел из-за своей невнимательности. Хвала Горку и Морку, что данная вафля исправно помогает таким новичкам как я!

Как там изучение C# продвигается?

Как там изучение C# продвигается? Разработка, Стратегия, Программирование, Gamedev, Программист, Программа, Языки программирования, Csharp, Длиннопост

День 1

Вводный урок с объяснением возможностей языка и порядком установки Visual Studio. Следуя своей гоблинской натуре побежал вперед паровоза и забыл установить компонент для работы с NET.

Посмотрел на интерфейс, понял что пока ни черта не понимаю, помолился Горку и Морку, крикнул WAAAGH и продолжил изучение. Впитал базу про структуру проекта и типы данных, благо данные понятия уже были известны после JavaScript и Python.

День 2

Подробно разобрали типы данных и их обозначение в языке C#. Это конечно весело и круто что их так много, но похоже в ближайшее время будем использовать только int, string и bool. Поигрался с вводом/выводом гоблинских мудростей в консоль и базовыми математическими операциями.

Как там изучение C# продвигается? Разработка, Стратегия, Программирование, Gamedev, Программист, Программа, Языки программирования, Csharp, Длиннопост

На самом деле надо, а потому продолжаем...

День 3

Познакомился с типами конвертации, в целом удобно. А вот дальше пошел мимо курса изучать самостоятельно операции с if - else и классом Random. В прошлом посте я рассказывал о боевой системе схожей с дуэлями в Crusader Kings и данные операции нужны мне для ее реализации.

День 4

Опираясь на алгоритм, что до этого был испытан на Python, начал писать боевую систему уже на C#, попутно внося коррективы.

На Python ранения просто изменяли итоговые параметры здоровья и доблести (подобнее о системе в прошлом посте). Однако, по задумке ранения будут оставаться и после боя, каждое имеет свой срок заживления.

Для хранения информации о ранениях я создал три массива:

- Текстовое имя ранения

- Штраф доблести

- Штраф к здоровью

И в этом была моя ключевая ошибка... я создал МАССИВЫ, а в них нельзя добавлять больше элементов, чем заданно изначально. Снова поторопился и накосячил потакая своей гоблинской натуре, что поделать. В итоге узнал, что помимо массивов в C# есть списки и стал изучать класс List.

Заменив все три массива на списки я решил проблему и оно запустилось! ХВАЛА ГОРКУ И МОРКУ, WAAAGH!

Итог

Пока что мне в кайф изучать новый язык и экспериментировать. Как минимум я уже начинаю понимать возможности для различных игровых механик.

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

Если тебе интересно наблюдать за развитием новичка в GameDev (или смеяться) - подписывайся на мой блог Goblin Cave!

Как там изучение C# продвигается? Разработка, Стратегия, Программирование, Gamedev, Программист, Программа, Языки программирования, Csharp, Длиннопост
Показать полностью 2
Отличная работа, все прочитано!