очень жаль, что уроки набирают так мало просмотров, они правда хорошие, очень понятные. спасибо большое GameCrafter, за такой хороший курс по годоту, планирую проходить до конца, ведь инфоомации много и легко усваивается. еще раз спасибо и удачи в продвижении
@user-le3wb7mn1g6 ай бұрын
Полностью согласен! Иду до конца!
@tvoysunboy81122 ай бұрын
Спасибо за ещё один урок! Очень интересно и понятно!
@GydLis Жыл бұрын
Видео как всегда класс, жалко времени стало мало из-за дел, но постараюсь успевать за уроками жду следующего
@GameCrafter_GD Жыл бұрын
Спасибо! Надеюсь что ты все успеешь)
@112amper10 ай бұрын
Большое спасибо за видео!) Возможно кому-то пригодится: Ни в какую не хотел работать разворот, хотя сделал точно по уроку. Оказалось - корневые ноды "Mobs" и "Player" должны быть размещены по нулевым координатам - так как координаты (self.position и др.) считаются относительно родительских нод, (которые в данном случае те самые корневые), и если они будут фиг знает где, то и координаты будут фиг знает какие, и логика не будет работать правильно.
@GameCrafter_GD10 ай бұрын
Спасибо за объяснение, как выяснилось это самая популярная проблема у начинающих))
@Mrkhamzat7 ай бұрын
Пожалуйста по подробнее где именно написать нулевые коор
@roenrock30937 ай бұрын
как поправить?( не могу понять
@aaaa-zz6ri7 ай бұрын
@@roenrock3093 На сам Нод (Node2D) в котором находиться CharacterBody2D Игрока или Гриба - клацнуть и справа будет вкладка Transform и в Position поставить ноль в X и Y после чего перетащить обратно к тайлам земли уже не сам нод, а именно CharacterBody2D. У самой такая же проблема была и пару дней не могла догадаться заглянуть в комментарии -~-
@yngtrxsh2 ай бұрын
что значит по нулевым координатам🥲 я не понимаю, в центре типо?
@kanstantsinnegotski845010 ай бұрын
Супер! Спасибо за уроки!
@GameCrafter_GD10 ай бұрын
Спасибо 👍
@mrdixioner11 ай бұрын
1. Поворот узла не очень элегантное решение, лучше использовать отрицательное значение масштаба, и тогда код будет выглядеть так: if direction.x
@GameCrafter_GD11 ай бұрын
Спасибо за конструктив, насчет поворота узла, это на случай если у кого то игра top down, тогда как мне кажется rotation имеет смысл. А что касается стейтов гриба, это не конечный вариант, еще буду переделывать)
@lilqnzАй бұрын
@@GameCrafter_GD столкнулся с тем, что у меня изначально АттакДирекшн смещен относительно оси. от чего поворот на 180 градусов приводил к тому, что инвертированная зона КолижнШейп приходилась "над" грибом, что не есть гуд. так что все же $AttackDirection.scale.x = -1 практичнее воизбежание таких багов
@nicasmirnovaaАй бұрын
Большое спасибо за видео!!
@user-hi1ty4zw4l11 ай бұрын
Большое спасибо тебе за уроки, даже не знаю сколько бы времени пришлось искать всю эту информацию которую ты рассказываешь в своих видео. Но у меня тут возникла проблема, и совсем не могу понять в чём проблема, когда я сделал поворот врага в сторону игрока, то получается так что когда игрок справа от врага и входит в зону его атаки, то враг совершает атаку а затем поворачивается налево, хотя игрок стоит всё так же справа, и когда игрок отходит вправо, то уже так враг поворачивается вправо, а если игрок потом с этого момента идёт налево, то враг поворачивается налево, хотя игрок относительно врага стоит справа. У мня словно центр Area2D находится сбоку от центра врага, но нет, всё стоит как надо, и даже если передвинуть цент то всё остаётся так же как и было. У меня кстати эта же проблема не в новинку, точно таже проблема была еще на 5 уроке, когда добавляли скелета в игру, там была та же проблема, если игрок относительно врага слева, то всё хорошо, враг бежит влево с нормальной скоростью, но если встать рядом с врагом справа, то враг побежит налево, а если быть справа от врага но чуть дальше, то враг бежит направо, но это происходит чертовски медленно. Буду очень благодарен если знаешь как решить это
@GameCrafter_GD11 ай бұрын
Привет, спасибо за добрые слова) насчет проблемы, похожая уже встречалась у других, скорее всего мог сместиться один из под нодов например mobs, и в годот работает так что все его дочерние ноды будут определять свои координаты уже не относительно центра всей игры, а относительно центра родительских нодов. В телеграм группе я скидывал видео с объяснением для одного из участников) надеюсь помог
@user-hi1ty4zw4l11 ай бұрын
@@GameCrafter_GDи правда помогло, я бы даже и не подумал на это, спасибо за помощь)
@GameCrafter_GD11 ай бұрын
@@user-hi1ty4zw4l 👍
@user-wh1fq3wl8f7 ай бұрын
Ох, почему-то для меня этот урок оказался сложным, но я его осилил. Идем дальше.
@user-ng7kv7mq3e5 ай бұрын
У меня крашится вся игра, когда гриб пытается совершить второй удар. Произошло это после введения глобального скрипта. Пересмотрел весь урок и всё перепроверил. Впечатление, что проблема в попытке переключится на disabled, или ещё в чём то. Может у кого-то есть предположения?
@AbDyllax_Wblmwek2 ай бұрын
У меня такое же было, но когда после normalized я поставил () то все заработало, проверьте это. Если не помогло то я не знаю. Надеюсь это вам поможет. Если что в коде автор написал этот момент на 22:53
@user-bk6jw6pp4z2 ай бұрын
У меня тоже самое, вы нашли решение проблемы?
@user-ub4ye6vq2jАй бұрын
Если у трёх человек такое - значит реально есть проблема в коде))
@dmitriygilyov3529 ай бұрын
спасибо за видео, лайк
@GameCrafter_GD8 ай бұрын
Спасибо большое
@ilyafunny8 ай бұрын
Привет! Спасибо за уроки. Но, у меня возникла проблема с разворотом. Godot пишет мне Invalid operands "Nill" and "Vector2" in operator "-". В строчке "direction = (player - self.position).normalized()". Не могу понять в чем проблема
@ninjafort8067 ай бұрын
ты забыл написать вектор. direction.x=...
@user-mu6zk1tn7l6 ай бұрын
у меня такая же проблема, не понимаю в чем дело
@this_is_happy2976 ай бұрын
Добавляюсь. Тоже не понимаю в чём проблема
@this_is_happy2976 ай бұрын
@@ninjafort806человек опустил код, на который не ссылается отладчик с ошибкой. Проблема в этой строке, а именно в том, что player = null (в годоте nil), но вот почему он null - вопрос открытый
@this_is_happy2976 ай бұрын
Моя первая догадка подтвердилась - опечатка. Годот, предатель, не подсвечивает некоторые из них. В моём случае у меня была опечатка в _on_player_position_update, там, где она представлена как func. У меня было _on_player_postion_update. Подозреваю, что подобная проблема и у вас, и оно не мудрено. Подсветки нет. Название длинные и на неродном языке.
@rushnfury10 ай бұрын
Я придумал еще вариант как можно сделать атаку гриба. Сделать два сигнала - один на вход в зону атаки, гриб получает статус attack, на выход из зоны атаки получает статус idle. В attack_state() бесконечный цикл, в нем проверка если статус == attack, то проигрывается анимация атаки с ожиданием окончания анимации затем проигрывается idle c задержкой 1 сек, иначе - выход из цикла.
@GameCrafter_GD10 ай бұрын
Спасибо за комментарии! 👍
@rushnfury2 ай бұрын
@@alexgall4823 Я могу подсказать но к сожалению не раньше выходных.
@f1x_my_power Жыл бұрын
Классные уроки! А в дальнейшем планируются обучающие видео по 3д в Godot?
@GameCrafter_GD Жыл бұрын
Спасибо! Когда нибудь возможно будет 3д, но не в ближайшее время
@Axil-ww10 ай бұрын
Просто в настоящей стейт-машине, в каждом стейте должно быть несколько функций. Функция включения стейта - когда ему передают управление, чтобы он что-то проинициализировал или сделал один раз в начале, функция обновления (process или update) и функция отключения стейта, чтобы он за собой что-то убрал если нужно.
@GameCrafter_GD10 ай бұрын
Да есть такое) вот думаю может опять чутка переделать под finite state machine
@Axil-ww10 ай бұрын
@@GameCrafter_GD Этот язык по сути это python, а значит можно пользоваться всеми его прелестями. Я сделал стейт-машину на основе словаря. var stateMachine = { "IDLE": { "enter": EnterState_Idle, "process": ProcessState_Idle, "exit": ExitState_Idle}, "CROUCH": { "enter": EnterState_Crouch, "process": ProcessState_Crouch, "exit": ExitState_Crouch }, Где значения это готовые функции, которые можно вызвать .call(). func SetState(newstate): state["exit"].call() state = stateMachine[newstate] state["enter"].call() А потом где-то в коде SetState("CROUCH") Конечно лучше пользоваться enum вместо строчек, но так нагляднее. var state = stateMachine["IDLE"] func _ready(): SetState("IDLE") func _physics_process(delta): state["process"].call(delta) - вызовет ProcessState_Idle(delta)
@spoilsportXD5 ай бұрын
@@GameCrafter_GD привет, подскажи откуда берешь необходимую информацию по геймдеву? Виды конечных автоматов не самое очевидное как мне кажется для изучения. Может быть есть какой то базис откуда черпаешь и идешь изучать?)
@artur1772 Жыл бұрын
Спасибо Отличные видео!!!!!
@GameCrafter_GD Жыл бұрын
Очень рад! 👍
@DeLovichАй бұрын
У меня вообще не хочет поворачиваться моб. Как я понял он почему-то не переходит в состояние chase, хотя я все делал как в видео. Можете подсказать в чем проблема?
@thelevan4ik2 ай бұрын
мне интересно где-то исходный код найти можно, потому что часть с игроком связанным с его состояниями конкретно увеличилась, появились новые состояния вот только что за состояния что они делают и т.д. нету
@MIFI4ek29 күн бұрын
11 урок 11 тыс просмотров 11 мес назад
@geralt33538 ай бұрын
Так как слаб в программировании, то тяжело вникать) Но спасибо большое за урок. Подскажи пожалуйста, у меня всё работает ок, и код точно такой же, но после того как отхожу от врага после его атаки IDLE перестаёт проигрываться пока к нему снова не подойдёшь, никак не могу понять что именно упустил
@user-gh4zo6gw5v11 ай бұрын
Я тут начал заниматься игрой по твоему гайду и возник такой вопрос. Как мне определить где середина экрана (окна) на котором уровень. Дело в том что, когда создаю кнопки меню я не уверен что они находиться друг под другом и строго по центру. В android studio при перемещении какого либо вью (если оно пересекает центр по горизонтали или вертикали) это показывается с помощью линий. Здесь не нашел нигде такого
@GameCrafter_GD11 ай бұрын
Я в 20 уроке об этом рассказывал, в инспекторе справа есть вкладка layout, там можно якорь установить по центру, но если не ошибаюсь не у всех нодов есть этот параметр, но у тех что связаны с UI точно должен быть
@matyuioprs98316 ай бұрын
Автор: скинь пожалуйста весь код просто у меня почему-то вылетает после того как моб атакует😢
@user-io6jp1up9c6 ай бұрын
Для тех кто тоже столкнулся с вылетами на атаке. $AttackDirection/AttackRange/CollisionShape2D.set_deferred("disabled", true) $AttackDirection/AttackRange/CollisionShape2D.set_deferred("disabled", false)
@user-ng7kv7mq3e5 ай бұрын
@@user-io6jp1up9c не сработало(
@gemogen4ik9197 ай бұрын
у кого была проблема что моб не перезапускает атаку а бьет 1 раз и надо заного зайти в зону , скрипт написал но все так же , он не следит за игроком и бьет его только 1 раз
@ninjafort8067 ай бұрын
проверь цикличность анимации
@gemogen4ik9196 ай бұрын
я полностью переписал скрипт персонажа и все норм @@ninjafort806
@sassas143311 ай бұрын
Хороший урок, только отключать и включать коллизию чтобы поймать повторно плеера это какой то костыльный метод. Скорее всего есть красивое и правильное решение этой задачи. Не знаком с особенностями движка, но вот первое что пришло в голову: завести флаг у гриба ПлеерВЗонеАтаки и присваивать true когда он первый раз будет обнаружен и скидывать флаг, когда он покинет зону. Так себе тоже решение. Кстати задача похожа на погоню скелетом в предыдущих уроках.
@GameCrafter_GD11 ай бұрын
Спасибо за отзыв) но почему ты считаешь этот метод костыльным? Ведь прикольно что можно через анимацию вызывать определенные функции с большой точностью по времени? Но в любом случае если найдешь более правильный способ пожалуйста сообщи, я обязательно исправлю
@sassas143311 ай бұрын
Вызывать функции через анимацию это вообще клёво. Костыль в том что приходится отключать и снова включать коллизию чтобы гриб увидел снова нашего плеера.
@GameCrafter_GD11 ай бұрын
@@sassas1433 надо подумать)
@KsavirResh11 ай бұрын
Согласен, тоже прямо яркое чувство есть, что это выключение-включение это костыль и должно быть элегантное решение. Но пока его не увидел.
@GameCrafter_GD11 ай бұрын
@@KsavirResh все думаем)
@gattar11212 ай бұрын
Нечего не понял но очень интересно и вроде получилось
@VoiceMd10 ай бұрын
ВСЕ КРУТО!!! я все сделал как ты показал в видео, но моб вообще никак на игрока не реагирует, и не останавливается атака моба, что делать?
@GameCrafter_GD10 ай бұрын
Надо смотреть, скинь скрины в телеграмм группе
@VoiceMd10 ай бұрын
@@GameCrafter_GDтелеграмма нету сорри, спасибо что ответил, я попробую исправить ошибку сам
@ХмельнойТанкист10 ай бұрын
У меня была похожая проблема, НПС игрока видел, но атака не останавливалась. Оказывается я забыл убрать в AnimationPlayer зацикливание анимации для "Attack" мобу и скрипт просто не мог пройти дальше "await animPlayer.animation_finished"
@VoiceMd10 ай бұрын
спасибо @@ХмельнойТанкист
@spoilsportXD5 ай бұрын
Почему то мне показалось использование set и get таким образом очень не грамотным. Это реальная практика такого использования или лучше не привыкать так делать и в будущем по другому будем реализовывать этот функционал?) Я объясню - целый функционал перекладывается на инициализацию переменной в зависимости от разных значений. И все бы ничего, но как будто бы для этого нужно создавать функции, передавать в них нужные параметры, а внутри них уже инициализировать переменную и реализовывать логику. Иначе мы даем слишком много контроля переменной, которую может потребоваться поменять в какой то момент, однако она затриггерит отдельный пласт логики.
@spoilsportXD5 ай бұрын
Для себя выделил все таки следующий подход, уверен, что машина состояний в ооп формате более структурно реализуется, но пока что сделал так: func _on_attack_range_body_entered(body): change_state(ATTACK) func change_state(value): state = value match state: IDLE: idle_state() ATTACK: attack_state()
@sedon76 Жыл бұрын
По отдельности все понятно, а вот воспринимать всю картину в целом - тяжко. :-(
@GameCrafter_GD Жыл бұрын
Честно говоря у меня и у самого в голове пока нет четкого понимания какой в итоге будет игра, я просто ставлю перед собой задачу которую сейчас в состоянии сделать и шаг за шагом надеюсь закончить проект)) такие дела 😅
@dreamingMary7 ай бұрын
invalid set index 'rotation_degress' (on base: 'Nod2D') with value of type 'Int"... что это значит, и как это исправить? в самом конце, когда меняем расположение области взаимодействия у гриба!
@loengram7 ай бұрын
Наверное уже поздно, но ты неправильно написал параметр. Ты написал "degress", а правильно "degrees"
@Dmitriy154868 ай бұрын
мне кажется лучше использовать отдельную функцию change_state
@crispanion765011 ай бұрын
Привет! Начал делать игру по твоему гайду, но в этом уроке я заметил, что ты пишешь Signals, а у меня есть только Signal. Как мне решить эту проблему?
@GameCrafter_GD11 ай бұрын
Привет! Signals это название глобального скрипта на который я ссылаюсь, я его сам так назвал, возможно у тебя по другому
@crispanion765011 ай бұрын
@@GameCrafter_GD Спасибо)
@DragonMagic77-eq5ys22 күн бұрын
может кто нибудь подсказать пожалуйста как сформирвать папку scn как в видео, у меня код написан а вот все папки не получается сформировать
@Xawa_official22 күн бұрын
Как я понимаю он просто создал эту папку вручную, когда переделывал всю игру заново. Сделал он это для удобства. Но это лишь моё предположение
@Xawa_official22 күн бұрын
Или ты в целом не понимаешь, как делать папки?
@roblaks3a3169 ай бұрын
фууух, у меня тоде проект сломался я 3 дня его чинил
@GameCrafter_GD9 ай бұрын
Сочувствую)
@Калушонок2 ай бұрын
Govno
@ShortsPoPolochkam2 ай бұрын
По какой-то причине в моём случае не гриб а гоблин не поворачивается в мою сторону, не могу ума приложить почему может такое происходить, плюс годот ругается на функцию func _on_attack_range_body_entered(_body):, работает нормально если пишу func _on_range_body_entered(_body):