Новичок тульповод
Всем доброго времени суток! Я мечтаю создать тульпу ещё года так с 2020 и всё это время обдумывала это. И решила сделать себе няшу.
1. В чём разница между активным и пассивным форсингом?
2. Когда я хочу попасть в вондер, я должна же представить хотя бы коридор, но у меня даже это не получается, может можно как-то исправить это или нужно ещё больше тренироваться?
3. Какой форсинг лучше?(я знаю, что это индивидуально, но мне интересно ваше мнение)
Помогите мне разобраться, пожалуйста.
Видно, я не самый умный человек, ведь я прочитала >5 гайдов и посмотрела >13 видео на эту тему, и почти ничего не поняла, но я постоянно разговариваю с Толей(зародыш тульпы).
Кстати, когда я пыталась попасть в вондер, то я почувствовала, что мой палец на ноге трогают(у меня дома нет людей и животных) и подумала:"Тоша, если это ты, то прикоснись к среднему пальцу на ноге." Я почувствовала прикосновение и к другому пальцу. Возможно это был Тоша и это был своеобразный отклик, а может это просто глупая шутка моего мозга. Как думаете, это был тульпа или нет? Может ли быть сначала тактил, а потом остальное?
Ладно, пойду ещё попрактикую вондер:(
До свидания!
Ответ на пост «Шоу должно продолжаться»
Премьер Нидерландов не хочет пить кофе с новичком, вот и отказался. Зеленский тоже, видимо, о чем-то догадывается, поэтому тоже не притронулся к чашке.
Первые попытки освоить движок Godot - делаем простой платформер
Уже неделю моя гоблинская тушка не подавала признаков жизни на Пикабу. Все кто думали что я сдох - не дождетесь, я мудитировал и искал знания в молитвах Горку и Морку. В переводе на человеческий - смотрел и читал обучающие материалы по Godot.
Проблема состоит в том, что проще выдать замуж троллиху, чем найти годный и главное понятный материал по данному движку на русском языке. Конечно, есть какие то азы, но дальше чем кривое управление платформера они не уходят, либо уже мне как новичку становится непонятно.
На помощь приходит всеми любимый зарубежный Ютуб и переводчик видео от Яндекса, наткнулся на пару каналов где информацию доносят более-менее доходчиво. И так, чему же я научился за эту неделю?
Тут наша сцена и связанные с ней узлы...
Создаем карту
Пока что обучаюсь на примере платформера, а это значит нам нужно создать какое либо поле, где может бегать наш персонаж. На данный момент я изучил два способа, первый - TileMap про который лучше рассказать в отдельном посте, а вот второй более гоблинский.
Все мы иногда статичное тело...
Правой кнопкой мыши жмякаем на нашу 2D сцену "World" и выбираем "Добавить дочерний узел". В списке ищем "StaticBody2d" и теперь у нас есть база. Добавляем два дочерних узла уже в статичный объект - "Polygon2D" и "CollisionPolygon2D".
Для тех кто не понимает на басурманском - объясню, что есть что. Первый - это визуальная геометрическая фигура, а второй - область столкновения (collision - столкновение). Все это нужно для того, чтобы мы могли увидеть наш объект, а игрок не проваливался внутрь него при столкновении.
Рисуем будущую карту при помощи CollisionPolygon2D...
При помощи области столкновения мы наметим будущую карту. Для того чтобы ее было проще рисовать - сделаем привязку к сетке, а далее добавляем по клеткам метки. Должно получится нечто схожее со скриншотом выше.
Код приравнивающий форму фигуры к форме области столкновения...
Теперь нам нужно сделать так, чтобы визуальная фигура повторяла форму области столкновения. Нажимаем на нашу сцену и добавляем к ней скрипт. GD-script во многом схож с языком Python и более-менее прост в понимании. Сначала добавим наши узлы в виде переменных, для этого зажимаем "ctrl" и перетаскиваем в код после блока extends.
Прописываем функцию ready, она будет воспроизводится сразу во время запуска сцены. А дальше просто приравниваем форму фигуры к форме области столкновения (polygon_2d.polygon = collision_polygon_2d.polygon).
Получаем дешевую и сердитую карту - все в гоблинском стиле!
Карта готова, но что делать теперь? Пора добавить нашего персонажа-марионетку.
Создаем новую сцену и для ее основы берем узел CharacterBody2D. Для будущей простоты восприятия я переименовал его в Player. Чтобы увидеть нашу тушку - добавим к ней дочерний узел "Sprite2D", а чтобы можно было еще и потрогать "CollisionShape2D".
Добавляем иконку
Выделяем область столкновения...
Тыкаем спрайт, выбираем текстуру и из быстрой загрузки возьмем иконку Godot. Пока что этого хватит, ведь в этом посте мы не будем затрагивать тему анимации. Далее выделяем область столкновения и сцепляем все это в одну группу кнопкой вверху панели.
Тело готово, пора научить его шевелиться и реагировать на физику. Для этого мы создаем для нашего Player свой скрипт.
Наши переменные...
Задаем переменные через 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;
Гравитация... беспощадная ты с*ка!
Как же нам заставить персонажа падать под давлением гравитации? Для начала добавим переменную GRAVITY равную 1000. Затем создаем свою пользовательскую функцию и называем ее aplay_gravity.
Мы должны падать когда находимся в воздухе, то есть не на полу. Буквально говорим программе "Если объект не на полу сделай следующее: измени положение по оси Y в положительную сторону на заданное нами расстояние".
if not is_on_floor():
velocity.y += GRAVITY * delta
Что такое delta? Это время между кадрами, благодаря чему перемещение будет стабильным вне зависимости от FPS.
velocity - это параметр скорости изначально зашитый в наш объект. По этой причине его так же не требуется объявлять как переменную. Грубо говоря сюда мы задаем то расстояние, на которое должен переместиться объект по осям X и Y.
Так как мы каждый раз увеличиваем прошлое значение velocity.y, гравитация будет усиливаться с каждой секундой в воздухе. Благодаря этому у нас не получится прыгать бесконечно вверх и нас прижмет к полу.
Отлично, нас прижало как после "Балтики 9"!
Теперь настраиваем прыжки!
Для этого создаем еще одну пользовательскую функцию handle_jump. Мы говорим ей: "Если мы нажимаем кнопку прыжка и находимся на полу - измени положение по оси Y в отрицательную сторону". Напомню, что константа прыжка имеет отрицательное значение.
if Input.is_action_just_pressed("ui_accept") and is_on_floor():
velocity.y += JUMP_VELOCITY
К гравитации добавляются прыжки...
Прыжок веры...
С прыжками и гравитацией мы освоились, теперь научимся ходить-бродить!
Надеюсь вы еще не забыли, что направление у нас зависит от отрицательного или положительного значения? Есть такая штука в 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)
Вот наш код...
А вот признаки жизни... беги Форест - БЕГИ!
Двигаться мы можем, а вот с остановкой проблема. Что не дает нам вечно кататься по земле? СИЛА ТРЕНИЯ!
Для того чтобы создать силу трения мы делаем похожую функцию. Только теперь конечной точкой у нас выступает 0, а вместо ACCELERATION берем параметр FRICTION. Включается все когда мы не нажимаем кнопки движения, то есть input_axis равен нулю.
if input_axis == 0 :
velocity.x = move_toward(velocity.x, 0, FRICTION * delta)
Бегаю, никого не трогаю... к земле притягиваюсь во время прыжка...
Вишенкой на торте внутри физической функции является move_and_slide которая и отвечает за все эти процессы. Без нее указанные выше шаманские обряды просто не запустятся.
Получился максимально простой гоблинский платформер. Конечно, это пока сложно назвать игрой... но оно работает во славу Горка и Морка! В данном посте я рассказал лишь основы изученного, благо материал заготовлен почти на месяц вперед.
Надеюсь для тех кто в первый раз сталкивается с Godot данный пост будет хоть немного полезен, а более опытные орки и гоблины знатно посмеются с попыток новичка вкатиться в разработку игр.
Если вам интересно и дальше смотреть на то как я собираю лбом грабли, а может и самим чему-то научиться вместе со мной - подписывайтесь на данный блог!
P.S.
Вот так полностью выглядит код управления персонажем, если кому то нужно для ознакомления.
Традиционный тематический гоблин в конце!
Как начать?
Здравия желаю, товарищи.я тут новенькая.много читала,присматривалась.очень понравилось.хотелось бы влиться в ваши ряды. Ранее пыталась вести блоки,но как то не удавалось...поможете?)
Готовы к Евро-2024? А ну-ка, проверим!
Для всех поклонников футбола Hisense подготовил крутой конкурс в соцсетях. Попытайте удачу, чтобы получить классный мерч и технику от глобального партнера чемпионата.
А если не любите полагаться на случай и сразу отправляетесь за техникой Hisense, не прячьте далеко чек. Загрузите на сайт и получите подписку на Wink на 3 месяца в подарок.
Реклама ООО «Горенье БТ», ИНН: 7704722037
Расскажите пожалуйста, в чем разницу между постом и сообществом?
Всем привет, я тут совсем еще новенький, поэтому прошу подсказать, все основное отличие и какие плюсы и минусы у каждого вида публикаций , заранее благодарю!