Прошлые домены не функционирует! Используйте адрес ARHIVACH.VC.
24 декабря 2023 г. Архивач восстановлен после серьёзной аварии. К сожалению, значительная часть сохранённых изображений и видео была потеряна. Подробности случившегося. Мы призываем всех неравнодушных помочь нам с восстановлением утраченного контента!

Godot #50

 Аноним OP 19/05/24 Вск 14:57:05 #1 №951925 
1716119809281.mp4
1716119809281.mp4
1716119809281.mp4
1716119809281.mp4
Добро пожаловать в юбилейный Godot-тред! Уж теперь-то мы точно сделаем игры!
Шапка: https://hipolink.me/godothread
Предыдущий: >>949247 (OP)
Архивный: >>946416 (OP)
Аноним 19/05/24 Вск 15:34:13 #2 №951929 
>>951925 (OP)
>1
Как это делается?
Аноним 19/05/24 Вск 16:21:29 #3 №951936 
>>951929
Скачиваешь анимацию с миксамо.
Переставляешь рутмовшен на готодовский спецплагином.
Запускаешь и радуешься идеальному соединению стоп с грунтом без скольжения.
Аноним 19/05/24 Вск 17:01:06 #4 №951940 
Дропнул юнити так как с его этим хабом он стал весить как слон. Решил пилить на Годоте 3д игру. Почему все эти инструменты так хотят стать тяжеловесным гавном а игры один хер выходят не очень. Все эти ненужные плагины и перделки из коробки. Юнити пошли похоже путем анрила, надеюсь Годот так и останется легким и приятным инструментом.
Аноним 19/05/24 Вск 17:07:04 #5 №951942 
>>951940
Я тоже надеюсь.
Чётверка слегка пошатнула правда, сильно потяжелела по сравнению с трёшкой.
Аноним 19/05/24 Вск 17:12:13 #6 №951944 
>>951942
К 4.4 обещают снизить размеры.

>>951940
>а игры один хер выходят не очень
Вот ты и пришел к истине. Качественные игры на чем угодно пишутся. Как и некачественные.
Аноним 19/05/24 Вск 17:25:19 #7 №951946 
>>951944
>Качественные игры на чем угодно пишутся

Причем что раньше, что сейчас если руки прямые то могут на в терминалом забабахать игру. Или как те чуваки которые в Excele или блокноте игры пишут. Просто раньше юнити прям легковесный, хороший движок был, запускался с полтычка. Надеюсь сообщество оставит билд Годота в покое.
Аноним 19/05/24 Вск 17:44:38 #8 №951949 
>>951946
Очевидно, что по мере роста мощностей компов сообщества, будут расти и запросы. Всё взаимосвязано.
Аноним 19/05/24 Вск 19:01:23 #9 №951959 
1.mp4
2.mp4
3.mp4
>>951925 (OP)
Это тред аниматоров?
Аноним 19/05/24 Вск 19:31:41 #10 №951962 
1716136300471.png
>>951959
Это тред человеков-оркестров, тянущих в соло весь комплекс работ.
Аноним 19/05/24 Вск 19:59:35 #11 №951965 
image.png
>>951962
Жиза. Но напомню вам пользоваться нейросетями. Помогают в дизайне, создании рефов, в сценарии, даже в музыке.
Аноним 19/05/24 Вск 20:19:08 #12 №951972 
>>951965
Да как ими пользоваться то на нищепека 2013 гв?
Аноним 19/05/24 Вск 20:23:12 #13 №951974 
>>951965
>Но напомню вам пользоваться нейросетями.
Это новая форма ассетфлиперства для кабанчиков.

>Помогают в дизайне
Дизайн "generative AI" похож на сны во время болезни.
>создании рефов
Чтобы у тебя везде лишние пальцы и кривые глаза были?
>в сценарии
Там все сценарии уровня копипаст из /b/, по шаблонам.
>даже в музыке
Копирасты по музыке агрессивнее всех, ради чего рисковать?

Единственное реальное применение LLM я нашёл в эмоциональной поддержке. Чатбот тебя и похвалит, и совет даст по-дружески, всегда готов выслушать и почти всё хорошо понимает, в отличие от тупых мясных мешков. Эмоциональная поддержка инди разработчику-одиночке важнее генерации контента, и в этой сфере мясные мешки давно проиграли компьютеру.
Аноним 19/05/24 Вск 20:32:17 #14 №951975 
>>951972
openai, bing
Аноним 19/05/24 Вск 20:37:18 #15 №951976 
>>951975
Да как ими пользоваться то в "ваш регион не поддерживается"?
Аноним 19/05/24 Вск 20:39:58 #16 №951977 
1716140398081.jpg
>>951974
Двачую!
Аноним 19/05/24 Вск 21:06:01 #17 №951980 
image.png
>>951974
Не, ты не понял. Я не говорю используйте контент нейросетей напрямую. Я говорю пользуйтесь их помощью. Реф - референс - то, по чему ты создаешь свое. Генерируешь 10 пиксель скай-фай медведей, выбираешь лучшие детали, рисуешь своего медведя по мотивам. Имеешь свой общий сценарий - идешь к нейросети прорабатывать диалоги и конкретные моменты, направляешь ее куда тебе нужно. Ты должен указывать нейросети что генерировать, а не она тебе. Только так. Это как обсуждать свои идеи/проблемы с резиновой уточкой, только тут уточка отвечает полезное.
Аноним 19/05/24 Вск 21:26:37 #18 №951982 
i.jpg
>>951976
>ваш регион не поддерживается
Тут с поиском и говнокодом: https://www.phind.com/
Тут чисто общаться по душам: https://old.character.ai/
Других не знаю/не использовал/сдохли/какая-то хрень.

>>951980
>Реф - референс - то, по чему ты создаешь свое.
Проблемы две:
1. Нейронка обучалась на кривых рисульках других художников.
2. Нейронка сильно лажает, а без опыта ты это не замечаешь.
Лучше брать фотки реальной техники, архитектуры, животных и т.п., чем ориентироваться на продукт генерации или даже на чьи-либо рисульки (каким бы гением ни был художник, он обязательно в чём-нибудь лажает). Если тебе нужно накидать 3D пространство для 2D рисунка, по-прежнему лучше кубы в Блендере, т.к. они гарантированно соблюдают все правила перспективы.

Представь себе ситуацию. Ты хочешь нарисовать реку. Но ты никогда не видел в реальной жизни рек и не нашёл фотографий. Ты решил использовать Minecraft, ведь он генерирует огромный мир, в котором реки довольно часто встречаются, да и вообще его серьёзные дяди делали - аж Microsoft выкупил за миллиарды, ну как он может херню генерить? Ты изучаешь реки по референсам из Minecraft, рисуешь их... и получаются плоские полоски воды шириной 10 метров с визуально стоячей водой, огибающей скалы, вытекающей и втекающей в один и тот же водоём без какой-либо причины. Звучит смешно - но только потому что ты наверняка видел реки в реальности или хотя бы на фото. А ведь такая ситуация (копипаста из ненадёжных источников) повсеместно во всём развлекательном контенте, даже у ААА-студий (в проработке автомобилей, оружия и т.п. специфических деталей).
Аноним 19/05/24 Вск 21:28:45 #19 №951983 
>>951976
А это нельзя рассказывать, товарищ майор, как одной кнопкой решить.
Аноним 19/05/24 Вск 21:33:04 #20 №951984 
>>951982
Важно осознавать сильные и слабые стороны инструмента. Я считаю что я на это способен. Я не из тех кто приходит к нейронкам в ожидании что сейчас нейронка заебенит им готовую игру. А ты можешь не пользоваться.
Аноним 19/05/24 Вск 21:35:54 #21 №951986 
>>951984
>Важно осознавать сильные и слабые стороны инструмента.
>приходит к нейронкам в ожидании что сейчас нейронка заебенит им готовую игру
Так ведь тут рекомендуют ВСЕМ: >>951965
>Но напомню вам пользоваться нейросетями. Помогают
Тут не написано "аккуратно пользоваться, понимая все проблемы и недостатки".
Аноним 19/05/24 Вск 21:43:30 #22 №951989 
>>951986
Ты передергиваешь. Рекомендую всем заниматься спортом != рекомендую всем херить свое здоровье на боксерском ринге. Рекомендую всем пользоваться унитазом != голова застряла в сливном бачке. Впрочем, соглашусь что раз тебе нужны детальные инструкции, учитывающие каждый потенциальный подводный камень, то нейронки не для тебя. А то потом будешь жаловаться, что переходя дорогу нейронка не посоветовала тебе посмотреть в обе стороны, и как следствие тебя машина сбила.
Аноним 19/05/24 Вск 21:43:39 #23 №951990 
>>951864 →
>0261-2423.mp4
Есть совет как сделать, чтобы персонаж не топтался на месте лишний раз: нужно абстрагировать контроллер визуальной модели с её анимациями от физического контроллера персонажа. Ты задаёшь вектор движения физическому контроллеру, он двигается по сцене, а визуальный контроллер регистрирует вектор скорости/ускорения и проигрывает нужную анимацию на подходящей скорости. Тогда персонаж не будет топтаться на месте, когда скользит вдоль стены или упирается лбом в препятствие. Также становится проще синхронизировать ноги с полом, потому что визуальная модель точно знает, с какой скоростью и в каком направлении ей идти - движение уже реализовано физическим контроллером и предугадывать ничего не нужно.
Аноним 19/05/24 Вск 21:55:13 #24 №951992 
>>951989
>боксерском ринге
>пользоваться унитазом
>раз тебе нужны детальные инструкции
Мы в треде движка с максимально сниженным порогом входа, в разделе, куда часто заходят полнейшие ньюфаги, по теме, в которой часто встречаются творческие гуманитарии с нулевым пониманием технических вещей. Нейронки даже в 2024 понятны не всем и для простого обывателя не являются чем-то очевидным вроде бокса или унитаза. В связи со всем этим фраза "не забывайте пользоваться нейронками" звучит как жирный троллинг, попытка подорвать начинания конкурентов-новичков, чтобы у них говнокода как можно больше было.

Ты слишком переоцениваешь типичного новичка в геймдеве.
Аноним 19/05/24 Вск 22:04:24 #25 №951993 
image.png
>>951992
По твоей логике и годот советовать не стоит. Ведь есть пикрил, движок с порогом входа даже ниже! А в этом нашем годоте еще печатать самому надо, ууу, троллинг, подрывание конкурентов лол, сложна.
Аноним 19/05/24 Вск 22:08:10 #26 №951996 
>>951986
Хз, где ты увидел что обращаются ко всем. Обращаются к вполне ограниченному кругу "вам".
Аноним 19/05/24 Вск 22:19:37 #27 №952000 
Screenshot25.png
>>951990
Ну то бишь отказаться от рутмоушена в старое доброе скорость движения * скорость анимации. Возможно так и придется, рутмоушен красив, но не везде хорошо играется, особенно в квестах где нужно топать вдоль стены и проживать действие в поиске предметов..
Аноним 19/05/24 Вск 22:20:14 #28 №952001 
И, тем более, в "Помогают" как можно было понять как "делают все за тебя без недостатков".
Не пропускайте таблетки, если вам положено.
Аноним 19/05/24 Вск 22:37:04 #29 №952005 
>>952000
>отказаться от рутмоушена
Если аниматор сделал "вот здесь персонаж прыгает вправо на два метра", тогда с помощью root_motion твой код может синхронно с этой анимацией переместить коллайдер на два метра вправо, если нужно. Короче, когда анимация контролирует физическое поведение персонажа.

Но когда окружающая обстановка влияет на движение персонажа (препятствия, замедление, ускорение, внезапные прыжки и т.д.), ты должен менять поведение модели из кода, а не смотреть на то, что там анимации тебе говорят. Если анимация говорит "прыгни на два метра вправо", а у тебя справа стена через полметра - куда ты прыгнешь? Так и с ходьбой на месте.
Аноним 19/05/24 Вск 22:39:56 #30 №952007 
Похвально, люди начали соглашаться с тем, что я писал пару тредов назад, что рутмошен не панацея и не для всех жанров.
Аноним 19/05/24 Вск 22:58:21 #31 №952012 
animtree15.gif
>>952007
Мне вот больше интересно, для чего/где root_motion необходим.
В официальном туториале он вроде для обычной ходьбы используется.
https://docs.godotengine.org/en/stable/tutorials/animation/animation_tree.html#root-motion
Аноним 19/05/24 Вск 23:08:51 #32 №952013 
>>952012
>This allows animating characters in a way where steps actually match the floor below.
Вот я пробовал, но анимировать персонажа в блендере сложнее, когда двигаешь весь скелет целиком, чем если анимировать только движения ног на месте (или я не понял чего-то). Зная длину шага и сколько длится один цикл анимации (два шага), легко посчитать, с какой скоростью нужно проигрывать анимацию.

Нужно ещё раз глянуть туториалы по анимации ходьбы/бега...

>It also allows precise interaction with objects during cinematics.
Вообще не ясно, зачем это катсценам, если в катсценах нет физики? Если только у кого-то нестандартные катсцены с использованием физики - но тогда высок риск, что всё пойдёт наперекосяк, как в GTA 5, где прохожие избивают сюжетных персонажей прямо в катсцене (лол).
Аноним 20/05/24 Пнд 00:13:35 #33 №952020 
>>952013
У тебя может быть анимация персонажа без объекта, а объект он может поднять в процессе, прицепив к BoneAttachment без всякой физики.
Аноним 20/05/24 Пнд 01:14:21 #34 №952028 
>>952005
> Если анимация говорит "прыгни на два метра вправо", а у тебя справа стена через полметра - куда ты прыгнешь?
У тебя должны быть рейкасты, определяющие окружающую обстановку, и их данные должны учитываться стейтмашиной, и соответственно, если в метре стена, стейтмашина запускает заранее заготовленный аниматором прыжок на метр, или прерывайет двухметровую в метре, миксуя с отскоком или прижатием к стене.

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

>>952007
Никогда не соглашусь. Ты - луддит. Смирись с тем, что старый метод устарел.
Аноним 20/05/24 Пнд 11:25:15 #35 №952052 
>>952028
Так это ты луддит. Рутмошен сам устарел, сейчас мошн матчинг на нейросетях.
Аноним 20/05/24 Пнд 11:42:48 #36 №952054 
>>951959
А как сделать лапшу-стейтмашину как на второй Шебм? Выглядит достаточно удобно. Мне бы пригодилось.
Аноним 20/05/24 Пнд 12:16:02 #37 №952056 
>>952054
Документацию совсем не читал?
https://docs.godotengine.org/en/stable/tutorials/animation/animation_tree.html#statemachine
https://docs.godotengine.org/en/stable/classes/class_animationnodestatemachine.html
Аноним 20/05/24 Пнд 13:08:58 #38 №952071 
>>952028
>соответственно, если в метре стена, стейтмашина запускает заранее заготовленный аниматором прыжок на метр
А в этот момент моб ударил игрока и теперь твоя анимация не подходит под происходящее в игре, потому что ты запустил анимацию заранее.

Должно быть так:
1. Игрок нажал "прыжок направо".
2. Контроллер запустил капсулу в полёт - этот этап обязателен, иначе игра будет неотзывчивой. Мы не кинцо-мыльцо показываем, а даём поиграть в игру.
3. Моделька видит:
- под ногами ничего нет;
- резкое ускорение;
- движение направо.
Моделька включает "прыжок направо".

Если капсула врезалась в стену, моделька видит:
- под ногами земля;
- резко остановились на месте;
- произошёл удар об неподвижный объект.
Моделька включает "ударился об стену и упал".

Если капсула получила удар, моделька видит:
- резко изменили траекторию движения;
- прошёл урон сзади, в спину;
- всё ещё не касаемся земли.
Моделька включает "урон в спину в воздухе".

Как моделька выбирает, что делать - не суть, хоть собственную нейронку тренируй. Главное тут - не нарушать причинно-следственную связь:
1. Игрок требует конкретное действие.
2. Игра симулирует действие по правилам.
3. Моделька отображает результат симуляции.
4. Игрок доволен отзывчивостью игры.

Если у тебя 2 и 3 перепутаны, то получается кинцо:
1. Игрок требует конкретное действие.
2. Моделька проигрывает совсем не то действие.
3. Симуляция расходится с ожиданиями игрока.
4. Игрок взбешён отсутствием контроля в игре.
Аноним 20/05/24 Пнд 13:35:40 #39 №952078 
>>952052
> баззвординг! пориджинг!
Ой, не трясись ты, умей признавать поражение в споре.
>>952071
> А в этот момент моб ударил игрока
На что в стейтмашине свои сенсоры. И она на них среагировала, замиксовав анимацию отскока. Дальше не читал унылую спискоту. Учись выражать свои мысли кратко.
Аноним 20/05/24 Пнд 13:59:03 #40 №952080 
Вот есть у нас бесконечное плато, где могут быть разного рода объекты влияющие на движение: стены, вода, камни и прочее. Как создавать новые земли в принипе понятно: делим мир на чанки и так же выгружаем из памяти когда уходим от них слишком далеко. Но встал вопрос! Как будет корректно реализовать поиск пути, если у AStarGrid начало в (0, 0), а игрок может захотеть идти в сторону отрицательных координат? Например у нас за игроком гонится враг. Прямой путь к игроку не сработает, если будет быстрее обойти препятствие чем лезть через него. Какое бы решение вы выбрали? Глобальная AStarGrid не вариант, считать каждому субъекту свою тоже как то сомнительно. Дайте совет, анончики!
Аноним 20/05/24 Пнд 14:10:56 #41 №952081 
>>952078
Каком споре? С тобой никто не спорил, просто просвещаю луддита.
https://www.youtube.com/watch?v=SFyHjzpVBsg
Аноним 20/05/24 Пнд 14:12:37 #42 №952082 
>>952080
Если у тебя спавн 512,512, то никаких отрицательных координат нет.
Да и не припомню чтобы астар вообще как то интересовался знаком координат.
Аноним 20/05/24 Пнд 14:30:15 #43 №952084 
>>952081
Мне не интересно выяснять что там у него в видосе. Пиши конкретно.
Аноним 20/05/24 Пнд 15:06:50 #44 №952088 
>>952082
>Если у тебя спавн 512,512
Почему именно это число? Не понял тебя
>то никаких отрицательных координат нет.
>Да и не припомню чтобы астар вообще как то интересовался знаком координат.
При инициализации ты указываешь размер области
var astar_grid = AStarGrid2D.new()
astar_grid.region = Rect2i(0, 0, 32, 32)
Я её имел ввиду, то есть если игрок приходит в точку 0 и всё ещё хочет двигать в сторону отрицательных координат
Аноним 20/05/24 Пнд 15:08:35 #45 №952089 
>>952088
Какая разница какое конкретно? Просто середина области. Если у тебя 32х32 - то 16.
Аноним 20/05/24 Пнд 15:10:20 #46 №952090 
>>952089
Ну а в случае если я хочу выйти за пределы этой стартовой области? Что делать с астаром?
Аноним 20/05/24 Пнд 15:26:35 #47 №952095 
>>952090
Ну значит сделаешь не 32х32, а больше.
Аноним 20/05/24 Пнд 15:28:20 #48 №952096 
>>952090
> AStarGrid2D
Возможно ты не в курсе, но это просто обертка над AStar. А AStar работает с произвольным графом, в котором можно и добавлять узлы, и удалять.
Аноним 20/05/24 Пнд 15:28:57 #49 №952097 
>>952095
Не задирайся пожалуйста, я же хочу иметь возможность двигаться в одну сторону бесконечно
Аноним 20/05/24 Пнд 15:30:02 #50 №952098 
>>952097
В нашей вселенной у компьютеров конечная память...
Аноним 20/05/24 Пнд 15:32:42 #51 №952099 
>>952096
Точно, я как-то об этом позабыл, спасибо. Посмотрел, там можно точки удалять и добавлять на лету, вообще отлично!
>>952098
Ну так я буду выгружать не нужное!! Бесишь!
Аноним 20/05/24 Пнд 16:06:51 #52 №952103 
Есть идеи как сделать анимированную часть текста, чтобы буквы прыгали вверх-вниз? В разных околоквестах подобное вижу.
Аноним 20/05/24 Пнд 16:17:05 #53 №952106 
>>952056
>Документацию совсем не читал?
Нет
Аноним 20/05/24 Пнд 16:55:30 #54 №952108 
>>952103
Сделал шейдером.
Аноним 20/05/24 Пнд 17:47:43 #55 №952117 
>>952108
Красава. Покажи результат.
Аноним 20/05/24 Пнд 19:30:38 #56 №952144 
image.png
5 новых игр на Годоте для вдохновления и мотивации треда

https://www.youtube.com/watch?v=XILTzfq9f6o
Аноним 20/05/24 Пнд 19:42:51 #57 №952147 
>>952078
>в стейтмашине свои сенсоры.
>И она на них среагировала
У конечного автомата нет никаких сенсоров.
>замиксовав анимацию отскока
У конечного автомата нет такой возможности.
>Учись выражать свои мысли кратко.
А ты слишком обобщаешь всё словом "стейтмашина".
Аноним 20/05/24 Пнд 19:50:02 #58 №952149 
>>952080
>сторону отрицательных координат
Не проблема, там используются хэши.

>бесконечное плато
>делим мир на чанки и так же выгружаем
>корректно реализовать поиск пути
Можно использовать несколько графов:
1. Глобальная сеть чанков.
2. Локальная сеть клеток внутри чанка.
Связать их вместе... несколько сложно.
Посмотри на RimWorld, там это есть.

>>952099
>там можно точки удалять и добавлять на лету
Это неизбежно вызовет лишние затраты.
Лучше хранить по одному графу на чанк.
Аноним 20/05/24 Пнд 20:01:14 #59 №952152 
>>952080
Ну, прибавляй ко всем координатам, которые даёшь астару, какую-нибудь большую константу, а потом из пути обратно её вычитай.
я хз на самом деле, не смотрел ни разу, как этот астар работает, и можно ли так.

>>952103
https://docs.godotengine.org/en/stable/tutorials/ui/bbcode_in_richtextlabel.html#shake
Аноним 20/05/24 Пнд 20:13:29 #60 №952157 
image.png
>>952149
Да, я думал о чём-то таком
> Лучше хранить по одному графу на чанк.
А как тогда переходить между графами? Потому что если нам надо из пятого чанка во второй, и на всё один граф то пойдёт по синей линии, когда если каждый чанк - отдельный граф, то по зелёной, не? Потому что рассчитываем какие чанки придётся пересечь, и идёт по ним, стараясь придерживаться кратчайшего пути до границы следующего чанка. Или я не так понял?
Аноним 20/05/24 Пнд 20:15:38 #61 №952158 
Безымянный.png
>>951925 (OP) >>951965
>I N S T A L L _ G O D O T
Аноним 20/05/24 Пнд 20:31:50 #62 №952166 
grid.png
astar.mp4
>>952157
>пойдёт по синей линии
Ты в этом уверен?
Аноним 20/05/24 Пнд 20:51:38 #63 №952167 
>>952166
Возможно, тут не инициализированы диагонали...

>>952157
Нужно смотреть по ситуации. Видит ли игрок больше одного чанка? Сколько чанков игрок пробегает, пока мобы движутся за кадром? Какого размера чанки? Какую нагрузку создают мобы, пробегая по чанку и между чанками? Сколько всего мобов и насколько они важны для геймплея? Что будет, если мобы выбирают неоптимальный маршрут? А если оптимальный? Или эта фича чисто для красоты и ничего более?

В RimWorld чанки мелкие, на экране их много, NPC в руках игрока (от поведения которых зависит вся игра) постоянно тупят и ходят неоптимальными маршрутами. Вроде есть какие-то моды на другой поиск пути, но в официальной сборке игры поиск пути кривой. И ничего, очень популярная игра.

Предлагаю не париться и сначала сделать игру, а потом разбираться, каким способом будет лучше сделать навигацию у мобов. Она же у тебя всё равно абстрактной будет - моб запрашивает из внешнего "навигатора" маршрут и потом топает по нему, этот "навигатор" можно легко заменить, сохранив его API.
Аноним 20/05/24 Пнд 20:56:05 #64 №952169 
>>952158
> winget install godot
Аноним 20/05/24 Пнд 21:09:28 #65 №952170 
Безымянный.png
>>952169
Для линукса он вообще бред какой-то сочинил.
Можно назвать это "линукс глазами нормиса".
Аноним 20/05/24 Пнд 21:13:23 #66 №952172 
>>952170
Это говнобунта. Ебать её в 80 порт. На манжаре никакой ебли, все ключи уже есть искаропки, просто пишешь без задней мысли
> pacman -S godot
и всё.
Аноним 20/05/24 Пнд 21:58:13 #67 №952188 
Godot.png
>>951925 (OP)
В мире, где каждый день - это битва,
Где мечты и идеи становятся реальностью,
Есть место, где творцы могут воплотить свои мечты,
Именно там, где начинается вся сага:
О, Godot, ты как маяк в темноте ночи,
Предлагаешь нам путь к вершинам, недостижимым для многих.

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

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

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

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

Так пусть будет слава твоему имени, о Godot,
За то, что ты даешь нам возможность быть лучшим.
За твою открытость, за твою доступность,
Спасибо тебе, что делаешь нашу работу легче.

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

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


(c) Phind Instant
Аноним 20/05/24 Пнд 23:33:44 #68 №952210 
>>952144
Мне не интересно выяснять что там у него в видосе. Пиши конкретно.
Аноним 20/05/24 Пнд 23:37:58 #69 №952213 
>>952144
Хороший чел. Попадал в его подборку дважды.
Аноним 21/05/24 Втр 00:04:59 #70 №952219 
>>952210
>что там у него в видосе. Пиши конкретно
5 новых игр на Годоте
Аноним 21/05/24 Втр 00:27:48 #71 №952224 
1657471676564.png
>>952219
Не очень похоже на игру.
Аноним 21/05/24 Втр 00:33:17 #72 №952226 
>>952224
с поправкой на годот
Аноним 21/05/24 Втр 01:10:04 #73 №952235 
image.png
>>952157
AStar позволяет двигаться только по рёбрам графа. Если брать квадратную сетку, у нас два варианта: переходы либо к 4 соседям (без диагоналей), либо к 8 соседям (с диагоналями). В первом случае любой маршрут между двумя точками будет одинаковой длины, и движок выберет первый попавшийся, т.е. вместо зигзага будет буква Г или что-то похожее. Во втором случае мы можем выбрать более оптимальный маршрут, т.к. по диагонали двигаться в sqrt(2) раз быстрее, чем буквой Г, но мы по-прежнему не можем срезать клетки как захотим - вместо прямой будет зигзаг, если точки маршрута не прямо по диагонали.

Когда мы добавляем сюда чанки, мы опять же можем разрешить диагонали по чанкам или запретить. Если запрещаем, тогда результат будет, скорее всего, буквой Г. Если разрешаем диагонали и двигаемся по промежуточным чанкам примерно по середине (двигаемся от входа к центру чанка и/или к середине выходной стороны), тогда зигзаг будет отдалённо напоминать зигзаг, который мы получим, двигаясь только по клеткам с диагоналями, без чанков. Дальше всё зависит от размера чанков, что именно видит игрок, как это влияет на геймплей и т.д.

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

Зачем вообще чанки в навигации? Ты постоянно загружаешь/удаляешь чанки карты мира из памяти, и ты хочешь делать это в отдельном потоке, который не будет мешать основным игровым потокам. Если ты вносишь изменения в один общий AStar, он будет заблокирован для навигации NPC до тех пор, пока не закончится загрузка или удаление чанков, т.к. без блокировки результат непредсказуем. Если ты загружаешь куски карты в отдельные AStar, существующие NPC могут продолжать запрашивать навигацию в уже имеющихся участках карты, т.к. блокировать их нет необходимости. Блокируется только глобальная навигация по чанкам, но эта блокировка короче по сравнению с загрузкой чанка (скажем, чанк имеет 16x16 клеток, а одновременно загружается не более 3-4 чанков).

Конечно, нужно проводить реальные тесты и сравнивать, какой подход/параметры лучше, но для этого лучше уже иметь игру с оформленным геймплеем. Преждевременные оптимизации только зря замедляют разработку проекта, но знать о потенциальных проблемах в будущем всё же нужно.
Аноним 21/05/24 Втр 07:20:24 #74 №952250 
>>952188
Теперь переходи на другую нейронку, и пили аудиотрек с этим текстом.
Затем переходи на третью и пили видеоклип по саунду.

Ну и если всё получится - то место в ОП посте следующего треда твоё.
Аноним 21/05/24 Втр 07:22:22 #75 №952251 
1716265325099.mp4
>>952188
Ееееее!

Годооот!
Аноним 21/05/24 Втр 08:02:28 #76 №952253 
>>952167
>>952235
Спасибо за ответы, пока что занимаюсь генерацией карты, но подумываю о том, как я планирую делать открытый мир, а значит и навигацию по нему. Так то я согласен, сначала нужен кор геймплей луп, а потом уже такого рода крутости. В крайнем случае всегда можно пойти путём слабых и сделать как в том же Caves of Qud, где нет бесшовного перемещения между чанками, т.к. каждый чанк - отдельный экран
Аноним 21/05/24 Втр 12:44:18 #77 №952283 
>>952253
> нет бесшовного перемещения между чанками
Нахуй оно не нужно никому, все уже наигрались в пустые миры с автогенерируемыми квестами. Народ хочет геймплея, а не дрочильни. Да, я говорю за всех, ишо?
Аноним 21/05/24 Втр 12:48:58 #78 №952285 
>>952283
Ладно, ладно, делаю я геймплей, делаю!
Аноним 21/05/24 Втр 12:53:20 #79 №952287 
>>952253
Лучше сначала сделать небольшой фрагмент карты, условно 100 на 100 клеток, лучше даже вручную его нарисовать, чтобы не мучиться генерацией. На этом маленьком участке формируешь базовый геймплей, чтоб игроку хорошо игралось даже в ограниченном пространстве. Уже потом будешь масштабировать геймплей на бесконечную процедурную карту.

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

Можно, конечно, идти путём Майнкрафта и подгонять геймплей под имеющийся генератор ландшафта. Но для этого генерация должна быть самодостаточной, т.е. развлекать независимо от геймплея (ландшафты Майнкрафта просто приятно видеть).
Аноним 21/05/24 Втр 13:18:12 #80 №952291 
image.png
Хайпуем
Аноним 21/05/24 Втр 14:14:34 #81 №952297 
4.3.png
>>952291
Наконец-то начнём делать игры.
Аноним 21/05/24 Втр 14:22:28 #82 №952299 
>>952297
Не знаю, как вы, а я подожду 4.4.
Аноним 21/05/24 Втр 18:25:42 #83 №952372 
0095-2505.mp4
Neintitulat.png
Поклеил обои, провел освещение, начал мебелировать. До чего же долго. По ощущениям словно вернулся в редактор карт Warcraft 3, когда накодил спелл и теперь сидишь в редакторе объектов подбирая модельки эффектов, иконки и прочее.

Попробовал совместить портрет Годетты с артом Хизер из СХ3. Больно модельная внешность получается.
Аноним 21/05/24 Втр 18:49:49 #84 №952385 
>>952372
>Поклеил обои, провел освещение, начал мебелировать
Ипотеку выплатить не забудь.
Аноним 21/05/24 Втр 19:09:27 #85 №952388 
>>952213
Что нужно сделать, чтобы попасть в подборку?
Аноним 21/05/24 Втр 19:18:32 #86 №952391 
>>952388
Первый раз кто-то другой отправил за меня, либо он сам ее нашел. Я это заметил по взлету в стате итча. Вторую отправлял сам через форму: https://stayathomedev.com/submit-your-game/

А, еще надо сделать игру.
Аноним 21/05/24 Втр 19:28:54 #87 №952393 
0013-0156.mp4
>>952385
Уже подобрал модельку для противника дальнего боя - сотрудник микрокредитной организации, танцем раскидывает долговые расписки под ногами игрока, призывая агрессивных коллекторов ближнего боя.
Аноним 21/05/24 Втр 20:54:56 #88 №952405 
Бля, чому шрифт у лейбла не автоскейлится при изменении масштаба окна, че за залупа. Или я что то не так делаю? А как надо если не так?
Аноним 21/05/24 Втр 23:12:53 #89 №952422 
мем.png
>>952372
>жаль, что далеко не все понимают все фичи Godot))) действительно продвинутые знания))) не так уж много геймдевов в наше время, кто знает, почему это такой интересный и необычный движок)))
Аноним 21/05/24 Втр 23:18:24 #90 №952423 
>>952405
>шрифт у лейбла не автоскейлится при изменении масштаба окна
Как ты "масштаб окна" меняешь?

Если ты про ту фичу, что где-то в настройках проекта - там несколько разных режимов. Как минимум один из них никак не влияет на Control-ноды, т.е. весь GUI остаётся без изменений - это важно для 3D игр и 2D игр с гладкими шрифтами. Если у тебя пиксельный шрифт и ты хочешь увеличить его в 2/4 раза, то нужно выбрать другой режим масштабирования.
Аноним 22/05/24 Срд 02:32:30 #91 №952433 
В шейдере есть встроенный TIME чтобы удобно синусить и все такое. А в гдскрипте есть аналог? Чтобы не делать var time; time += delta
Аноним 22/05/24 Срд 02:55:12 #92 №952436 
>>952433
>TIME чтобы удобно синусить
>Чтобы не делать var time; time += delta
https://docs.godotengine.org/en/stable/classes/class_time.html#class-time-method-get-ticks-msec
Аноним 22/05/24 Срд 03:25:56 #93 №952439 
>>952436
А что лучше/эффективней, каждый фрейм свой тайм собирать или дергать эту функцию? А то хуй знает, может она медленно работает.
Аноним 22/05/24 Срд 03:48:13 #94 №952440 
>>952439
Дёрни и то, и другое 100000 раз в цикле и оцени разницу.

var iterations: int = 100000
var start: int = Time.get_ticks_msec()
var test1: int
for i in iterations: test1 = Time.get_ticks_msec()
print("Time.get(): %d ms" % [Time.get_ticks_msec() - start])

start = Time.get_ticks_msec()
var test2: float
for i in iterations: test2 += 0.0167 # 1/60
print("+= delta: %d ms" % [Time.get_ticks_msec() - start])
Аноним 22/05/24 Срд 03:53:45 #95 №952441 
>>952440
Давай ты дерни. А то я уже в кроватке, тут неудобно дергать.
Аноним 22/05/24 Срд 04:09:54 #96 №952442 
>>952441
>в кроватке неудобно дергать
Так ты штаны спусти, неудобно ему...

>Time.get(): 15.938 ms (0.000159 ms per iteration)
>+= delta: 8.323 ms (0.000083 ms per iteration)
>difference: 7.615000 ms (0.000076 ms per iteration)
Что и следовало ожидать. Но у Time свои преимущества.
Аноним 22/05/24 Срд 07:27:36 #97 №952447 
>>952372
> Больно модельная внешность получается.
Нууу, вопрос с артом для шапки на следующий тред, ты уже закрыл. Сообщество выражает тебе благодарность. Желает всяческих успехов.

>>952422
Азазхазпх! Садамитю
Аноним 22/05/24 Срд 16:32:10 #98 №952533 
>>952442
Спасибо за тест, анончик. Совсем сонный был.

Время продолжать делать игры.
Аноним 22/05/24 Срд 19:55:34 #99 №952573 
Какие есть варианты инверсной кинематики в 2D кроме вращения костей в плоскости экрана?

Как я понял, встроенный IK может только вращать.
Аноним 22/05/24 Срд 20:04:34 #100 №952574 
>>952573
Так IK и может только вращать. Это такой механизм типа пантографа. А ты что придумал, поршни какие-то линейно слайдить или что?
Аноним 22/05/24 Срд 20:33:10 #101 №952582 
>>952574
В Blender можно настроить так, что кости тянутся, если не могут добраться до цели поворотом.

В 2D если только вращать в плоскости экрана, получаются только примитивные марионетки...
Аноним 23/05/24 Чтв 16:03:49 #102 №952692 
>>952574
>А ты что придумал
Ладно, херню какую-то я придумал.

Идея была в том, чтобы кукожить спрайты так, будто они вращаются в 3D, оставаясь при этом 2D.

Как вообще это их Live2D делается-то без перемещения костей в 3D пространстве?
Аноним 23/05/24 Чтв 16:30:20 #103 №952698 
image.png
Есть игорь с простейшим HTTPRequest по нажатию на кнопочку. Но эта хуйня чёт не фурычит, если в HTML5 экспортируют как локально, так и после размещение в сети. Как можно попытаться подлечить? Чёт нагугливается про специальные хэдеры под это дело, но я чёт не то делаю мб или вообще не шарю. Пикрил мой пехапе бэкенд, лол.
версия двига 3.5.2
Аноним 23/05/24 Чтв 16:58:47 #104 №952717 
>>952698
Скорее всего проблема на бэкенде. Если я верно помню тебе нужна поддержка CORS, иначе не секьюрно. Я бэкенд для сбора статов делал вот так, на питоне: https://pastebin.com/LPGnqAWJ попробуй сделать аналог под пхп.

Если игра браузерная ты можешь нажать ф12 и посмотреть на что она жалуется в веб-консольке.
Аноним 23/05/24 Чтв 17:03:16 #105 №952719 
>>952698
>не фурычит, если в HTML5 экспортируют
Так ты в консоль браузера посмотри, или выводи результат операции через print() в консоль.

Как минимум в Firefox можно подробно изучить каждый запрос, проходящий через браузер - заголовки, содержание, адрес, ответ сервера и т.д.
Аноним 23/05/24 Чтв 17:09:36 #106 №952721 
>>952717
>Если игра браузерная ты можешь нажать ф12 и посмотреть на что она жалуется в веб-консольке.

>>952719
>Так ты в консоль браузера посмотри, или выводи результат операции через print() в консоль.

ооао спс поцоны
Аноним 23/05/24 Чтв 20:57:27 #107 №952766 
1689304166597.webp
>>952692
Не знаю как у них, но вообще разные варианты в голову приходят.
Вариант 1 - нет никакого 3д, есть просто параллакс слоев.
https://www.youtube.com/watch?v=QSeWeyoZ6AM
Вариант 2 - используется проекция из 3д в 2д.
Честно говоря не нашел простого описания, но кажется какие то просто 2д искажения будут совпадать с 3д поворотами.
https://www.youtube.com/watch?v=LZr4ayi1v18
Аноним 23/05/24 Чтв 21:10:11 #108 №952771 
>>952766
Хм... Попробую сформулировать задачу.

Есть точка А, фиксированная в пространстве, и точка Б, которая может быть в любом месте заданного Rect2. В скелете всего 3 узла + 3 ребра (последнее ребро свободно вращается). Первый узел в точке А, а последний узел нужно переместить в точку Б, да так, чтобы средний узел расположился где-то... как-то так, чтобы натянутые PNG картинки не разнесло по всему экрану.

Я думал, "щас накину IK и всё ок будет", но IK слишком ограничивает движение, плюс выворачивает средний узел туда, куда мне не надо. Я подумал, "ладно, ща набросаю свой велосипед", но так и не понял, как именно двигать кости, потому что когда я двигаю Rest Pose, спрайты совсем не деформируются, а если менять Scale, спрайты корёжит.

Я решил принять единственное решение - забить на эту задумку.
Аноним 23/05/24 Чтв 21:10:25 #109 №952772 
1096-2418.mp4
Screenshot26.png
Срань какая-то. Попробовал экспортировать проект теста ради и во время запуска жалуется на отсутствие сцен которые существуют. Видимо проблема в заглавных буквах в названиях, но их я исправил в ловеркейс одну вечность назад, да и при запуске из редактора все работает.
Жопа.
Аноним 23/05/24 Чтв 21:18:53 #110 №952775 
>>952772
>исправил в ловеркейс одну вечность назад
Попробуй это:
1. Закрой редактор.
2. Вынеси .godot из проекта.
3. Открой проект в редакторе.
4. Экспортируй заново.
Должно помочь с кэшем файлов, но это не точно.

>при запуске из редактора все работает
Там с кэшем какие-то проблемы после введения "uid".

Не рекомендую переименовывать, перемещать или даже удалять файлы через Проводник Windows или любой другой менеджер файлов кроме встроенного в Godot. Встроенный менеджер файлов автоматически обновляет все ссылки в других файлах и кэше редактора... или хотя бы пытается их обновить, но количество косяков при его использовании ощутимо меньше, чем когда меняешь файлы извне.
Аноним 23/05/24 Чтв 21:22:25 #111 №952776 
>>952772
На винде не все так просто. Если ты переименуешь файл в Файл, то такое переименование вовсе не все проги обнаружат - case insensitive, блин.
Как минимум попробуй в совсем другое название переименовать.
Аноним 23/05/24 Чтв 21:29:34 #112 №952781 
>>952771
Ну, с локтями в IK всегда проблема, для них используют специальный магнит (в блендере он называется pole target?), не помню есть ли он в IK годота, давно не занимался.
Аноним 23/05/24 Чтв 21:34:27 #113 №952785 
>>952776
>не все проги обнаружат - case insensitive
О, точно. В tscn-файлах при этом остаётся старое название. Я это решал ручной правкой всех tscn-файлов, но теперь просто пользуюсь встроенным менеджером файлов, чтобы он всё сам автоматически обновлял.
Аноним 23/05/24 Чтв 22:04:10 #114 №952792 
>>952787
Просто меняй position, не?
Аноним 23/05/24 Чтв 22:10:28 #115 №952797 
>>952775
>1. Закрой редактор.
>2. Вынеси .godot из проекта.
>3. Открой проект в редакторе.
>4. Экспортируй заново.

Помогло, пасиба аноне. Можно работать дальше.
Аноним 23/05/24 Чтв 22:17:00 #116 №952799 
>>952787
Через state в _integrate_forces.
Ну а вообще, обычно им импульсами выдают пинка.
sage[mailto:sage] Аноним 23/05/24 Чтв 22:29:40 #117 №952811 
>>952807
Ты лучше вот это опровергни >>944076 →
Причём в том же треде.
А отсюда свали.
Аноним 23/05/24 Чтв 22:37:33 #118 №952816 
Напоминаю, движкосрачи в движкосраче-треде.
sage[mailto:sage] Аноним 23/05/24 Чтв 22:41:11 #119 №952817 
>>952814
Свали нахуй в свой загон, блядь.
Аноним 23/05/24 Чтв 22:53:30 #120 №952822 
>>952814
Разгадка проще, чем ты думаешь.
Ты пытаешься удалить зуб через желудок.
Ригид боди не мувают. Ригидбоди сами летают по симуляции физики, а ты придаешь им импульсы.
А тела, которые летают по управлению, делаются CharacterBody/KinematicBody.
Да, конечно можно иногда ригидбоди телепортировать и это описано как сделать. Но это исключение.
Аноним 23/05/24 Чтв 22:55:41 #121 №952823 
>>952787
>как простой 3Д ригид бади двигать
>ангуляр велосити у него менять
Конкретно поля скорости лучше только читать.
https://docs.godotengine.org/en/stable/classes/class_rigidbody3d.html
>add_constant_torque
>apply_torque
>apply_torque_impulse
Аноним 23/05/24 Чтв 23:07:17 #122 №952827 
>>952814
>kinematic RigidBody
Это какая-то путаница у юнитеков, RigidBody по определению не является Kinematic. Его можно переключить в режим кинематика, но это как микроскопом гвозди забивать, большинству игроделов не нужно. Для большинства персонажей хватит CharacterBody, который раньше в Godot назывался KinematicBody. RigidBody нужен для объектов, которые двигаются строго по физике, вроде шариков в бильярде, или когда тебе нужно сделать симуляцию сложного физического объекта с ракетными двигателями и т.п.

Алсо, синтаксис на скриншоте отвратительный. Кто такое любит?
>m_
>GetComponent<RigidBody>();
>Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"))
Такая-то вырвиглазная гадость, аж тошнит.
Аноним 23/05/24 Чтв 23:27:35 #123 №952832 
Безымянный.png
>>952831
>в доке тебе не мешает
Хорошие доки, мне очень часто помогали.
Туториалы на ютубе не смотрю - только доки.

>>952829
>И как простое кинетик бади в него эволюционировало
Если тебе просто подвигать-повертеть что-то без физики:
docs.godotengine.org/en/stable/classes/class_animatablebody3d.html

>гавнина с кучей бойлерплейта
Она чтобы ТЫ не писал лишний бойлерплейт (значение знаешь?).

>хотя видимо таким не является
Почему? Оно как раз для человечков.

>>952814
>Один и тот же запрос в гугл, первая сылка
Каким гуглом пользуешься? Пикрил норм ищет.
Аноним 23/05/24 Чтв 23:48:17 #124 №952839 
>>952835
Почему ты до сих пор здесь?
Аноним 24/05/24 Птн 04:45:45 #125 №952863 
image.gif
>>952839
Он просто цундере.
>Н-не то что бы мне нравился этот движок...
>Н-не пойми неправильно, другой движок лучше!
>И-использую его просто потому что он бесплатный!
>В-вот найду альтернативу лучше - сразу уйду! Вот!
>И в-вообще... тут всё не так, как мне хотелось!
Классика.
Аноним 24/05/24 Птн 11:00:31 #126 №952883 
1716537222.png
>>951925 (OP)
Сап, годач!
Как зделоть автоматическое переключение интерфейса при изменении метода ввода? Ну знаете, как в современных играх, когда играешь с джойстика - подсказки джойстиковые, когда играешь с клавы - подсказки клавиатурные.
Вот я накидал образец, для выбора между клавой и мышью. Работает. В дальнейшем туда можно воткнуть остальные типы инпутов. Но не изобретаю ли я велосипед?
Аноним 24/05/24 Птн 13:41:59 #127 №952893 
>>952883
Для тултипов и подсказок легче не строки, а набор иконок. При переключении методов контроля ты просто меняешь спрайтщит двумя строками кода.

https://kenney-assets.itch.io/input-prompts-pixel-16

Про непосредственно обработку ввода - хз насколько у тебя там комплексно. У меня в своем проекте получилось объединить тач-инпут и мышь+клавиатуру в один общий код без избытка условий. Но тут нужен тонкий подход.
Аноним 24/05/24 Птн 14:06:30 #128 №952897 
>>952883
Что ты будешь делать, если я начал играть с мышки, но потом перешел на клаву?
Аноним 24/05/24 Птн 14:11:43 #129 №952898 
>>952897
Тут уже только морду бить, сорян.
Аноним 24/05/24 Птн 14:53:19 #130 №952909 
>>952897
В коде всё описано. Регистрируются 10 инпутов от нового метода и происходит переключение. Лимит в 10 нажатий взят с потолка и подлежит донастройке.
>>952893
> получилось объединить тач-инпут и мышь+клавиатуру
Очевидно что и у меня так же будет. Просто пример показал, как между клавой и мышкой на лету переключается режим.
Аноним 24/05/24 Птн 16:05:51 #131 №952918 
Как рекомендуете состояния конечного автомата описывать? Отдельным gd файлом, субклассом внутри одного файла или просто на enum?

Я пробовал отдельными файлами - жесть, очень запутывает, не смог разобраться и удалил всё.
Аноним 24/05/24 Птн 16:40:38 #132 №952923 
>>952918
Мне нравится комбинированный подход из тырпрайза:
Все стейты из одного класса скажем, RelayState, или допустим, назовём его LambdaState. Кто знаком с современными веяниями, уже догадался, куда я клоню. Поля нашего стейта - это Callable. При создании стейтов, ты прописываешь код в вызывающем классе. Например:
> var idle_state = RelayState.new(on_idle_update, on_idle_enter)
А сами функции здесь же.
А конструктор RelayState выглядит так:
> var _update_callback: Callable
> func _init(on_update: Callable = null, on_enter: Callable = null, on_exit: Callable = null) : _update_callback = on_update ...
И у него методы апдейта входа и выхода выглядят так:
> func update(): if _update_callback: update.call()

Таким образом стейты обладают свойством ссылочного типа, и им не нужны длинные матчи-свитчи, и при этом вся логика не растекается по файлам, но ничего не мешает её по файлам разнести. Просто наследуешься от RelayState и описываешь логику внутри.
Аноним 24/05/24 Птн 16:44:33 #133 №952924 
>>952923
> > func update(): if _update_callback: _update_callback.call()
Быстрофикс.
Алсо, в трёшке тоже так можно (если у тебя трёшка), просто кода будет больше.
Аноним 24/05/24 Птн 16:48:22 #134 №952925 
>>952923
>При создании стейтов, ты прописываешь код в вызывающем классе.
Если ты лишаешься возможности таскать состояния мышкой в дереве сцены, не используешь систему наследования, и не группируешь методы вместе с описанием класса, то зачем тогда классы?..

>func update(): if _update_callback: update.call()
Откуда этот update() вызывать?

Одному состоянию нужен _process().
Другому состоянию нужен _input().
Третьему состоянию нужен _physics_process().
Четвёртому вообще нужен _integrate_forces().

Из-за этого просто state.update() вызвать не выйдет.
Аноним 24/05/24 Птн 17:01:07 #135 №952927 
>>952883 >>952909
>Регистрируются 10 инпутов
Зачем? Если пользователь один раз нажал кнопку на геймпаде - очевидно, он уже взял в руки геймпад и собирается на нём играть. Если пользователь нажал кнопку на клавиатуре - очевидно, у геймпада села батарейка и он пересел за клавомышь.

Лишняя задержка по нажатиям контринтуитивна и я долго не мог понять, почему у тебя так много кода ради простого if/else переключателя.

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

Само переключение подсказок у тебя не должно занимать больше одного кадра, даже если ты какие-то текстуры заново рендеришь с нуля.
Аноним 24/05/24 Птн 17:04:38 #136 №952929 
1716559475985.png
>>952925
Раньше писал такой стейт на шарпе, щас переписал на гдскрипте, вышло еще короче, и даже ифы не нужны, см. пик. Оказалось, Callable не может быть null, но конструктор с дефолтами хочется. Я вышел из ситуации элегантно. А поскольку nc не null, а пустой делегат, то ифы убираем за ненадобностью.

> лишаешься возможности таскать состояния мышкой в дереве сцены
Нахуй не нужон.пнг
> не используешь систему наследования
Используй систему композиции.
> не группируешь методы вместе с описанием класса
Группирую.
> Откуда этот update() вызывать?
Из player.gd.
> просто state.update() вызвать не выйдет
Придётся пилить полный пример. Ты не до конца понимаешь силу делегирования.
Аноним 24/05/24 Птн 17:06:18 #137 №952930 
>>952927
> Зачем?
Чтобы играть геймпадом, получая экренные подсказки для геймпада, при этом подруливать мышкой (или прожимать клавой), и чтобы подсказки не переключались геймпад-КВМ-геймпад-КВМ.
Аноним 24/05/24 Птн 17:24:24 #138 №952931 
>>952930
>Чтобы играть геймпадом, получая экренные подсказки для геймпада, при этом подруливать мышкой (или прожимать клавой)
Аааааа, что это за гей-мерский БДСМ?

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

Подсказки на экране нужны для ленивцев, которые развалились на диване в полусне, и не способны запомнить две кнопки - A = "да" и B = "нет", поэтому игра им должна непрерывно напоминать.

Короче, не усложняй.
Аноним 24/05/24 Птн 17:32:28 #139 №952933 
>>952929
>не нужон
Как тогда лапшу состояний развешивать?
>композиции
Так у тебя же RefCounted, они не имеют встроенной системы композиции в отличие от Node. Велосипед?

>>Откуда этот update() вызывать?
>Из player.gd.
>Придётся пилить полный пример. Ты не до конца понимаешь силу делегирования.
Я не понимаю, как у тебя абстрактный код может учитывать все нюансы каждого состояния, которые могут выходить далеко за рамки "вошёл, обновил, вышел" и должны быть связаны со структурами движка, а не работать где-то в вакууме отдельно от всего.

Про Callable не нужно объяснять, я их использовал неоднократно ещё до выхода 4.0. Вопрос не в них, а в организации графа конечного автомата, чтобы это не превращалось в головную боль и костыли.
Аноним 24/05/24 Птн 17:53:54 #140 №952935 
>>952933
> Я не понимаю, как у тебя абстрактный код может учитывать все нюансы каждого состояния
Обесняю:
>>952925
> Одному состоянию нужен _process().
Нет, _process нужен ноде.
> Другому состоянию нужен _input().
Нет, _input нужен ноде.
> Третьему состоянию нужен _physics_process().
Нет, _physics_process нужен ноде.
> Четвёртому вообще нужен _integrate_forces().
Нет, _integrate_forces нужен ноде.
Понял теперь?
>>952933
> Вопрос не в них, а в организации графа конечного автомата, чтобы это не превращалось в головную боль и костыли.
У нод своя композиция, у стейтов своя композиция. Она же граф. Она же дерево.
Между деревом нод и графом состояний есть точка, стейтмашина, которая переключает внутри себя куррент-стейт. Также стейтмашина при своем создании делегирует стейтам все необходимые данные. Ноды работают со своими коллбэками. Стейты работают со своими коллбэками.
Всё логично, просто и разграниченно.
Теперь понял?

Еще раз. Коллбэк наподобие _integrate_forces вызывается у ноды. А будет ли она в состоянии его вызывать - это задаётся через стейтмашину.
Аноним 24/05/24 Птн 17:56:32 #141 №952937 
>>952935
Перефразирую.
> Еще раз. Коллбэк наподобие _integrate_forces вызывается у ноды. А а с какими данными нода обработает код - это задаётся через стейтмашину, куррентстейтом.
Аноним 24/05/24 Птн 18:07:37 #142 №952938 
>>952935
>Нет, _integrate_forces нужен ноде.
Так, давай конкретнее.

Вот у меня есть RigidBody, и у него есть состояние бытия по имени FartForwardState. Это состояние должно брать state из _integrate_forces, прикладывать к нему силу fart и таким образом ускорять RigidBody вперёд. Также у этого объекта есть ещё более 9000 состояний бытия, которые я потом сделаю, но пока сфокусируемся на главном.

Ты предлагаешь сделать так:
>func on_fart_forward_update(): ??? # тут нужен прямой доступ к rb_state из _integrate_forces
>var current_state = RelayState.new(on_fart_forward_update)
Что я должен сделать?
>func _integrate_forces(rb_state): current_state.update()
Это не учитывает rb_state, я не могу его передать в обработчик состояния, а обработчик состояния не может его откуда-то взять, ведь rb_state существует в актуальном состоянии только в _integrate_forces.

Хрень какая-то. Проще через match, раз уж мы не можем передвигать состояния в дереве сцены.
Аноним 24/05/24 Птн 20:05:49 #143 №952947 
>>952935
Вообще, простейший конечный автомат:
>func _integrate_forces(rb_state):
>match current_state:
>State.FartForward: блаблабла
>State.DoBarrelRoll: блаблабла
>State.SelfDestruct: блаблабла
Здесь State - это просто enum. Правильно? Всё сгруппировано в одном месте, просто и логично, однако, это невозможно настраивать в рантайме.

Если мы создаём отдельный класс State:
>func _integrate_forces(rb_state):
>current_state.update(rb_state)
Всё остальное - в обработчике update состояния. Позволяет нам добавить сколько угодно классов прямо в рантайме, не трогая эту строчку в коде.

Но такой подход плохо сочетается с кучей разных обработчиков нод Godot, ведь в каждом отдельном обработчике могут быть разные параметры:
>_input, _unhandled_input - event: InputEvent
>_process, _physics_process - delta: float
>_integrate_forces - state: что-то там
И т.д. Что может понадобиться завтра - я не знаю.

Я пытался прокидывать обработчики туда-сюда, но получается лютая лапша на куче костылей. Тупо некрасиво и запутывает, кто кого где вызывает.
Аноним 24/05/24 Птн 20:19:29 #144 №952948 
>>952938
>>952947
Ещё очень важный момент, вот этот обработчик
>_integrate_forces
Доступен только на потомках RigidBody, и state его относится только к конкретной ноде. Это означает, что обработчик состояния не может быть наследником какого-то класса кроме RigidBody, и если мы хотим добавить состояние, требующее работу с _integrate_forces, мы обязаны привязать скрипт к RigidBody, объявить в нём этот обработчик и вызывать из него обработчик состояния... Что всё усложняет на порядки, особенно если у нас все остальные состояния идут через совершенно другие ноды и к физике отношения не имеют.

Как это сделать универсально и гибко - непонятно.
Аноним 24/05/24 Птн 21:58:55 #145 №952963 
Ребят, ребят, а где позырить, как максимально пиздатую архитектуру игры пилить?
Типа паттерны всякие, компонентно ориентированный подход... Например.
Я просто только вкатываюсь в пограмирование и пока еще многого не знаю.
Аноним 24/05/24 Птн 22:01:00 #146 №952964 
>>952963
В документации, в туториалах на ютубе, в демо-проектах. Но лучше всего - у себя вчерашнего, уже набившего шишки и понявшего как лучше. Опыт и рост это в основном личный путь.
Аноним 24/05/24 Птн 22:13:18 #147 №952966 
1595015514011.png
>>952947
Почему бы не сделать просто как в самом годоте? У таймера и аним плеера есть выбор, когда выполнять, в idle или physics.
>>952948
Утиная типизация, не обязательно, можно просто проверять есть ли метод _integrate_forces.
Аноним 24/05/24 Птн 22:16:28 #148 №952968 
1704346946994.png
>>952963
Я видел в контроллерах персонажей в ассетлибе например,
https://github.com/expressobits/character-controller
А вообще язык скриптовый, в первых играх не заморачивайся с архитектурой, можно быстро прототипировать разные штуки.
Аноним 24/05/24 Птн 22:21:06 #149 №952969 
>>952964
>>952968
Я первый раз в кодинг пытаюсь, еще пока не понимаю что значат все эти func и var.
Не знаю даже в какую сторону двигаться.
Аноним 24/05/24 Птн 22:30:16 #150 №952970 
>>952963
>архитектуру игры пилить
Вот с этим можно ознакомиться:
https://gameprogrammingpatterns.com/contents.html

>>952969
>пока не понимаю что значат все эти func и var.
Это не архитектура, лол, у тебя самой базы нет.

Есть такая обучающая игрушка:
https://gdquest.github.io/learn-gdscript/

Ну и документацию тоже читай.
https://docs.godotengine.org/en/stable/getting_started/step_by_step/index.html
Аноним 24/05/24 Птн 22:34:36 #151 №952971 
>>952970
>https://gameprogrammingpatterns.com/contents.html
А это актуально для годота? Я смогу потом написать убивцу Death Stranding, став кодзимагением? М? МММ?

>Это не архитектура, лол, у тебя самой базы нет.
Ээээххх. Как же...

>Есть такая обучающая игрушка:
>https://gdquest.github.io/learn-gdscript/
Пасиб, позырю.

>Ну и документацию тоже читай.
Я вот от про слышал, что документация - это душнильная параша для лохов.
Аноним 24/05/24 Птн 22:46:15 #152 №952974 
>>952969
>Я первый раз в кодинг пытаюсь, еще пока не понимаю что значат все эти func и var.

Тебе тогда рано в паттерны. Вложенные циклы и с ифами тебе будут мозговой процессор переполнять, до понимания паттернов там как до китая.
Аноним 24/05/24 Птн 22:55:26 #153 №952975 
изображение2024-05-25025416862.png
>>952974
Я сразу хочу научиться програсмировать правильно и годно.
Начал вот пилить астероид шутанчик, но пока еще не оче понимаю что я делаю не правильно.
Аноним 24/05/24 Птн 23:00:52 #154 №952976 
>>952971
>написать убивцу Death Stranding
Дед Стренд помер 15 тредов назад: >>882182 →

Документацией не брезгуй, она тут хорошая.

>>952975
>что я делаю не правильно
https://docs.godotengine.org/en/stable/tutorials/scripting/gdscript/static_typing.html
Аноним 24/05/24 Птн 23:06:44 #155 №952979 
>>952976
Там на англиском, я не знаю англиского.
Есть на русском?
Аноним 24/05/24 Птн 23:11:41 #156 №952980 
>>952979
>я не знаю англиского
Как ты игоры делоть собрался без английского? Самые подробные и качественные материалы - на английском, зачастую совсем без перевода.

На русский перевод есть/был, но он не завершён:
https://docs.godotengine.org/ru/4.x/tutorials/scripting/gdscript/static_typing.html
Но трансляторы типа deepl и прочие нейронки уже достаточно хорошо переводят, понимают контекст.
Аноним 24/05/24 Птн 23:18:35 #157 №952982 
>>952975
Сразу не будет. Правильно и годно не бывает нигде и никогда.
Аноним 24/05/24 Птн 23:18:51 #158 №952983 
>>952980
>Как ты игоры делоть собрался без английского?
Ну у меня уровень - лет ми спик фром май харт. Такого хватит?
Просто я где-то на 99.9% понимаю техническуб документацию, но по всей видимости самое главное не могу понять и туплю оче много, часто из-за этого фейлю самые изичные залупки. Ээх.
Аноним 24/05/24 Птн 23:21:36 #159 №952985 
yafsmremotedebugshowcase.gif
yafsmstatemachineplayersignalexample.png
Смотрю кто как реализует конечные автоматы - а там повсюду match-и разной степени всратости.

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

Ну и как сделать конечный автомат без match и if?
Аноним 24/05/24 Птн 23:31:33 #160 №952988 
Так чо по архитектуре смотреть/читать, какую годноту?
Аноним 24/05/24 Птн 23:43:32 #161 №952991 
>>952988
>Так чо по архитектуре смотреть
Не знаю, ищи сам, вот какое-то видео:
https://youtu.be/7NXgrd6wbXI
Аноним 24/05/24 Птн 23:46:14 #162 №952992 
>>952991
Ну это же на английском, друг.
Неужели нет годноты на русском языке? Ну ты что?
Аноним 24/05/24 Птн 23:46:56 #163 №952993 
>>952991
>вот какое-то видео
Сам не смотрел и советуешь получается. Ээх..
Аноним 24/05/24 Птн 23:58:02 #164 №952995 
a.jpg
>>952992 >>952993
Первое видео в гугле.
Аноним 25/05/24 Суб 00:04:17 #165 №952996 
>>952971
>Я вот от про слышал, что документация - это душнильная параша для лохов.
Это тебе ультрахуйню сказали. Плюнь тому человеку в ебало.
Аноним 25/05/24 Суб 00:13:06 #166 №953000 
>>952985
> Ну и как сделать конечный автомат без match и if?
Я это делаю через коннекты и сигналы. Каждый стейт - файл-класс, в который входим одним способом и выходим несколькими возможными сигналами. В родителе подсоединяешь сигналы к следующим стейтам.

Например стейт StateFollow - внутри 2 сигнала, target_reached и target_lost. Делаю StateFollow.connect(target_reached, StateAttack) и StateFollow.connect(target_lost, StateIdle), все, теперь из следования ты переключаешься либо в атаку, либо в айдл, ни одного ифа/матча.

>>952992
Учи английский. Технический английский простой. Изначальные авторы годота испаноязычные челы, кто-то вообще из бразильских-португальских джунглей, а годот запилили и комьюнити англоязычное вокруг. Они смогли выучить, а ты нет? Кмон, брух.
Аноним 25/05/24 Суб 00:18:56 #167 №953001 
>>952996
>Плюнь тому человеку в ебало.
Ну не могу я анончику в ебало плюнуть чисто физически
Мне совесть не позволяет, ну как ты все не поймешь

>>953000
>Учи английский. Технический английский простой.
Спасибо, что посометовал.

>Изначальные авторы годота испаноязычные челы, кто-то вообще из бразильских-португальских джунглей
Типа испанский еще учить? Ну хватит уже. Пожалуйста.
Аноним 25/05/24 Суб 00:20:53 #168 №953003 
>>953001
>Типа испанский еще учить?
Нет. Комьюнити, как я сказал, англоязычное. Я к тому что изначальным разрабам тоже пришлось учить английский чтобы прийти к тому, к чему они пришли.
Аноним 25/05/24 Суб 00:45:00 #169 №953005 
>>953000
>Каждый стейт - файл-класс
Ну вот я создал, например:
state_walk.gd
state_run.gd
state_jump.gd
state_fall.gd
Потом ещё хотел "вприсядку" добавить, но уже с предыдущими файлами обосрался от количества непонятных переходов в своём коде и всё снёс.

А у меня таких стейтов, по идее, десятки должны получиться, из каждого в каждый несколько путей.

Т.е., например, прыгнуть можно и в ходьбе, и в беге; из прыжка можно падать, ходить и бежать; можно ходить и бегать вприсядку, и можно прыгать из ходьбы и бега вприсядку; можно сделать куворок из ходьбы и бега и из ходьбы и бега вприсядку, куворок может быть сразу после прыжка или сразу перед прыжком, или в полёте над землёй, или... Ещё тысячи вариантов. Как я буду между каждым файлом бегать и проверять все условия, кто куда вошёл и откуда вышел? Сложна, нужно что-то проще. Типа массива флагов:
[✅] быстро
[✅] движется
[❌] в воздухе
[✅] вприсядку
[✅] катясь колобком
[❌] с оружием в руках
[❌] пытаясь подпрыгнуть
[✅] блокирует входящий урон
И т.д. Тут сразу видно, что происходит, и не нужно создавать стопицот отдельных классов. Но тогда получается обмазывание множеством match/if...
Аноним 25/05/24 Суб 00:50:03 #170 №953006 
>>953005
>Как я буду между каждым файлом бегать и проверять все условия, кто куда вошёл и откуда вышел?
Если тебе нужны длинные цепочки стейтов то ты хранишь историю переходов и смотришь на нее. Проверяешь эту историю в стейте, если она не подходит - ливаешь из стейта, передаешь контроль следующему кандидату. Но вообще тут я хз, длинные цепочки я не делал.
Аноним 25/05/24 Суб 01:22:09 #171 №953007 
>>953005
Ваще изи делается. Если ты не знаешь, как такую простейшую механику реализовать, то странно, как ты вообще браузер запустить смог и зайти в этот трежд. Мда уш.
Аноним 25/05/24 Суб 01:30:01 #172 №953008 
>>953007
Давай вот без этого, все мы тут еще учимся. Как бы ты реализовал?
Аноним 25/05/24 Суб 01:56:19 #173 №953009 
>>953005
>быстро
>движется
>в воздухе
>вприсядку
>катясь колобком
>с оружием в руках
>пытаясь подпрыгнуть
>блокирует входящий урон
Вот это уже 256 возможных состояний получается. Допустим, некоторые из них не имеют смысла, но всё равно большое количество разных состояний. Я читал про иерархические автоматы, но какая тут иерархия, если все действия примерно равны?

Для NPC такое решается через utility system...
https://en.wikipedia.org/wiki/Utility_system
Хммм, а если задействовать это для игрока? Игрок прожимает клавиши, а моделька реагирует на это по расчётной полезности... К примеру, игрок зажал:
- W чтобы двигаться вперёд;
- Ctrl для приседания;
- пробел для прыжка.
Но моделька уже находится в полёте и может только дрыгать ножками => по формуле выводит, что сейчас продолжаем беспомощно дрыгать ножками. Никаких десятков состояний с переходами тут уже не нужно.

>>953007
>такую простейшую механику реализовать
Так это не механика, это как раз архитектура. От неё зависит гибкость дальнейшей разработки.
Аноним 25/05/24 Суб 02:09:42 #174 №953011 
>>953008
>Как бы ты реализовал?
На изи.
Аноним 25/05/24 Суб 02:19:27 #175 №953012 
>>953011
Понятно с тобой.
Аноним 25/05/24 Суб 02:25:53 #176 №953013 
>>953012
Спасибо.
Аноним 25/05/24 Суб 02:49:16 #177 №953014 
d9a9ab6af4a74424c26dcace549944d4.jpg
>>953011
>>953012
>>953013
Ну и что ты тут устроил?
Аноним 25/05/24 Суб 02:52:18 #178 №953015 
>>953014
Прости пожалуйста. Меня взрослые подучили.
Аноним 25/05/24 Суб 03:34:29 #179 №953017 
Почему годот плохой движок для 3д игорей?
Вот прям спокойно, не торопясь, по пунктам...
Аноним 25/05/24 Суб 03:56:02 #180 №953018 
>>953009
>Вот это уже 256 возможных состояний получается
Если делать ветвлением - то да.
Поэтому существует компонентный подход:

Один компонент отвечает за движение
Другой за скорость
Третий за полёт
Четвёртый за присядку
Пятый за качение колобком
Шестой за оружие
Седьмой за прыжки
Возьмой за блокирование урона

Итого у тебя 8 компонентов, каждый внутри себя имеет 2 простых состояния. И одно кольцо, чтобы править всеми - персонаж объединяет компоненты внутри себя. У персонажа в конечном итоге будет 256 состояний, да. Но явным образом описать надо всего 16. Это компонентный подход.

>>952985
Ты не вкурил. На самом деле у тебя на пикрилейтедах ДВЕ стейт-машины: одна отвечает за анимации и встроена в движок, другая отвечает за перемещение и написана туториалоблогером для нубов, чтобы они познавали силу стейт-машины, при этом оставаясь в рамках доступных им знаний. Я полностью поддерживаю такой подход, потому что это усложнение на один пункт. К ранее изученной базе прибавляется только машина состояний и ничего более.

Вот усложнение на два шага. Здесь мы осваиваем машину состояний и использование типа Callable. А для кого-то, возможно, сразу три шага, потому что тут ещё и словарь используется на манер луа-таблицы.

# описываем, что делают состояния, здесь
func idle(delta):
блабла

func walk(delta):
блобло

func jump(delta):
блэблэ

# словарь, в котором перечисляются все стейты
var states = {
idle = idle, # здесь слева именуется поле словаря, а справа ссылка на объявленную и описанную выше функцию
walk = walk, # то есть, это как бы states.walk = walk
jump = jump, # и даже то же самое, что states["walk"] = walk
}

func _in_StateMachinePlayer_updated(state, delta):
if states.has(state): # эту проверку можно убрать, если ты стопроцентно уверен, что эта функция не будет вызвана с неправильным стейтом
states[state].call(delta)
Аноним 25/05/24 Суб 04:03:36 #181 №953019 
Почему has_method - залупа из под коня?
Аноним 25/05/24 Суб 06:20:56 #182 №953024 
>>953019
В прошлом треде обсуждали, полистай.
Аноним 25/05/24 Суб 06:28:12 #183 №953025 
>>953024
Нууу чеел. Я сейчас занят изучением англимского и испанского языка...
Аноним 25/05/24 Суб 07:42:38 #184 №953027 
>>953005
> обосрался от количества непонятных переходов в своём коде и всё снёс
Не мучайся и возьми готовое. https://godotengine.org/asset-library/asset/1778
https://www.youtube.com/watch?v=E9h9VnbPGuw
Аноним 25/05/24 Суб 08:45:16 #185 №953028 
1716615914236.png
1716615914259.png
>>952938
>>952947
Ладно, короче, я наверное хуйни насоветовал вчера. Делай как тебе удобнее. Вот финишный вариант моей системы. С декларативным переключением стейтов, йопт! Кому надо забирайте, а я пошёл.
Аноним 25/05/24 Суб 09:40:27 #186 №953032 
>>953017
1. Мало готовых 3D ассетов для флипанья.
2. Не исправляет ошибки дизайнера за него.
Вот и всё, в остальном замечательный движ.
Аноним 25/05/24 Суб 10:07:52 #187 №953034 
s.png
>>953018
>8 компонентов
Ну так это понятно. Что с ними делать непонятно. Компонентный подход не решает задачу, только изменяет организацию кода (1 файл => 9 файлов).

>на пикрилейтедах ДВЕ стейт-машины: одна отвечает за анимации и встроена в движок
Не, там велосипедный аддон:
https://github.com/imjp94/gd-YAFSM

>func walk(delta):
А если стейту нужен PhysicsDirectBodyState3D?

>>953027
>готовое
Там всё как у всех, пикрил. Где интегрейт? Верно, бери исходники и костылируй в них интегрейт... Без костылей и лапши не получается. А весь смысол конечных автоматов - упорядочить код так, чтобы в нём не осталось места для лапши. Не получается.

>>953028
Прикольно, конечно. Молодец.
Аноним 25/05/24 Суб 10:21:39 #188 №953036 
>>953019
>has_method
Да не, нормально всё, если ты не делаешь это тыщу раз каждый кадр. Утиная типизация:
>if animal.has_method("quack"): animal.quack() # утка
Для ускорения можно использовать StringName:
>const QUACK = &"quack"
>if animal.has_method(QUACK): animal.quack()
В остальном затраты как у обычных вызовов.

Не путайте этот подход с сигналами. Сигналы - это когда тебе заранее всё известно и ты связываешь несколько объектов проводами. Утиная типизация нужна, когда к тебе пришло хрен знает что, но ты должен с ним сделать что-то конкретное.
Аноним 25/05/24 Суб 10:36:38 #189 №953037 
>>953019 >>953036
Есть такая проблема, почти 6 лет не решена:
https://github.com/godotengine/godot/issues/22838
has_method не видит static func...
Аноним 25/05/24 Суб 10:38:45 #190 №953038 
>>953034
> Верно, бери исходники и костылируй в них интегрейт
А ты как хочешь?
Нарисуй схему в пейнте.
Аноним 25/05/24 Суб 10:43:21 #191 №953040 
>>953037
> has_method не видит static func
Он его и не должен видеть.
Статик-функции это костыль всех "ООП-языков". Сам принцип ООП-языка, "всё есть объект, всё есть метод" - вреден и костылен. Потому что когда нужна просто функция, язык не позволяет без задней мысли объявить императивный модуль с простофункциями, нет, будь добр объявить класс, который тебе нахуй не нужен, а в нём объяви статический метод, который ты будешь использовать как функцию.

10 лет меня это бесит, угнетает, аштрисёт!
Аноним 25/05/24 Суб 12:10:21 #192 №953050 
>>953017
Я заебался пиксели рисовать и вторую игру в лоуполи 3д делаю - особых проблем не испытываю. Ассеты и там и там свои.
Аноним 25/05/24 Суб 12:11:58 #193 №953051 
>>953050
>игру в лоуполи 3д делаю
Покажи, что получается. Интересно.
Аноним 25/05/24 Суб 12:18:44 #194 №953052 
>>953040
>язык не позволяет без задней мысли объявить императивный модуль
На Паскале вот можно, а это ООП язык:
>Paradigms: Imperative, structured, object-oriented, functional, component-based, event-driven, generic

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

>Статик-функции это костыль
>когда нужна просто функция
Костыль - это анонимные функции, которые ты объявляешь где попало, потому что тебе лень стрелочки на клавиатуре нажимать лишний раз.

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

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

Меня больше бесит неспособность GDScript сделать наследника одного из встроенных классов: Array, Dictionary и т.п. не существуют в потомках Object, следовательно, из них нельзя сделать свой вариант. Пришлось сделать ArrayUtils со static методами - вот это уже костыль, но не из-за ООП, а из-за GDScript.
Аноним 25/05/24 Суб 15:21:15 #195 №953081 
>>953052
> На Паскале вот можно, а это ООП язык:
Паскаль - мультипарадигменный. О чём прямо говорит твой же гринтекст, парадигмы во мн.ч. и через запятую перечислены.
К сожалению, паскаля в годоте нет.

> смысл статических методов
> когда тебе нужно связать метод с конкретным классом
Единственная конкретность там в том, что у тебя имя метода состоит из класс.имя() какая ещё связь-то?
Поэтому смысл статических методов в ООП-языках, как я и сказал выше, в том, чтобы через пень-колоду эмулировать мультипарадигму, а именно модульность того же паскаля. Причём в том же паскале началась та же самая дрисня, зумеры забыли, что есть просто функции, просто процедуры, и сделали статик-процедуры в ФПК, и класс-процедуры в дельфи. Что это, я не понимаю. Ебашить велосипеды поверх велосипедов, лишь бы не как диды?

> Костыль - это анонимные функции
Но мы сейчас не про них.

> Почему? Ведь так оно и есть.
В упомянутом тобой паскале так не есть. Там можно сделать программу без единого класса вообще. Без ООП вообще. Исключительно на императивных модулях.

> Лучше ООП может быть только язык
ООП не язык, ООП - парадигма. А классы это лишь одна из реализаций этой парадигмы. Существуют и другие реализации, например, на прототипах (жс), или на типажах (раст). Но в классическом паскале ООП был на типах, просто типах. Классы пришли позднее, как зумерская мода выебываться не как диды. Описываем тип. Описываем реализацию типа. Создаём экземпляры. Работаем.

> Пришлось сделать ArrayUtils со static методами - вот это уже костыль
Но мы сейчас не про них.
Аноним 25/05/24 Суб 16:41:20 #196 №953090 
>>953081
>паскаля в годоте нет
При желании добавить можно.

>какая ещё связь-то?
В GDScript нет статических полей, к сожалению, но если бы были, то можно было сделать что-то такое:
>static func Enemy.spawn():
>_ if Enemy.spawn_count > 0:
>_ _ Enemy.spawn_count -= 1
>_ _ return Enemy.new()
>_ return null
Сейчас тебе обязательно нужен экземпляр класса, чтобы провернуть подобное, или использовать баг в реализации констант, но его могли уже пофиксить.

С другой стороны, да, такой прикол лучше не делать, лучше сделать отдельный EnemySpawner, экземпляр которого имеет собственный счётчик, который удаляется вместе с экземпляром. Видишь, в чём проблема таких функций? Они засоряют глобальное пространство в памяти, что трудно контролировать.
>func EnemySpawner.spawn():
>_ if spawn_count > 0:
>_ _ spawn_count -= 1
>_ _ return Enemy.new()
>_ queue_free()
>_ return null
И вот мы решили сразу несколько проблем.

>Там можно сделать программу без единого класса вообще. Без ООП вообще. Исключительно на императивных модулях.
Да, можно, но ООП подразумевает дополнительный уровень защиты от (архитектурных) ошибок... Думаю, поэтому языки отказались от "бездомных" функций.

>Но в классическом паскале ООП был на типах, просто типах. Классы пришли позднее
Я так и не понял, в чём разница между Object и Class кроме того, что Object передаётся целиком так же как Record, а Class всегда по ссылке. В остальном - синтаксис через точку что там, что здесь, особой разницы со стороны внешнего наблюдателя нет.

Вообще, для меня ООП - это синтаксис через точку, всё остальное - незначительные детали внутренней реализации, которые меня волновать не должны:
>ссылка на кого = Категория.кто-то новый (какой)
>что сделал = кто.что сделает (с чем сделает)
И так далее. Вот в этом преимущество ООП - тебе не нужны бессвязные функции, потому что их некому выполнять, если они совсем-совсем ничейные:
>что сделал = что сделает (с чем сделает)
Кто это сделал? Непонятно. Приходится костылить:
>что сделал = что сделает (кто, с чем сделает)
>что сделал = кто_что сделает (с чем сделает)
Но это по сути то же самое, что и через точку.
Аноним 25/05/24 Суб 20:59:57 #197 №953117 
ssd59fc43cc4dcbf33d404e576adb6f9067fc8dc51.jpg
ss1c1b16cec47404757f85f82139d7c0e9267d4397.jpg
ss198fd740faf8dda9a09db1cf494f0fa960b6129b.jpg
ss5559cc91cdee5d967a5c752f947e0d029532d6eb.jpg
>>951925 (OP)
Вдохновляюще графонистая игра на Godot 4:
https://store.steampowered.com/app/2463360/
Аноним 25/05/24 Суб 22:12:54 #198 №953122 
Screenshot34.png
0618-1625.mp4
Простые модели все чаще редактирую и делаю сам, чем скачиваю, такие как двери и окна.
К взаимодействию с Interactable объектами добавил возможность переключаться на привязанную к этому Interactable камеру, как в видео с постером.

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

OBS почему-то начал записывать игру из Debug-режима с каким-то дерганным FPS, хз что случилось. Играется гладко.
Аноним 25/05/24 Суб 22:14:56 #199 №953123 
image
>>953117
Весьма недурно для 2005 года.
Аноним 25/05/24 Суб 23:35:16 #200 №953128 
>>953122
Так в годоти есть встроенный муви мейкер жи. Выдает на выходе ровный фпс, но не любит анимированные текстуры.
Аноним 25/05/24 Суб 23:46:09 #201 №953129 
Игры-то делаете?
Аноним 25/05/24 Суб 23:59:05 #202 №953130 
1716670743344.png
>>953090
> В GDScript нет статических полей, к сожалению, но если бы были, то можно было
Пикрелейтед.
Аноним 26/05/24 Вск 00:03:37 #203 №953132 
>>953122
> наклевались зачатки основного сюжета. Правда религиозного, православного характера
Главное, чтоб не получился клон индики.
Аноним 26/05/24 Вск 00:18:47 #204 №953133 
>>953130
О, уже добавили? Когда успели?
https://godotengine.org/article/godot-4-1-is-here/#gdscript

А ты мог бы просто кинуть ссылку на документацию:
https://docs.godotengine.org/en/stable/tutorials/scripting/gdscript/gdscript_basics.html#static-variables

Просто запомнил то длинное обсуждение на гитхабе, много спорили надо/не надо...
Аноним 26/05/24 Вск 00:33:19 #205 №953135 
obs.png
>>953122
>OBS начал записывать игру с дерганным FPS
Покопайся в настройках, там всё легко настроить.
Аноним 26/05/24 Вск 01:06:13 #206 №953142 
1716674729693.mp4
>>953135
Да, стало получше, спасибо. Но моя нищепекарня всё равно еле-еле вывозит.
мимо
Аноним 26/05/24 Вск 07:45:33 #207 №953154 
Какой самый элегантный способ спрайту иметь несколько текстур и менять их по мере надобности? Иметь несколько спратов в одной точке, все вместе перемещать, и чтобы отображался только один из них это очевидное решение, но может есть какое-то более элегантное?
Аноним 26/05/24 Вск 08:58:49 #208 №953156 
>>953154
Там есть два метода равноэлегантых, выбирай какой тебе удобнее:
1) свойство фрейма анимации, задаёшь сколько у тебя равных фреймов по горизонтали и вертикали, спрайт разрезается внутри по заданной тобой сетке, и показывает только один фрейм. Индекс ты можешь менять сам когда захочешь.
2) свойство региона. Задаёшь ручками регион спрайта, которых хочешь выводить. И всё.
Аноним 26/05/24 Вск 09:03:27 #209 №953157 
>>953156
Спасибо! То, что надо!
Аноним 26/05/24 Вск 09:12:17 #210 №953158 
Зачем нужеy emit signal, если к ноде можно обратиться напрямую через $?
Какой способ производительнее?
Аноним 26/05/24 Вск 09:12:54 #211 №953159 
И еще, как лучше всего организовать обмен данными между сценами?
Аноним 26/05/24 Вск 09:28:27 #212 №953160 
>>953158
> Какой способ производительнее?
Вниз по дереву - обращаешься через $; вверх по дереву - обращаешься через сигналы, которые подключает нода сверху ноде снизу.
>>953159
> как лучше всего организовать обмен данными между сценами?
Через шины (гуглим).
В случае с деревом шина уже есть, - это сам корень дерева. Но для пущего удобства в настройках проекта можно добавить отдельную сцену в автозагрузки, она сделается прямым потомком корневого узла и будет видна всем остальным узлам, как синглтон.
Аноним 26/05/24 Вск 09:31:00 #213 №953161 
>>953160
Благодарен.
Нихуя себе как много я еще не знаю.
Аноним 26/05/24 Вск 09:33:29 #214 №953162 
>>953161
И ещё.
Щас прибегут диванные безыгорники и начнут кудахтать про синглтон-антипаттерн. Не слушай их и не бойся синглтонов. В том же анриле, например, вся архитектура построена на синглтонах и никто не жалуется.
> как много я еще не знаю
Читай официальные доки (ссылки в шапке).
Переводи автопереводчиком, если не умеешь в инглиш. Доки подробные и качественные. В треде не всегда быстро ответят, вот я щас попью кофе и сваливаю ИРЛ.
Аноним 26/05/24 Вск 11:44:11 #215 №953171 
>>953162
>начнут кудахтать про синглтон-антипаттерн
Но ведь сами движки используют синглтоны. Вообще, все эти рекомендации из энтерпрайза не относятся к геймдеву. Более того, они даже вредны, если им следовать.

Интересный контент
https://gameprogrammingpatterns.com/contents.html
Аноним 26/05/24 Вск 12:06:05 #216 №953174 
>>953158
>Зачем нужен emit signal
https://docs.godotengine.org/en/stable/getting_started/step_by_step/signals.html
Вкратце: сигнал - это событие. Ты можешь сделать несколько мест в коде, которые реагируют на одно и то же событие, а соединить их через редактор.

К примеру, у тебя есть генератор звука и генератор частиц взрыва, ты можешь подключить их к событию нажатия кнопки Button.pressed и тогда по нажатию кнопки будет производиться звук и генерироваться частицы. Теперь ты решил - что-то тут не так, и перекинул соединения с кнопки на Timer.timeout, чтобы те же события происходили по происшествию времени. Код при этом никак менять не нужно, меняется только описание сцены (.tscn).

Такое соединение игровых сущностей становится наиболее выгодным, когда тебе нужно часто переиспользовать одну и ту же сцену в разных местах. Вот у нас есть Button в движке, но она не подходит для размещения на стенах в 3D играх, верно? Ты делаешь свою собственную сцену Button3D, которая объявляет свой сигнал signal pressed, и которую можно поместить в 3D мире, чтобы игрок мог с ней взаимодействовать в пространстве (press E to...). Теперь тебе достаточно закинуть эту Button3D в любое место сцены и подсоединить её сигнал к методам какого-либо другого объекта, например, гаражной двери, лампочки, радио и т.д. При этом ты можешь закинуть просто кнопку, ни с чем её не соединяя - и она по-прежнему будет работать, хоть её нажатие и не влияет ни на что (нет обработчиков).

>к ноде можно обратиться напрямую через $?
Так ты связываешь код с к конкретной сценой, в случае с кнопкой у тебя будет $lamp.enable = true, но что, если теперь тебе не лампа нужна, а радиоприёмник или дверь? Ты же не будешь создавать тысячу скриптов типа button_lamp, button_door, button_radio и т.д., в каждый из которых отличается от остальных только строчкой с $.

Конечно, можно написать так:
>@export var node: Node
>node.do_something()
Но во-первых, если мы хотим соблюдать строгую типизацию, возникают трудности с тем, что можно положить в эту переменную, а во-вторых, если ты забудешь положить туда ноду или нода по какой-то причине исчезнет из сцены, твой скрипт сломается. Конечно, можно добавить проверку if node: node.do..., но это не решает всех проблем, т.к. инвалидная ссылка не всегда null, и единственный надёжный способ проверки - через WeakRef...

>Какой способ производительнее?
Тут вопрос не в производительности, а в удобстве и гибкости разработки. Но сигналы, по идее, быстрее обращения через $, потому что:
- $нода - это сокращение self.get_node("нода")
- строка "нода" создаёт новый объект NodePath
- get_node() как-то ищет ноду в дереве нод
- только потом вызывается метод ноды.
С сигналами, если у тебя что-то привязано к сигналу, оно сразу выполняется, и поскольку это один из самых важных концептов движка, внутри оно наверняка очень сильно оптимизировано (сигналы буквально на всех нодах).

Ты можешь ускорить обращение через @export ноды или через @onready, заранее получив ссылку на ноду, но это не решает тех проблем, описанных выше.

>>953159
>организовать обмен данными между сценами
Что ты имеешь в виду? Если ты используешь для смены сцены встроенную функцию SceneTree.change_scene, то я не рекомендую так делать - лучше заменять часть дерева целой сцены, так у тебя будет больше контроля. Если всё же хочешь заменять сцены этой функцией, то тебе придётся добавлять ноды в "автозагрузку" и передавать данные через эти ноды - они никак не затрагиваются "сменой сцены".

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

>>953171
>сами движки используют синглтоны
Потому что у тебя не может быть два экземпляра Engine, два экземпляра OS. А вот для экземпляра Player, два экземпляра WorldMap и т.д. - запросто. Новички обманываются синглтонами и потом не могут понять, почему движок не даёт им создать второго Player без кучи фатальных ошибок в коде.

В большинстве игр синглтоны не нужны. Синглтон нужен только если тебе вот прям обязательно нужно выбить в граните "сцена God может быть лишь одна и обращаться к ней нужно только с большой буквы". Естественно, что это очень вредный антипаттерн.

Этого не слушай, он уверовал в Синглтон и теперь проповедует о его могуществе ньюфагам: >>953162
>Не слушай их и не бойся синглтонов.
Ага, обязательно обмазывай весь код кучей лишних Имён, которые потом хрен вырежешь из кода, когда они неизбежно пукнут и обмякнут кучей ошибок.

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

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

>В том же анриле
>никто не жалуется.
Это потому что:
- ААА студии сами могут переделать движок;
- нищих индюков никто слушать не будет, лол;
- синглтоны движка != скриптолапша твоей игры.
Аноним 26/05/24 Вск 12:10:37 #217 №953175 
>>953174
>перекинул соединения с кнопки на Timer.timeout
>Код при этом никак менять не нужно
Чёт не подумал сразу. На самом деле, у сигналов с разными аргументами должны быть разные обработчики... По крайней мере, если ты хочешь статическую типизацию... Совсем без изменений в коде можно перекинуть только сигналы с одинаковыми аргументами (особенно их количеством).
Аноним 26/05/24 Вск 13:06:39 #218 №953182 
>>953174
>инвалидная ссылка не всегда null
Поэтому надо не
if node:
, а
if is_instance_valid(node):
Аноним 26/05/24 Вск 13:13:07 #219 №953184 
>>953182
>is_instance_valid
Раньше с ней проблемы какие-то были.
Алсо, мне не нравится такая длинная запись...
Аноним 26/05/24 Вск 13:18:53 #220 №953185 
хорошо.png
плохо.png
синглолапша.png
>>953160 >>953162
>Через шины
>отдельную сцену в автозагрузки
>видна всем остальным узлам, как синглтон
>не бойся синглтонов
Вот тебе иллюстрации возможных архитектур игры.
Какую себе возьмёшь, какую конкуренту оставишь?
Аноним 26/05/24 Вск 13:28:51 #221 №953187 
>>953185
Почему шина - плохо, а екс - хорошо?
Аноним 26/05/24 Вск 13:49:36 #222 №953190 
ecs в фантазии.png
ecs в реальности.png
геймдев.jpg
>>953187
Где ты там ECS увидел? ECS совсем про другое.
Аноним 26/05/24 Вск 16:14:16 #223 №953208 
как из шейдера колор экспортнуть с колор пикером а не vec4?
Аноним 26/05/24 Вск 16:33:34 #224 №953210 
>>953208
Уже сам нашел, надо было тип hint_color source_color поствить

Теперь не дает назначить COLOR и пишет что это константа
Аноним 26/05/24 Вск 16:37:52 #225 №953213 
>>953210
Надо было ALBEDO юзать оказывается.

Классная документация, кайфую. Стена текста больше чем этот тред и простого примера как прокинуть цвет и покрасить им пиксели нет.
Аноним 26/05/24 Вск 17:14:58 #226 №953214 
SINGLETONS.gif
Вы всё ещё хотите синглтоны?
Аноним 26/05/24 Вск 17:25:30 #227 №953215 
>>953213
>Классная документация, кайфую. Стена текста больше чем этот тред и простого примера как прокинуть цвет и покрасить им пиксели нет.
Документация хорошая, просто она не для тебя.

Ищи туториалы для самых маленьких.

Алсо, судя по твоим вопросам рано тебе в шейдеры.
Аноним 26/05/24 Вск 17:31:19 #228 №953216 
>>953214
Абсолютно норм. На то они и "звездные объекты". Только долбаеб будет делать синглтоном 100500 незначительных объектов. Шина тоже звездный объект.
Аноним 26/05/24 Вск 17:45:40 #229 №953220 
>>953216
Если быть точнее то без глобальных переменных ни одна сложная программа не обойдется. У каждой сложной программы по крайней мере есть Composition Root https://medium.com/@cfryerdev/dependency-injection-composition-root-418a1bb19130
Аноним 26/05/24 Вск 17:58:36 #230 №953227 
>>953220
Как-то хуево пояснил.
1) Даже если у тебя код модульный и все круто, в программе нет глобальной области видимости. У тебя есть модуль с состоянием. Ты этот модуль импортирует в 100500 других модулей. Состояние глобальное.
2) Ты не можешь программировать без глобального состояния. Ты не можешь с помошью ивентов в шине синхронизировать 100500 состояний если тебе именно требуется одно глобальное состояние
3( Ты должен организовать какой-то протокол мутирования этого состояния юзерами этого состяния.
Аноним 26/05/24 Вск 18:01:29 #231 №953228 
>>953227
То есть это не альтернатива

Шина vs Звездные объекты с глобальным состоянием

И то и то нужно
Аноним 26/05/24 Вск 18:16:19 #232 №953231 
>>953216
>звездный объект
Конкретнее давай, не выдумывай новые термины. Ты таким образом божественный объект зовёшь?

>100500 незначительных объектов
Да, лучше 1 god object, который всё про всех лучше всех знает и всё на свете умеет без посторонней помощи. Зачем тебе вообще ООП, зачем тебе ноды, ресурсы и вообще какой-то там движок, если ты можешь всю игру в один скрипт уместить?

>>953220
>без глобальных переменных ни одна сложная программа не обойдется
БЕЗ ВОДЫ ТЕБЕ НЕ ВЫЖИТЬ
@
ВЫПИЛ 10 ЛИТРОВ ЗА ЧАС И УМЕР
@
НО ГОВОРИЛИ ЖЕ ЧТО БЕЗ ВОДЫ НЕ ВЫЖИТЬ


>>953227 >>953228
Понятия не имею, о чём вы теперь спорите, но я подорвался на всех этих глобальных сущностях несколько раз и больше не собираюсь.

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

И чем дальше - тем только хуже.

Конечно, всё относительно. API движка мы вообще не рассматриваем в этом споре - не надо про Input и прочее, ведь движок вы не каждый день меняете.
Аноним 26/05/24 Вск 18:28:24 #233 №953232 
>>953231
Это я все один писал.
>не выдумывай новые термины. Ты таким образом божественный объект зовёшь?
Глобальный стейт.
>Да, лучше 1 god object, который всё про всех лучше всех знает и всё на свете умеет без посторонней помощи.
Не он обо всех знает, а все про него знают. Это две больших разницы.
Я сказал что без глобального стейта программы не пишутся. Так что нет альтернативы синглтоны (или что-то другое что этот глобальный стейт хранит) или события.
>В этом один из фундаментальных принципов ООП - инкапсуляция.
Инкапсуляция тут не причем если тебе нужно врямя суток в игре сделать, и тобы все обекты игры на это время суток реагировали
Аноним 26/05/24 Вск 18:53:39 #234 №953234 
IMG20240526205232010.jpg
Годэтты годанам.
Аноним 26/05/24 Вск 19:27:50 #235 №953235 
md21pcmfp9b41.png
Безымянный.png
>>953234
Добро пожаловать.
http://reddit.com/r/godot/comments/epvj7l/
Аноним 26/05/24 Вск 20:35:13 #236 №953238 
>>953235
Я с телеги принёс
Аноним 26/05/24 Вск 20:39:12 #237 №953240 
>>953235
>4 yr. ago
Я думал это анончик сделал. А это какое-то старьё.
Аноним OP 26/05/24 Вск 20:42:08 #238 №953241 
1716745327007.jpeg
>>953240
> 4 yr. ago
Sad frog so sad in this thread.
Аноним 26/05/24 Вск 20:55:34 #239 №953243 
1716746127724.mp4
>>953241
Эй, ОП, сходи на скуфуслуги, выпиши себе альтушку!
Аноним 26/05/24 Вск 21:27:28 #240 №953246 
Untitled.png
>>953232
>без глобального стейта программы не пишутся
Наличие у программы глобального состояния не значит ни что об этом состоянии должны знать все компоненты программы, ни что это состояние должны мочь модифицировать любые компоненты программы. Если у тебя где-то в глобально доступном месте есть галочка "игрок проиграл", её могут видеть и изменять любые части игры - это хорошо? Допустим, что это не плохо - но зачем так делать? Ты планируешь читать/изменять это состояние из случайной строчки кода в случайном файле? Нет? Тогда зачем она глобально всем доступна? Запакуй её куда-нибудь подальше и выдавай строго по разрешению, чтоб никто не мог тайком её дёргать. Даже если ты работаешь один - накодишь что-то в плохом настроении, а через неделю не разберёшься, что ты накодил.

>если тебе нужно время суток в игре сделать
Делаю систему времени и размещаю её в игровом мире, который не является глобальной сущностью.

>и чтобы все объекты игры на это время суток реагировали
Зачем всем объектам игры реагировать на время суток? У тебя в любой игре будет масса объектов, которым время суток вообще никак не нужно - а оно у тебя отовсюду доступно. Ещё меньше будет объектов которые могут как-то повлиять на течение времени - а оно у тебя кем угодно изменяется.

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

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

На пикриле у системы времени строго определённое место в дереве сцены и доступ к ней регулируется. Если ты не используешь хрень вроде get_parent().get_parent() или get_node("/"), а корректно объявляешь @export в нодах, легко понять, кто получает доступ к системе времени. Тут не будет внезапных строк вида "WorldTime.time" где-то в середине 1000-строчного скрипта, в заголовке которого (и инспекторе) нет ни слова о системе времени. Ты можешь заменить систему времени на альтернативную или вообще заткнуть пустой заглушкой, чтоб исключить её из геймплея. Можешь создать несколько миров с разными системами времени, в которых будут полностью независимые ИИ, живущие по разным графикам. И если ты перетащишь свою систему ИИ в новый проект, тебе не обязательно срочно объявлять систему времени или переносить вместе с системой ИИ старую систему времени - она сможет работать и без неё (скажем, твои NPC могут жить вне времени, если данных об актуальном времени почему-то нет).

Нет, я не говорю, что все должны делать именно так. Но я на грабли синглтонов наступил несколько раз и результат мне не понравился. Это только в самом начале кажется удобно, пока о будущих проблемах ничего не знаешь.
Аноним 26/05/24 Вск 21:32:03 #241 №953247 
>>953246
> Untitled.png
Контент для следующего ОП-поста на перекате.
Аноним 26/05/24 Вск 21:49:59 #242 №953248 
>>953185
Во-первых, ты безыгорный шиз, который воюет с синглтонами.
Во-вторых, почему шина на второй картинке не синглтон?
В-третьих, что означают стрелочки?
Аноним 26/05/24 Вск 22:34:29 #243 №953256 
>>953248
>ты безыгорный
Есть прототипы игр, я в них играю.

>воюет с синглтонами
Потому что жопа сгорела с них.

>на второй картинке не синглтон
По-быстрому накидал же, долго не думал.

>что означают стрелочки
Ну, типа, кто кем владеет/управляет:
А -> Б
А командует Б как захочет (дёргает методы и поля).
Б может только просить А (излучает сигналы).

"Call down, signal up", забыл что ли?
Аноним 26/05/24 Вск 22:45:41 #244 №953260 
0518-2160.mp4
Завез отопление, продолжил меблировать комнату. Много же времени это занимает. Все думаю, поставить ПК или нет. Если ставить, то обыгрывать это дело придется. Время событий, ориентировочно - середина/конце девяностых.

Внезапно обнаружил что glTF версия моделей на скетчфабе уже имеет ao/metallic/roughness текстуры сплавленными в одну orm-текстуру. Вот бы времени сэкономил если бы удосужился посмотреть раньше.

Нашел в найстроках захвата экрана OBS параметр скорости захвата и поставил "fastest", запись снова стала гладкой. Странная фигня.
Аноним 26/05/24 Вск 22:54:51 #245 №953262 
>>953260
На лето горячую воду отключать планируешь?
Аноним 26/05/24 Вск 22:58:00 #246 №953264 
aDXaDMBA700w0.jpg
>>953262
Аноним 26/05/24 Вск 23:03:42 #247 №953265 
>>953260
Выглядит лампово. Мне нравится.
Аноним 26/05/24 Вск 23:25:52 #248 №953269 
>>953260
Кстати, не хочешь отдельный тредик запилить? Чтобы там отслеживать твой прогресс.
Аноним 26/05/24 Вск 23:58:26 #249 №953277 
>>953260
Этой батареи на цех хватит
Аноним 27/05/24 Пнд 05:31:02 #250 №953290 
>>953265
Здорово, я боялся что будет выглядеть как слишком разностилизованная мешанина.

>>953269
Та нет. В любой момент забросить могу. Плюс разбавлю тред споров местных Кодзим о том как правильно надо.

>>953277
Да, надо бы уменьшить.
Аноним 27/05/24 Пнд 09:39:41 #251 №953305 
>>953260
Выглядит-то лампово, но где геймплей?
Хорошо, ты продемонстрировал всем, что умеешь красиво флипать ассеты в ВСЖ-стиль. Молодец. Теперь возвращайся к блокингу и пили уже геймплей. Иначе велика вероятность, что уже напиленные тобой квартиры придётся долго и нудно переделывать.

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

И да, я безыгорник, напоминаю, я диван, у меня нет имени, у меня нет авторитета.
Аноним 27/05/24 Пнд 09:41:56 #252 №953306 
>>953305
Я не он, но будем откровенны, своей игрой тут вряд кто-нибудь озолотится. Делонье игрочьтки - для местных больше хобби, чем способ заработка, так что надо делать то - что больше интересно.
Аноним 27/05/24 Пнд 09:52:01 #253 №953309 
>>953306
Заработок тут не при чём. Я бы поиграл в сх-лайк от анона, но с таким подходом, он наиграется в декорацию сценок с брождением по ним в дебаге и отыгрышем в голове. И всё. Ничего кроме видосов в треде мы не увидим.
Аноним 27/05/24 Пнд 09:56:51 #254 №953311 
>>953309
Я не правильно выразился, не заработок. Я больше имел ввиду, что большинству важнее делать с удовольствием, чем сделать в итоге.
Аноним 27/05/24 Пнд 11:27:05 #255 №953325 
>>953309
>он наиграется в декорацию сценок с брождением по ним в дебаге и отыгрышем в голове
Как будто что-то плохое.

>Ничего кроме видосов в треде мы не увидим.
Ничеси, в треде будут даже видосы.
Аноним 27/05/24 Пнд 13:28:49 #256 №953350 
Тут вроде был анончик, который использовал flecs. Читаю доку и не понимаю один момент какой смысл в примере создавать компонент как энтити? https://www.flecs.dev/flecs/md_docs_2Quickstart.html#tag
Аноним 27/05/24 Пнд 14:19:15 #257 №953367 
>>953350
Архитектура на пике в начале главы.
В его реализации, и тэги и компоненты - наследники энтити.
Где-то дальше об этом пишется, можешь считать что допустимые компоненты - это такие энтити напрямую прикрепленные к миру.
https://www.flecs.dev/flecs/md_docs_2Manual.html#component-handles
Аноним 27/05/24 Пнд 14:37:00 #258 №953376 
>>953367
Понял, спасибо, квикстарт внезапно оказался быстрым, а не подробным
Аноним 27/05/24 Пнд 15:15:09 #259 №953393 
лестница.mp4
>>953305
>но где геймплей?
А у меня геймплей есть?
Аноним 27/05/24 Пнд 15:25:27 #260 №953396 
>>953393
Вот да.
Аноним 27/05/24 Пнд 16:43:34 #261 №953406 
image.png
CleanShot 2024-05-27 at [email protected]
>>951925 (OP)
Уважаемые, как сделать Camera2D текущей? Раньше был чекбокс Current, которого у меня почему-то нет.
Первый пик это из интернетов (чекбокс есть), второй пик это мой годот 4.2.2
Аноним 27/05/24 Пнд 16:54:39 #262 №953407 
>>953406
current больше нет, есть enabled, там немного другая логика.
Аноним 27/05/24 Пнд 16:55:21 #263 №953408 
>>953406
Читай документацию.
https://docs.godotengine.org/en/stable/classes/class_camera2d.html

>bool enabled = true
>Controls whether the camera can be active or not. If true, the Camera2D will become the main camera when it enters the scene tree and there is no active camera currently (see Viewport.get_camera_2d).
>When the camera is currently active and enabled is set to false, the next enabled Camera2D in the scene tree will become active.

>bool is_current ( )
>Returns true if this Camera2D is the active camera (see Viewport.get_camera_2d).

>void make_current ( )
>Forces this Camera2D to become the current active one. enabled must be true.

Перевод deepl.com для самых маленьких:

>bool enabled = true
>Управляет тем, может ли камера быть активной или нет. Если значение true, то Camera2D станет основной камерой, когда она войдет в дерево сцены и в данный момент нет активной камеры (см. Viewport.get_camera_2d).
>Если камера активна в данный момент, а значение enabled равно false, то активной станет следующая включенная Camera2D в дереве сцены.

>bool is_current ( )
>Возвращает true, если эта Camera2D является активной камерой (см. Viewport.get_camera_2d).

>void make_current ( )
>Принуждает эту Camera2D стать текущей активной камерой. enabled должно быть true.
Аноним 27/05/24 Пнд 17:32:04 #264 №953414 
Ну и кто из вас итч уронил?
Аноним 27/05/24 Пнд 18:03:44 #265 №953419 
GigaGodot.jpeg
source.jpg
>>953414
Какие-то проблемы?
Аноним 27/05/24 Пнд 18:15:41 #266 №953420 
>>953419
Страшно ебать!
Аноним 27/05/24 Пнд 18:44:11 #267 №953425 
>>953419
Какой нейронкой сделал?
Аноним 27/05/24 Пнд 18:49:02 #268 №953426 
🙀🙀🙀.mp4
>>953419
Жесть.
Аноним 27/05/24 Пнд 19:02:42 #269 №953427 
>>953425
https://artbreeder.com

>>953420
>Страшно ебать!
>>953426
>Жесть.
А по-моему он няшный.
Аноним 27/05/24 Пнд 20:16:56 #270 №953435 
>>953367
Слушай, ещё помощь нужна, поясни пожалуйста, как компонентам часть значений менять, я вижу только set. Неужели надо создавать рид онли переменные, брать из них всё, кроме того, что я хочу изменить и потом при помощи set заменять старый компонент?
Аноним 27/05/24 Пнд 20:30:12 #271 №953436 
>>953435
А, нашёл сам. GetMut возвращает изменяемый. Ну такое, могли бы такие очевидно нужные вещи на поверхности показывать...
Аноним 27/05/24 Пнд 20:56:21 #272 №953439 
Как в игру добавляют кучу мобов по спрайт-листам 2д?
Смотрю всякие видеоуроки и читаю, пишут, что экспорт спрайт листа в годоте, это обычно создание сцены, добавление AnimatedSprite2d, там создание всяких idle, run, attack и т.п. анимаций через импорт спрайт-листа и выбор фреймов, скрипты. И потом добавление уже в нужную сцену.
А что делать, если мобов много? Создавать для каждого сцену и настраивать в ручную?
Аноним 27/05/24 Пнд 21:28:15 #273 №953440 
>>953439
Если у тебя там реально сотни разных мобов, пиши скрипт для автоматического импорта и настройки. Скрипты можно выполнять прямо в редакторе. Все операции в GUI редактора можно делать из кода.
https://docs.godotengine.org/en/stable/tutorials/plugins/running_code_in_the_editor.html
Хранить мобов лучше отдельными сценами, если потребуется что-то исправить вручную или создать новый вариант имеющегося моба.
Аноним 27/05/24 Пнд 21:41:32 #274 №953443 
>>953435
Подумай над тем, что возможно в этом случае их стоит разделить на отдельные компоненты.
Аноним 27/05/24 Пнд 21:47:26 #275 №953444 
>>953443
Да не, тут вопрос не в отдельных компонентах а в нежелании создавать лишний раз переменные. Хотя из моего эксперимента с системами - они сами могут по менять содержимое без лишних приседаний и GetMut. Так-то у меня есть уже игра-в-разработке, но мне что-то не нравится как библиотека Arch работает, вот и решил сменить шило на мыло.
Аноним 27/05/24 Пнд 22:09:49 #276 №953448 
Пиздец, и вот как жить если итч сдохнет или его купят? Половина всех индюков на нем держится-кормится.
Аноним 27/05/24 Пнд 22:11:49 #277 №953449 
1708949263401.png
1631108212131.png
1686127403274.png
1708195878205.png
>>953439
Понимаю, что ты молодой шутливый, но я сортировкой ассетов занимаюсь свободными вечерами, сажусь под какой нибудь сериальчик или анимце.
А так, поищи в ассетах по import или animation или wizard.
Вот этот, например, импортирует из aseprite (там есть возможность называть промежутки кадров каким то словом).
https://godotengine.org/asset-library/asset/1415
Или вот другой
https://godotengine.org/asset-library/asset/1880
Может есть и для чего-то другого.
Как анон выше сказал, можешь написать свой, под свою схему названий файлов.
Аноним 27/05/24 Пнд 22:18:04 #278 №953450 
RedHate.png
>>952992
>Ну это же на английском, друг.
Господи, дауничи ебаные, вы до сих пор не в курсе что уже давно можно переводить звуковую дорожку ютюба (да хоть порнхаба, блять!) расширением для браузера? Откудаж вы берётесь? Вы в бункере живёте?
Аноним 27/05/24 Пнд 22:23:06 #279 №953452 
>>953450
Пардон за хейт. Сгорел уже нахуй с подобного.
Аноним 27/05/24 Пнд 22:24:33 #280 №953453 
>>953450
> расширением для браузера
Оно не работает. Для хлебушков (типа меня) проще яндекс.браузер поставить и в нём всё искаропки без пердолинга работает.
Аноним 27/05/24 Пнд 22:24:35 #281 №953454 
>>953452
У людей большая инерционность мышления.
Я вот только недавно нашел этому применение в обратную сторону (рус->англ)
Аноним 27/05/24 Пнд 22:53:16 #282 №953456 
А за нейминг всего говна какой то один испаноговорящий чел отвечает или "коммунити"? Почему с ним такой пиздос? Причем смотрю в мигрейшн гайд с 3 на 4 и там адекватные названия переименовывают в какой то бред.
Аноним 27/05/24 Пнд 23:00:46 #283 №953457 
>>953456
Я с четверкой еще не работал, знаю только что за миграцию проджект менеджер Юрка Сизов отвечал.
Аноним 27/05/24 Пнд 23:09:03 #284 №953458 
CleanShot 2024-05-28 at [email protected]
Я закинул в папку с проектом ассет со скриптом, но я не вижу его в самом годоте. Почему? Рефреш не помогает.
Аноним 27/05/24 Пнд 23:14:15 #285 №953459 
>>953456
Толсто. Переименовали как раз неудачные названия, тянущиеся с легаси.
Аноним 27/05/24 Пнд 23:15:41 #286 №953460 
>>953458
Потому что ты кинул проект с файлом godot.project. Годот в этом случае на всякий случай отключает папку, вдруг у тебя туда реально другой проект случайно скопировался.
Аноним 27/05/24 Пнд 23:15:57 #287 №953461 
>>953458
И даже если я ставлю ассет не вручную, а из годота через assetlib, я его не вижу в окне FileSystem после установки
Аноним 27/05/24 Пнд 23:17:06 #288 №953462 
>>953460
Окей, я выпилил файл .прожект
Но ассет не появился в структуре моего проекта
Аноним 27/05/24 Пнд 23:20:12 #289 №953463 
Кто-нибудь видосы вставлял в свои проекты? Документация советует формат Ogg Theora, насколько оно подводно-каменистое? Не отвалится на какой-нибудь китайской мобиле?
Аноним 27/05/24 Пнд 23:35:51 #290 №953465 
>>953462
Ну перезапусти попробуй. Там закешировалось наверняка.
Аноним 27/05/24 Пнд 23:37:47 #291 №953466 
>>953449
Ты делаешь отдельную сцену под каждого моба?
Аноним 27/05/24 Пнд 23:48:56 #292 №953467 
17105739076540.mp4
>>953448
А что с ним случилось? Есть новости?
Аноним 28/05/24 Втр 00:04:51 #293 №953469 
>>953466
Чем вызван вопрос? Что тебе мешает?

Если мобы отличаются только косметически, т.е. условным цветом кожи - это одна сцена с опциями.

Если мобы отличаются радикально, т.е. имеют абсолютно разные способности - это разные сцены.

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

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

В целом - экспериментируй и смотри сам, что тебе больше нравится или лучше идёт твоим задумкам.
Аноним 28/05/24 Втр 00:21:35 #294 №953470 
image.png
>>953448
>или его купят
Не волнуйся, думаю, проблема с хостингом. У него всегда проблемы с доступом были, сервер слабый.

>>953467
>Есть новости?
"Мы знаем, что лежим, но не знаем, почему".
Аноним 28/05/24 Втр 00:36:13 #295 №953471 
>>953456
>Почему с ним такой пиздос?
Приведи примеры конкретных названий, тогда будем разбираться. Могу найти обсуждения на гитхабе, где переименования обсуждали (с голосованием).

Алсо, переименовать давно хотели, но ждали 4.0, чтоб соблюдать правила https://semver.org/
Аноним 28/05/24 Втр 00:51:00 #296 №953472 
>>953466
Обычно да, делаю в духе MVVC, когда есть сцены под всех мобов которые сами занимаются своими анимациями, а эта сцена уже вставляется в какую-то общую сцену персонажа, который имеет управление игроком или поведение ии и переключает анимации соответствующе.
Аноним 28/05/24 Втр 01:00:42 #297 №953473 
>>953463
>отвалится на какой-нибудь китайской мобиле
https://docs.godotengine.org/en/stable/classes/class_videostreamtheora.html
>The Theora codec is decoded on the CPU.
— должна работать на любом процессоре, но тратит ресурсы из-за отсутствия хардварного ускорения.

А тебе какие видео нужно проигрывать?
Аноним 28/05/24 Втр 01:28:27 #298 №953475 
>>953473
>decoded on the CPU
О, найс, проебал это в документации. Спасибо.

>А тебе какие видео нужно проигрывать?
Делаю экстренную помощь-подсказки для самых тугодумов. Решил что нет ничего нагляднее чем 2-4 секунды видео.
Аноним 28/05/24 Втр 01:38:24 #299 №953476 
CleanShot 2024-05-28 at [email protected]
CleanShot 2024-05-28 at [email protected]
Я что-то нихуя не понимаю(
Почему жсонину не прочитать?
Аноним 28/05/24 Втр 01:47:14 #300 №953479 
>>953463
А хрен его знает. Может, проще написать андроид плагин для такого?
В 3 есть какая-то недокументированная функция OS.native_video_play. Но с ней тоже непонятно.
Аноним 28/05/24 Втр 01:54:42 #301 №953480 
>>953476
Ну там все написано
У типа int нет поля error.
Это значит, что result - int.
parse() возвращает не объект пару (error, result)
Он возвращает код ошибки, не помню какой, ERR_чтото, либо OK

Проверяй не result.error, а сам result != OK.
Если OK, то данные не в result.result, а в json.data.
Аноним 28/05/24 Втр 01:56:35 #302 №953481 
>>953475
>подсказки для самых тугодумов
>2-4 секунды видео
Лучше делать скриптами из игровых ресурсов:
- актуальное отображение, даже если изменятся иконки, текстуры, биндинги клавиш и т.д.;
- максимальное разрешение без артефактов, при том практически не добавляет лишнего веса игре;
- можно сделать интерактивным и пошаговым, чтоб игрок сам подсвеченные тобой кнопки нажимал в комфортном ему темпе, успевая читать надписи;
- легче встроить в игровой процесс/мир - у игрока не будет переключения ментального контекста.

Имхо, видео-подсказки - прошлый век. Как и список портянок со скриншотами-иллюстрациями. Ты игру делаешь или википедию про игру? Обучай игрока интерактивно, иначе не поймёт или заскучает.
Аноним 28/05/24 Втр 02:08:54 #303 №953482 
>>953476
Актуальный пример кода есть в документации.
Жмёшь ctrl+клик по JSON в коде и читаешь:
https://docs.godotengine.org/en/stable/classes/class_json.html

Для JSON рекомендую https://hjson.github.io/
Сильно упрощает редактирование и поиск ошибок.
Аноним 28/05/24 Втр 02:11:03 #304 №953483 
>>953475
Если не хочешь делать ролик на движке, то;
Видео это просто быстро меняющиеся картинки.
Видеофайл просто использует хиьрое сжатие, поэтому зпнимает мало места, но тормозит.
Ты можешь показать просто слайдшоу из 30 пнг в секунду. Возможно они даже сожмутся в apk нормально.
Аноним 28/05/24 Втр 02:12:21 #305 №953484 
>>953480
Ты гений, епта. Здоровья матушке.

extends Node

func _ready():
load_combinations("res://src/combinations.json")

func load_combinations(file_path):
var file = FileAccess.open(file_path, FileAccess.READ)
if file:
var json_text = file.get_as_text()
print("JSON Text:")
print(json_text)
file.close()

var json = JSON.new()
var error = json.parse(json_text)
if error != OK:
print("Error parsing JSON: ", error)
else:
print("Combinations loaded successfully:")
print(json.data) # Accessing parsed data from the JSON instance
else:
print("Combinations file not found")
Аноним 28/05/24 Втр 02:12:50 #306 №953486 
>>953482
Спасибо, я что-то путаюсь в годотошной доке
Аноним 28/05/24 Втр 02:22:28 #307 №953488 
>>953483
>слайдшоу из 30 пнг в секунду. Возможно они даже сожмутся в apk нормально.
PNG не сожмутся, потому что они уже используют максимально эффективное сжатие без потерь. Дальнейшее сжатие возможно только если у тебя почти одинаковые PNG файлы, с большими повторяющимися блоками, что в случае геймплейного видео маловероятно.

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

>>953475
Алсо, если геймплей такой сложный, что ты хочешь показывать летсплей, стоит ли оно вообще того? Не лучше ли будет снизить планку сложности? Игрок не станет умнее от того, что решит твой ребус.
Аноним 28/05/24 Втр 04:21:45 #308 №953491 
>>953488
>Алсо, если геймплей такой сложный, что ты хочешь показывать летсплей, стоит ли оно вообще того? Не лучше ли будет снизить планку сложности?
Геймплей не сложный, я просто разочаровался в способностях игроков, особенно мобильных. Мои предыдущие игры показали что механики, которые тебе и мне кажутся интуитивными, для других окажутся невыполнимыми. Текст такие игроки не читают, думать ленятся, а за ручку всю игру держать не станешь.

Вот хороший видос на эту тему: https://www.youtube.com/watch?v=ax7f3JZJHSw
^ и опять же, этот видос про взрослого человека из развитой страны, тогда как среди мобильных геймеров полно детей из задниц мира с ограниченным игровым опытом, компов они не видели, английский не знают, зато могут на изи влепить тебе 1 балл в гугл плее.
Аноним 28/05/24 Втр 10:22:48 #309 №953499 
https://t.me/godot_engine/218700/347520

Вот норм, кстати. Хотя чела и критикуют за эффекты
Аноним 28/05/24 Втр 12:01:54 #310 №953514 
>>953499
Ахаха, когда знаешь половину ассетов, потому что сам их тоже двигаешь и расставляешь.
Аноним 28/05/24 Втр 13:34:00 #311 №953533 
>>953499
И тоже коммиблочная романтика. Как же без этого, дааа. Где-то там, в одном из этих коммиблоков, ходит пеппа в костюме годетты.
Аноним 28/05/24 Втр 13:42:03 #312 №953534 
>>953533
> коммиблочная романтика
Хоть кто-то еще как и я не любит коммиблочную романтику (ВСЖ).
Аноним 28/05/24 Втр 13:49:18 #313 №953538 
>>953499
Как посмотреть? Видеоскачиватели выдают ошибку.

>>953534
>не любит коммиблочную романтику (ВСЖ)
Что это вообще за мем?

Мне вот нравится атмосфера условного Гигахруща, но однотипные игры уровня "вот комната, в ней есть ковёр, диван, шкаф, телевизор" я не понимаю. У меня ИРЛ дома точно такая же обстановка, какой смысл делать симулятор ходьбы виртуальный музей про мою квартиру в десятках игр?
Аноним 28/05/24 Втр 13:58:52 #314 №953540 
>>953538
> Что это вообще за мем?
Происходит от знаменитого высказывания "забыл в какой стране живёшь?" сократилось до ВСЖ. Суть ты уже сам описал:
> "вот комната, в ней есть ковёр, диван, шкаф, телевизор"
К сожалению, любимый тобой гигахрущ - это тоже ВСЖ, причём самый апогей.
Аноним 28/05/24 Втр 14:10:01 #315 №953542 
1582102070107.mp4
>>953538
>Как посмотреть?
На дваче смотри
Аноним 28/05/24 Втр 14:44:18 #316 №953554 
>>953491
>Текст такие игроки не читают, думать ленятся, а за ручку всю игру держать не станешь.
ПРОСТО блокируешь всё управление кроме одной единственной кнопки, которую нужно нажать, или единственного элемента, который нужно сдвинуть.

Мобильные игры так и учат:
1. Нажми сюда, чтобы открыть инвентарь.
2. Свайпом объедини два предмета в новый.
3. Нажми сюда, чтобы надеть предмет на себя.
4. Нажми сюда, чтобы повысить уровень предмета.
5. Нажми сюда, чтобы закрыть инвентарь.
6. Нажми сюда, чтобы использовать предмет.
7. Посмотри сюда, чтобы увидеть эффект предмета.
8. Ты восхитительный игрок, вот тебе лутбокс.
9. Нажми сюда, чтобы открыть лутбокс...
Потом ты можешь делать что захочешь, но ты уже знаешь основные элементы управления и задачи.

>этот видос про взрослого человека
Это видос про человека с явным топографическим кретинизмом (ваще не ориентируется на местности), отсутствием любопытства (не пытается нажать все возможные кнопки на геймпаде - НА ГЕЙМПАДЕ, анон, там буквально 3.5 кнопки - эти устройства специально для детей, не приученных к взрослой клавомыши) с полным отсутствием способностей к обучению (даже осознав, что мышку НЕОБХОДИМО двигать, она продолжает ходить боком как краб).

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

Алсо, в видосе виден тупой геймдизайн ААА игр: налепливают кучу реалистичных декораций, но механики игры противоречат этим декорациям. Например, там, где игра требует бежать по строго определённому пути, наказывая игрока невидимой килзоной вместо ясно видных и понятных барьеров. Проблема не в игроке, а в дизайнерах и сценаристе.

Или тот же дум - заставляет играть единственным возможным способом, наказывая игрока за любое отклонение от задумки дизайнера: стрелять в лоб с дробовика вместо использования огнестрела как огнестрела, нажимать кнопку Е вместо очевидного использования игровых механик (бочки). Опять же, виноват тут только геймдизайнер, а не игрок.

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

Так и представляю:
>Тестировщик: бочки не наносят урон врагам...
>Дизайнер: у нас нет времени фиксить это.
>Тестировщик: игрок может пройти не тем путём.
>Дизайнер: аааыыы... ну поставим килзону, лол.
>Тестировщик: а сюда почему нельзя прыгнуть?
>Дизайнер: так задумано, иди по стрелочке!!!
>Тестировщик: залез в дом и ничего не случилось.
>Дизайнер: ну что за люди, иди по стрелочке...
Современные игры такие современные. Скорее бы сверхинтеллекты AGI порешали весь ААА геймдев, лишив этих дурачков контроля над дизайном игр.

>могут на изи влепить тебе 1 балл в гугл плее
Оценки в Гугле давно потеряли смысл, их лепят от балды все, кому не лень. Ребёнок тебе влепит 1 балл не потому, что ему что-то не понравилось, а потому, что он может нажать кнопку голосования. Тот, кому не понравилось, скорее просто удалит и забудет.
Аноним 28/05/24 Втр 14:44:34 #317 №953555 
Привет гейдевы.
Вопрос - у меня есть ряд однотипных объектов (спрайтов) внутри ноды2д.
На все эти спрайты должен действовать один и тот же скрипт - х.gd
Могу ли я закинуть спрайты в какой-нибудь "контейнер" и назначить скрипт на него? (Чтобы спрайты наследовали скрипт от него)
Или мне все еще нужно назначить этот скрипт на каждый спрайт?
Аноним 28/05/24 Втр 14:46:34 #318 №953556 
CleanShot 2024-05-28 at [email protected]
CleanShot 2024-05-28 at [email protected]
И если такого контейнера не сделать, как мне назначить один и тот же скрипт на множество элементов?
Если выделить их, Attach Script просто не появляется. По одному прокликивать?
Аноним 28/05/24 Втр 15:00:55 #319 №953558 
>>953555
Ты можешь получать в скрипте в цикле список детей объекта и делать с ними что хочешь например
Аноним 28/05/24 Втр 15:01:29 #320 №953559 
>>953542
Чо пацы, погнали за гаражи! Я у бати две сиги стырил!

очередная бродилка без геймплея, виртуальный музей ВСЖ-детства, которую в общем-то и не доделают
Аноним 28/05/24 Втр 15:03:24 #321 №953561 
>>953554
Ты скорее всего смотрел видос без перевода, со своим техническим английским на троечку. Потому что весть твой длиннопост подробно и по пунктам опрокинут в видосе.
Аноним 28/05/24 Втр 15:04:40 #322 №953562 
>>953555
> Могу ли я закинуть спрайты в какой-нибудь "контейнер" и назначить скрипт на него?
Можешь.
Аноним 28/05/24 Втр 15:04:48 #323 №953563 
>>953558
Разумно, спс.

Вопрос посложнее - в годоте можно поменять логику наименования дублей?
Например, если я дублирую Спрайт, я получаю Спрайт2. А я хочу получать Спрайт_2
Аноним 28/05/24 Втр 15:06:29 #324 №953564 
>>953556
> Attach Script просто не появляется. По одному прокликивать?
У них всё еще есть инспектор, и там всё еще есть поле "скрипт", в которое можно сразу всем скрипт назначить. Но ты верно догадался, что такие вещи лучше делать в одном вышестоящем скрипте.
Аноним 28/05/24 Втр 15:13:52 #325 №953566 
>>953561
Хорошо понимаю на слух + там субтитры на русском.
>подробно и по пунктам опрокинут в видосе
Да он просто понтуется тем, что женат, вот и всё.

Он в конце сказал "не советую так делать, пожалуйста, объясняйте новичкам азы игр", что перечёркивает все аргументы в его видео (проблема решена).
Аноним 28/05/24 Втр 15:32:15 #326 №953573 
ea8e099e4d649869772cf4b2e1be3fe0.jpg
>>953540
>К сожалению, любимый тобой гигахрущ - это тоже ВСЖ, причём самый апогей.
Я представляю себе Гигахрущ как пикрил, но в масштабах целой планеты или всей вселенной:
- хаотичная застройка на крышах соседей;
- лютый срач, который просто некуда девать;
- тяжёлая промышленность в одном доме со школами и развлекательными учреждениями;
- внутри легко заблудиться, однако выходить из этого тесного лабиринта жильцам не нужно, у них всё своё;
- натуральный киберпанк, каким он должен быть, без лишнего блеска, неона и избыточного пространства.

А в играх "ВСЖ" всё слишком чистое и просторное, как будто зашёл в музей, где экспонаты аккуратно расставили, демонстрируя жизнь древних людей.
Аноним 28/05/24 Втр 15:35:53 #327 №953576 
>>953563
Если дублируешь через код, то там же задавай и имя. Если менять логику - то пересобирать движок под себя
Аноним 28/05/24 Втр 15:51:40 #328 №953584 
>>953555 >>953556 >>953563
Читай https://ru.wikipedia.org/wiki/Проблема_XY

Зачем тебе это всё нужно? Ты что-то не то делаешь.

>должен действовать один и тот же скрипт - х.gd
Если я правильно понял твою проблему:
1. Создай сцену, у которой корень - Sprite2D.
2. Сохрани её как-нибудь вроде "element.tscn".
3. Дай ей один общий скрипт "element.gd".
4. Добавляя элементы в какую-то другую сцену, меняй им картинку элемента и другие параметры.
ИЛИ
4. Унаследуй от element.tscn несколько новых сцен, настрой их как следует, сохрани fire.tscn, water.tscn и т.д., и уже эти сцены-потомки используй в сцене.

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

Т.е. тут вопрос в том, что ты реально хочешь сделать.

>Если выделить их, Attach Script не появляется
Потому что это противоречит воркфлоу движка. Ты должен создавать новые сцены и использовать их, а не возиться с отдельными нодами в одной сцене.

Когда понимаешь эту концепцию, становится легче.

>получаю Спрайт2. А я хочу получать Спрайт_2
Зачем тебе это? Номер ни на что не влияет. Лучше переименуй во что-то осмысленное, чтобы цифры вообще не было в названии, иначе запутаешься.

Почитай документацию об основных концепциях.
Аноним 28/05/24 Втр 15:58:29 #329 №953588 
Screenshot35.png
Анон, что можно расположить в этом закутке у входной двери? У меня бы там был шкаф с инструментами, но по задумке хозяином квартиры была одинокая бабулька, так что инструментарий едва ли там возможен.
Аноним 28/05/24 Втр 16:08:32 #330 №953590 
>>953588
>У меня бы там был шкаф с инструментам
Лол, у меня тоже. Была фальшстена с дверью и внутри много полок да самого верха.

>одинокая бабулька
Думаю, в этом случае там был бы советский столик со скатертью и фотографиями/иконками и возможно цветами, ну или комод хотя они не так были распространены.
Аноним 28/05/24 Втр 16:15:16 #331 №953592 
>>953590
А, ещё у моей бабушки на таком столе стояло большое радио с часами. Но правда для этого рядом должна быть радиоточка, а она обычно на кухне вроде как.
Аноним 28/05/24 Втр 17:05:23 #332 №953602 
untitled-2-5.jpg
>>953590
>Думаю, в этом случае там был бы советский столик со скатертью и фотографиями/иконками и возможно цветами, ну или комод хотя они не так были распространены.

Вспомнил - комод косметичка с зеркалом. Пасиба.
Аноним 28/05/24 Втр 17:11:58 #333 №953606 
>>953566
>объясняйте новичкам азы игр
Что контрится его же примером "у игрока включается туннельное зрение, и он НЕ ВИДИТ ВАШИХ ОБЪЯСНЕНИЙ И БЬЕТСЯ ЛБОМ В СТЕНУ". Алсо, если уж ААА игры не осилили нормальное объяснение, а для ААА игр критично расширить аудиторию - отчасти поэтому туда добавляют сильных женщин, прячут кровь чтобы снизить возрастной рейтинг, льют желтую краску и прочее подобное - то странно ожидать что обскурная инди, слепленная двачером в одно ебало, справится с этим лучше.
Аноним 28/05/24 Втр 17:12:15 #334 №953607 
xqg2qojc6qj5m5ze5sj39lb38yl4a4z2.jpg
>>953602
>комод косметичка с зеркалом

трельяж или трюмо
Аноним 28/05/24 Втр 17:13:28 #335 №953608 
>>953588
Поставь туда слоновью ногу.
Аноним 28/05/24 Втр 17:13:59 #336 №953609 
>>953607
Не треко ли?
Аноним 28/05/24 Втр 17:21:38 #337 №953611 
>>953606
Так речь не о туториале.

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

В этом основной посыл видео, если отбросить затронутые проблемы с геймдизайнерами.
Аноним 28/05/24 Втр 17:34:30 #338 №953612 
>>953607
Э, сам такой.
Аноним 28/05/24 Втр 17:35:58 #339 №953613 
e8a59db5220f38b39a30fb21da1e312f.jpg
>>953588
>закутке у входной двери
>хозяином квартиры была одинокая бабулька
Навали туда всякого хлама, чтобы сложно было разобрать, что есть что. Пакеты, мешки, какие-то тряпки, ящики всех цветов и размеров, банки.

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

А то у тебя как будто палата в больнице. Нет, даже в больницах не бывает таких стерильных помещений.

Вдохновляйся реальной жизнью.
Аноним 28/05/24 Втр 17:43:26 #340 №953614 
>>953613
Слишком много времени уйдет. Было бы здорово добавить естества в виде потертостей и следов, но слишком долго. Я и так уже затрахался квартиру обставлять.
Аноним 28/05/24 Втр 17:49:39 #341 №953615 
>>953613
В Питере есть такое. Идешь по улице архитектура, дорогие бутики, дефелируют модные тяночки. Окно с разбитым стеклом занавешенное грязной половой тряпкой смотрит на тротуар с прохожими и проезжающими мимо трамваями.
Аноним 28/05/24 Втр 18:32:45 #342 №953620 
>>953573
Я тебя уверяю, если бы ты сделал эту игру сам, у тебя вышло бы точно такое же. А разгадка проста: хлам и срач сделать намного сложнее, чем "чистые, аккуратные" кубы с текстурами.
Аноним 28/05/24 Втр 18:35:47 #343 №953621 
>>953614
> уже затрахался квартиру обставлять
А зачем тебе годот? Квартиры обставлять гораздо удобнее в SweetHome3D - там и режим брождения от первого лица есть.
Аноним 28/05/24 Втр 19:07:36 #344 №953625 
>>951925 (OP)
Господа, поделитесь годным ассетом с круговым меню для 2д
В ассетах не нахожу
Аноним 28/05/24 Втр 19:09:00 #345 №953626 
image.png
image.png
>>953625
Типа пик, только 2д по ПКМ
Аноним 28/05/24 Втр 19:14:51 #346 №953629 
>>953625
Хуле там сложного, давай прямо итт сделоем вместе. Щас погодь, я дела доделаю. Набрасывай пока ноды в кучку.
Аноним 28/05/24 Втр 20:07:18 #347 №953635 
>>953625 https://godotengine.org/asset-library/asset/2220
https://www.youtube.com/watch?v=PgHafAvnUGw
Аноним 28/05/24 Втр 21:15:33 #348 №953641 
>>953625 >>953626
Как раз на днях думаю как сделоть что-то такое.
Если сделаю норм, поделюсь кодом в треде.

>>953635
Всратый код с десятком табов между @export и var.
Алсо, куча ненужных свистоперделок в одной куче.
Аноним 28/05/24 Втр 21:21:38 #349 №953642 
>>953614
>потертостей и следов, но слишком долго.
Я сам не юзал пока, но вроде 3D декали есть.
https://docs.godotengine.org/en/stable/classes/class_decal.html

>Я и так уже затрахался квартиру обставлять.
Лолшто? Ты ж только коробки по углам расставил и всё.
Вроде есть плагин для более удобной привязки, например:
https://godotengine.org/asset-library/asset/2943
https://youtu.be/cG4yzGOc6SI
Аноним 28/05/24 Втр 21:28:14 #350 №953643 
1716920888818.gif
>>953641
К табам у нас ещё не доёбывались. Ctrl+R нажми, \t заменить всё, если ты не игру делаешь, а чужие плагины разглядываешь.
Аноним 28/05/24 Втр 21:31:11 #351 №953644 
>>953643
>К табам у нас ещё не доёбывались
Учи чистый код, брат
Аноним 28/05/24 Втр 21:32:57 #352 №953645 
1716921172565.jpg
>>953644
Да, я капитан автор этого плагина, и это мой любимый тред на двачах!
Аноним 28/05/24 Втр 21:35:37 #353 №953646 
>>953645
Какая нахуй разница, автор ты или нет, лол? Ты одобряешь подобное, а значит сам не соблюдаешь хороший стиль (либо склонен его не соблюдать). Не удивлюсь, если ты еще босоножки с носками носишь.
Аноним 28/05/24 Втр 21:39:43 #354 №953647 
image.png
Вместо делания и релиза игры за игрой за игрой и набора популярности, будем табы на пробелы и пробелы на табы заменять, шинами по синглотам друг друга дубасить и архитектуру флеппи берда в сотый раз перетряхивать. Вот что ноудев с людьми делает.
Аноним 28/05/24 Втр 21:43:21 #355 №953650 
1716921797135.jpg
>>953646
> Ты одобряешь подобное
Какое подобное?
Код работает? Работает. Интерфейс в инспектор вынесен? Вынесен. Ты просто работаешь с меню, и не глядишь в код. Попустись уже.
Аноним 28/05/24 Втр 21:52:10 #356 №953652 
игры делаешь небось.jpeg
>>953419
>GigaGodot
Игры делаешь небось?
Аноним 28/05/24 Втр 21:53:18 #357 №953653 
>>953650
>Код работает? Работает.
Если ты косплеишь дерево, то не надо. С самого начала понятно, что ты скорее всего не умеешь в хороший стиль (и я об этом уже писал в прошлом посте, а ты все пытаешься доказать очевидное)
Аноним 28/05/24 Втр 21:56:45 #358 №953655 
>>953650
Забей на него, это кот который яйца лижет.
Аноним 28/05/24 Втр 21:57:13 #359 №953656 
>>953655
Еще один погромист
Аноним 28/05/24 Втр 21:57:14 #360 №953657 
326-scaled.jpg
>>953643
>не игру делаешь, а чужие плагины разглядываешь
>>953647
>релиза игры за игрой за игрой
>>953650
>Код работает? Работает
>просто работаешь с меню, и не глядишь в код
!!! АССЕТФЛИПЕР В ТРЕДЕ, ВСЕ В GODOT ASSET LIBRARY !!!
Аноним 28/05/24 Втр 22:01:45 #361 №953660 
>>953656
>>953657
>как вы смеете делать не так, как хочу Я!!1
Ноугеймзер, не трясись ты так. Иди табы поищи, вдруг полегчает.
Аноним 28/05/24 Втр 22:05:17 #362 №953662 
wtf.png
>>953643
>Ctrl+R нажми, \t заменить всё
Ты просто не понял, о чём речь.

>чужие плагины разглядываешь
А если там вирус или тормоза?
Аноним 28/05/24 Втр 22:15:38 #363 №953664 
>>953660
>пытается выдать "писать уродливый и неконсистентный код" за "тебе просто не нравица"
Иди что ли книжки почитай по прогроммизму, раз не учился нигде.
Аноним 28/05/24 Втр 22:19:01 #364 №953666 
>>953664
Не, пчел, это ты тут пытаешься выдать вылизывание кода по десятому кругу за некую продуктивность, за финальный продукт, который можно пощупать и поиграть. Ты как те наивные ньюфаги с идеями на миллион. Сами по себе их идеи не стоят ничего, как ничего не стоит и твой чистый код без законченного продукта.
Аноним 28/05/24 Втр 22:20:35 #365 №953667 
>>953666
> вылизывание кода по десятому
Снова пытаешься подменить понятия. Дальше не читал, сорян. Удачи тебе в обучении!
Аноним 28/05/24 Втр 22:34:24 #366 №953671 
>>953666
>вылизывание кода по десятому кругу за некую продуктивность, за финальный продукт
Скажи честно: ты обсуждаемый код смотрел или просто бомбанул и срёшься?
https://github.com/diklor/advanced_radial_menu/blob/main/addons/advanced_radial_menu/radial_menu_class.gd

1. Ты взял этот скриптик с гитхаба и не глядя вставил в игру.
2. Изменил параметры через инспектор по своему вкусу.
3. Релизнул игру/апдейт с этим меню (у тебя есть игроки).
4. Игроки (лично уважаемые тобой люди) поиграли и сказали:
>говно какое-то, неудобно, сделай так-то и так, будет лучше
5. Ты открываешь проект, лезешь в инспектор к этому скрипту.
6. Меняешь параметры, но не можешь добиться желаемого.
7. Решаешь всё-таки посмотреть скрипт и доработать его.
8. А там говно уровня "и так сожрут, бесплатное же".

Твои действия?
Аноним 28/05/24 Втр 22:45:57 #367 №953673 
>>953671
> Твои действия?
Нанимаю тебя. За шапку сухарей.
Аноним 28/05/24 Втр 22:51:07 #368 №953674 
>>953671
>а если напишут плохое!
Вот когда напишут тогда и приходи. Спойлер - не напишут, потому что игры нет, и скорее всего не будет. Через год-полтора возни и байтоебства интерес иссякнет, появится новая идея, а текущая пополнит собой архив. И так по кругу у каждого второго гейдева.

Тогда как рядом сидят всякие Тоби Фоксы и на километровых портянках иф-елсов ебашут хиты с фанбазами размером со среднюю страну.
Аноним 29/05/24 Срд 00:24:03 #369 №953683 
>>953588
Не забудь про велосипед "Аист".
Аноним 29/05/24 Срд 01:22:57 #370 №953685 
image.png
Здарова годаны, чет я прям на долго пропал, думал сразу вторую игру начать делать после релиза первой, ну собсно так и поступил, только вот муза покинула и мне максимально не интересно стало заниматься ей. Сидел я вобщемто до сия момента нихуя абсолютно не делал, ждал вдхновления, и таки вроде чето да пришло в голову, буду кликер делать, да не такой который за 5 минут на коленке собрать можно, а чуть посложнее. Ассеты напизжены, можно начинать. Ну да, буду тем самым выблядком ассетфилипером, в оправдание скажу лишь то что это в разы сокращает производство игры ибо на рисование у меня уходит львиная доля времени, а на моделирование тем более.
Пикрил кстати то что заработало мое говно за время с момента релиза, 6 мая вроде дропнул. Немного обидно, да и похуй, сам виноват ибо мимо мейн аудитории яндекса умышленно стрелял.
Короч в планах кликер за неделю, а дальше сидим думаем че делать дальше.
Высираться итт оч редко буду, пакедава.
Аноним 29/05/24 Срд 01:32:22 #371 №953686 
>>953685
Маладца, это уже больше чем у половины гд. Продолжай работать. Алсо ты не думай что 50.52р это все, что твоя игра в состоянии заработать. Площадок в интернете много - выкладывай и на другие. Я свои поделки в перерывах от работы раскидываю повсюду. Да, даже если не сможешь обойти санкции и монетизироваться на западной площадке - все равно выкладывай. И лепи ссылки на свои соцсеточки/бложеки/аккаунты.
Аноним 29/05/24 Срд 01:43:54 #372 №953687 
pie.png
menu.gif
>>953625
Пока не доделал, но этот код должен помочь.
Для кругового меню нужно, как минимум:
1. Кнопки (любой Control, но лучше Button).
2. Определить позиции всех кнопок по формуле.
3. Округлить позицию курсора до позиции кнопки.
Всё остальное дорабатывается по желанию и вкусу.
Можно без кнопок (только _draw), но кнопки удобнее.
Аноним 29/05/24 Срд 02:03:18 #373 №953691 
ss9635f9f03e96c3f5bd66e19942f82b8dc0defec3.jpg
ssfd2ad17c484c9b07d1ac09a88493d975ba4e093e.jpg
ss6143310f9d18253ea5f0cc9328b5e0f59c7a102b.jpg
3.png
>>953685
>муза покинула
>ждал вдхновления
>буду кликер делать
Вдохновляйся. :3
http://store.steampowered.com/app/383080/
Аноним 29/05/24 Срд 02:14:17 #374 №953693 
>>953686
Понятное дело что желательно и на другие площадки тоже лить, в планах пока только в вк и дноклы ползти. Но все равно спасибо за советы.
>>953691
Пасиб :3
Аноним 29/05/24 Срд 06:35:12 #375 №953697 
>>953674
> Тогда как рядом сидят всякие Тоби Фоксы и на километровых портянках иф-елсов ебашут хиты с фанбазами размером со среднюю страну.
База!
Аноним 29/05/24 Срд 07:55:02 #376 №953701 
>>953662
Не пости гуро пожалуйста, это сфв доска
Аноним 29/05/24 Срд 15:29:33 #377 №953761 
>>953701
Не, это отличный код. А то, что он выглядит как хуйня и что его сложно поддерживать - это вкусовщина. За чистотой кода зачем вообще в 2к25 следить, вы шизы что ли.
Аноним 29/05/24 Срд 15:30:45 #378 №953762 
>>953761
>За чистотой кода зачем вообще в 2к25
Ты меня так троллируешь?
Аноним 29/05/24 Срд 15:51:36 #379 №953768 
meme-lolol.gif
>>953762
Разве это не очевидно? >>953761
>сложно поддерживать - это вкусовщина
Аноним 29/05/24 Срд 16:03:27 #380 №953769 
>>953761
Мы, пролетарии клавиатуры, в университетах ваших не обучались, чтоб еще о какой-то красоте думать.
Аноним 29/05/24 Срд 17:48:39 #381 №953782 
7e7802f37a7c44a817233d8128ab0b41.jpg
>>953769
Красота кода приходит с опытом, как у художников.
Аноним 29/05/24 Срд 18:07:09 #382 №953786 
>>953782
Или не приходит
Аноним 29/05/24 Срд 22:08:14 #383 №953812 
14909732.png
ЩА ПО-БЫСТРОМУ ЗАПИЛЮ ПИРОГ МЕНЮ НА BUTTON
@
ВОТ ТАК, ВОТ ТАК, ГОТОВО, НЕПЛОХО ПОЛУЧИЛОСЬ
@
ТАК, А ТЕПЕРЬ ДОБАВИМ КРАСИВУЮ ОБВОДОЧКУ
@
А КРУТО ПОЛУЧИЛОСЬ, С АНИМАЦИЯМИ ВАЩЕ НИШТЯК
@
ВСМЫСЛЕ _DRAW РИСУЕТ ПОВЕРХ СТАНДАРТНОЙ КНОПКИ?
@
ТАК, ПАДАЖЖИ, ЩАС РАЗБЕРЁМСЯ, ЕСЛИ РИСОВАТЬ...
@
А ЕЩЁ НУЖНО ПОВЕРНУТЬ НАДПИСИ ПОД УГЛОМ?..
@
ДА ЛАН, НАКИДАЮ LABEL, TEXTURERECT, ВОТ ЭТО ВСЁ
@
А НЕ, ПОГОДИ, ЧЁТ СЛИШКОМ МНОГО ЛИШНИХ НОД
@
ОЙ ВСЁ, ЩАС НАРИСУЮ ВСЁ МЕНЮ САМ В _DRAW
@
АГА, РАЗОБРАЛСЯ, ВРОДЕ НЕСЛОЖНО ВРАЩАТЬ ЭТО
@
В СМЫСЛЕ НЕ МОГУ ПРОСТО ЗАГНАТЬ ТЕКСТ В RECT2?
@
ТАК-ТО ВРОДЕ НОРМ, НО НАСЛАИВАЕТСЯ СЛИШКОМ
@
ОООООЙ ВСЁ, КАКАЯ-ТО ХРЕНЬ, ПОГУГЛЮ РЕФЕРЕНСЫ
@
А ЧЁ, В СМЫСЛЕ, В БЛЕНДЕРЕ ПРЯМОУГОЛЬНЫЕ КНОПКИ?
@
В НАТУРЕ! ТАК ЛУЧШЕ ПОЛУЧИТСЯ, ЧИТАБЕЛЬНО ЖЕ
@
ДА И ШОРТКАТЫ У СТАНДАРТНЫХ КНОПОК ТОЖЕ ЕСТЬ
@
ТАК-ТАК-ТАК, Я БЫЛ ПРАВ, ВОЗВРАЩАЕМСЯ К BUTTON
@
АААААА, Я ЧТО, ЗРЯ КРАСИВУЮ ОБВОДОЧКУ ДЕЛОЛ?
@
НУ ВСЁ, ЩАС БУДУ ВСЁ ПЕРЕДЕЛЫВАТЬ ЗАНОВО
Аноним 29/05/24 Срд 22:12:01 #384 №953813 
Инструкция по выпечке меню
https://www.youtube.com/watch?v=TtziEJZtWXc
Аноним 29/05/24 Срд 22:48:12 #385 №953816 
>>953782
>>953786
По части форматинга кода годоту не помешал бы автоформаттер вроде автопипа из питона или гофмт из го. А то чисто в визуальном плане тут полную нех наворотить изи.

Не сделали ли подобного в четверке?
Аноним 29/05/24 Срд 22:57:17 #386 №953818 
draw.png
button.gif
blender.jpg
sims.jpg
>>953813
1: +/- то, что в твоём видео
2: >>953687 на стероидах
3, 4: блендер, симсы
Вывод: кнопки рулят.
Аноним 29/05/24 Срд 23:35:04 #387 №953823 
>>953818
В радиальном меню главное - тригонометрия. А что там в секторы засунуть - это мелочи. Ты с тригонометрией разобрался?
Аноним 29/05/24 Срд 23:36:08 #388 №953824 
fix.gif
>>953818
Нужно было с самого начала определиться, что именно мне нужно...
Аноним 30/05/24 Чтв 00:40:45 #389 №953829 
buttons.mp4
help.jpg
>>953823
>мелочи
Аноним 30/05/24 Чтв 08:40:15 #390 №953846 
>>953823
>А что там в секторы засунуть - это мелочи.
Не мелочи, это как раз база того, будет игрок им пользоваться или нет. Игроку похер как у тебя реализована тригонометрия внутри
Аноним 30/05/24 Чтв 09:51:11 #391 №953857 
>>953812
> НУ ВСЁ, ЩАС БУДУ ВСЁ ПЕРЕДЕЛЫВАТЬ ЗАНОВО
Ох... Ну зачем меня так прикладывать....
Аноним 30/05/24 Чтв 11:32:04 #392 №953879 
Привет, Сосач. Подскажите, почему в Godot источники света кастующие тени так сильно сажают FPS? Что можно предпринять, чтобы избежать просадок и получить нормальную картинку?
Аноним 30/05/24 Чтв 12:44:56 #393 №953888 
>>953879
Железо обновить.
Аноним 30/05/24 Чтв 13:55:39 #394 №953903 
>>953888
>>953879
Некоторое старое железо тоже ок фпс выдает по теням. Там ебанутая свистопляска какая-то, на одном древнем ноуте запускаю - 4 фпс, на другом, почти таком же древнем и хуевом - 40 фпс.

>>953879
Используй light/shadow blobs и запекай светотени как диды.
Аноним 30/05/24 Чтв 14:23:39 #395 №953909 
>>953903
> на одном древнем ноуте запускаю - 4 фпс, на другом, почти таком же древнем и хуевом - 40 фпс
Ненене, давай спеки в студию. Древний древнему рознь. Для тебя они одинаковы, а на деле там в одном штеуд атом и штеуд графика, а на втором амд со встроенным радеоном. Вот и разница.
Аноним 30/05/24 Чтв 15:57:12 #396 №953934 
>>953879
>почему в Godot источники света кастующие тени так сильно сажают FPS?
>Что можно предпринять, чтобы избежать просадок и получить нормальную картинку?
Источники света и тени по умолчанию динамически обновляются каждый кадр, чтобы учитывать актуальное состояние сцены. Читай документацию - там всё подробно описано, как переключить источники света в статический режим. В большинстве случаев динамические источники света тебе не нужны, если ты просто размещаешь лампочку и не двигаешь её.

Источник света относительно дешёвый, а вот тень - это отдельный рендеринг почти всей видимой игроку сцены с позиции источника света, чтобы нарисовать силуэт объектов, который потом будет наложен на основную картинку как тень. Расчёт не точный, но можно прикинуть, что 1 источник света - это 1/2 от FPS без источников света, 3 источника света - это 1/4 от FPS без источников и т.д. Во-первых, избавляйся от лишних источников света, которые не играют роли, во-вторых, выключай рендеринг теней для источников света, которым тени не нужны, в-третьих, выключай отбрасывание теней у мелких объектов и прочего мусора, которым тени не нужны. Можно попробовать создать один невидимый большой объект (куб), который бросает одну огромную тень вместо тысячи мелких предметов - так рендеринг теней будет меньше нагружать видеокарту.

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

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

И не забудь добавить в настройки игры опции для качества теней и других эффектов. Лично я во всех играх стараюсь отключить тени или снизить их качество на минимум, потому что они всё равно мешают геймплею, делая картинку тёмной и грязной, порой скрывая важные объекты. Кому нравится - у того и компьютер мощнее, пусть ставит тени на "ультра", будешь разбираться только если на 4090 у тебя меньше 60 фпс.
Аноним 30/05/24 Чтв 18:32:21 #397 №953957 
witch.png
Вот вам ассет. Чтобы завтра игра была.
Аноним 30/05/24 Чтв 18:43:14 #398 №953962 
>>952291
Чёт они замедлились.
Godot 4.3 уже полгода делают, а беты всё ещё нет.
Вроде обещали быстрее доставлять после релиза 4.0.
Аноним 30/05/24 Чтв 19:34:32 #399 №953973 
>>953934
>В большинстве случаев динамические источники света тебе не нужны, если ты просто размещаешь лампочку и не двигаешь её.
А что если вокруг этой лампочки движется игрок? Я хочу чтобы моделька игрока освещалась. Пусть без отбрасываемых теней.
Аноним 30/05/24 Чтв 19:38:37 #400 №953974 
>>953962
Плохо штоль? Хорошо. Ждём дальше.
Аноним 30/05/24 Чтв 19:49:52 #401 №953979 
>>953973
Шейдер на ассемблере за пару вечеров пишется, а вы не можете на таком уровне абстракции это решить, ну и программисты пошли
Аноним 30/05/24 Чтв 19:57:28 #402 №953981 
Стикер
>>953979
> Шейдер на ассемблере
Вообще-то на GLSL который больше на си похож, чем на ассемблер.
Аноним 30/05/24 Чтв 20:01:29 #403 №953983 
Screenshot38.png
>>953981
Ай не пизди. Он Казима, он шейдеры иголкой на перфокартах выковыривает.
Аноним 30/05/24 Чтв 20:42:57 #404 №953997 
DoesItLookGood.mp4
>>953588
Запости свой проект на реддит, сразу в топ выйдешь.
https://www.reddit.com/r/godot/comments/1d40enz/
Аноним 30/05/24 Чтв 20:51:47 #405 №954003 
>>953973
>А что если вокруг этой лампочки движется игрок?
Там какая-то сложная система запекания... Я особо не разбирался в этом пока.

>Я хочу чтобы моделька игрока освещалась. Пусть без отбрасываемых теней.
Тени (те, что падают от предмета на другие предметы) можно одной галочкой отключить без проблем. Запекание источников света имеет смысл, когда у тебя целая гирлянда разноцветных лампочек и нужно чтобы эти цветные пятна красиво отображались на окружающей гирлянду статичной геометрии. Или что-то в этом роде.

Ты лучше проверь, действительно ли проблема в источниках света или в чём-то другом.

>>953981
GLSL в машинный код видеокарты компилируется. Наверное, он прям этот машинный код и пишет под свою видеокарту, вручную, без GLSL. Зато игра не будет компилировать шейдеры. Оптимизации уровня ECS...
Аноним 30/05/24 Чтв 21:18:28 #406 №954009 
witch.png
>>953957
Еще вариант
Аноним 30/05/24 Чтв 21:21:57 #407 №954011 
>>953957
>>954009
В 32х32 можешь?
Аноним 30/05/24 Чтв 21:35:22 #408 №954016 
witch.png
>>954011
Аноним 30/05/24 Чтв 21:41:55 #409 №954020 
1717094510333.png
>>953957
>>954009
Это так не работает, братишка.
Если бы мне были нужны спрайты для игры, я бы сразу спрайтщитами кочал с множества ресурсов, типа LPC-генератора. Вот например, беременная горгулья с лопатой (што?) сделано за 5 минут, пока пост писал. Полная раскадровка всех основных анимаций. И что мне твоя мазня по сравнению с генераторами? И сколько лет ты будешь мне раскадровку пилить? И сколько мозгов выебешь? А в генераторе перс уже готов.

А игры тонет всё равно.
Аноним 30/05/24 Чтв 21:46:30 #410 №954023 
>>954020
А потом ты захочешь чтобы она упала, а потом чтобы крылышками махала...
Аноним 30/05/24 Чтв 21:50:02 #411 №954026 
>>954016
А вот возьму и неиронично добавлю в свою игру. Показать что я делаю с этими картинками пока не могу, но знай, я ими воспользуюсь!
Аноним 30/05/24 Чтв 21:50:25 #412 №954028 
>>954023
у нейронок такая же проблема как у скачать без смс. Того что надо никогда не будет. Поэтому только 3D -> анимации -> рендеринг 2D
Аноним 30/05/24 Чтв 21:56:15 #413 №954031 
1717095370301.png
>>954023
Как будет "потом", так и разберёмся.
Аноним 30/05/24 Чтв 22:04:28 #414 №954033 
>>954031
Глянул - эта штука из шаблонов генерирует. Это даже не нейронка с промптом. Ты с этим далеко не уедешь без хуйдожника...
Аноним 30/05/24 Чтв 22:14:56 #415 №954039 
>>953957 >>954009 >>954016
Если хочешь серьёзно научиться пиксель-арту, читай это:
http://archive.org/details/pixel-logic-a-guide-to-pixel-art-michael-azzi/

От себя (я сам плох в этом, но всё же) рекомендую:
1. Ограничиваться только базовыми цветами, без оттенков и полутонов. Берёшь несколько контрастных цветов, которые легко отличить друг от друга, и рисуешь только ими. Сейчас у тебя всё сливается в пятна из-за недостаточной разницы между цветами.
2. Персонажей лучше всего делать с обводкой - чёрной или очень тёмной. Без обводки мелкопиксельный персонаж плохо читается даже как отдельный статичный спрайт, а в игре он легко может слиться с фоном, даже если ты подбирал цвета под конкретный тайлсет фона. Тайлсеты фона, наоборот, чаще без обводки, чтобы не бросаться в глаза, но обводка может подсвечивать интерактивные предметы, твёрдые поверхности и т.п.
3. Если делаешь спрайт для игры, то необходимо знать, в каком стиле будет игра: размер пикселей (никто не будет делать сегодня пиксельную игру 1:1, всегда пиксели умножают на какое-то число, и это число должно быть одним на всю игру), палитра (даже если нет одной палитры на всю игру, всё равно есть разница между кислотными, мрачными, серыми, пастельными и другими группами оттенков, это задаёт атмосферу игры), положение камеры (сверху, сбоку, 3/4), что персонажа чаще всего окружает (буйная тропическая зелень, городская серость, постапокалиптическая ржавчина и т.д.) и т.д.
4. Лучше тренироваться не на спрайтах, а на иллюстрациях. Чтобы не задумываться пока об анимации, спрайт-шитах и т.д. Набить руку на отдельных рисунках.
5. Знания и опыт в академическом художестве помогут в пиксель-арте, особенно если хочешь подняться над унылыми тяп-ляп 2D платформерами от школьников.
6. Изучи специальные инструменты. Да, рисовать пиксель-арт можно и в пейнте, но специальные редакторы сегодня имеют массу вспомогательных инструментов.

>>954020
>LPC-генератор
Ты бы хоть ссылку дал на этот генератор, лол.
http://sanderfrenken.github.io/Universal-LPC-Spritesheet-Character-Generator/

>А в генераторе перс уже готов.
Ага, и он точно в таком же стиле, как и 99% игр на РПГ Мейкере, которые совершенно не отличаются друг от друга из-за одинаковых бесплатных тайлсетов и генераторов персонажей. Смешно смотреть на очередную инди-жРПГ в стиме, у которой скриншоты ничем не выделяются кроме аниме героини, которая тоже в стиле стандартного инди аниме и не выделяется на фоне остальных аниме героинь.

>>954028
>Того что надо никогда не будет.
Придёт AGI - порядок наведёт. Будет делать игру с нуля до релиза за час на кофеварке.
>Поэтому только 3D -> анимации -> рендеринг 2D
Такие игры легко отличить от труЪЪЪ ручного пиксель-арта. ИМХО, лучше уж делать стилизованную 3D игру, чем пытаться попасть в и без того переполненную нишу пиксель-арта со своими кривыми 3D рендерами.

>>954033
>Ты с этим далеко не уедешь без хуйдожника
99% игр на РПГ Мейкере как-то справляются.
Аноним 30/05/24 Чтв 22:24:08 #416 №954043 
>>954033
> кок-пок, у тибя ничо не выйдет
> кудах, купи мои услуги
Хорошая попытка, художник, но нет.
Аноним 30/05/24 Чтв 22:25:02 #417 №954044 
>>954039
> кудах-тах, стиль, кукурику, дизайн
Всё ещё нет.
Аноним 30/05/24 Чтв 22:43:00 #418 №954051 
88b701a176845799f30eb2af62db5c18.jpg
Безымянный.png
>>954043
>купи мои услуги
Ты ж сам научиться можешь.

>>954044
Френдли фаер, я программист.
Аноним 30/05/24 Чтв 23:09:50 #419 №954062 
>>954039
>Если хочешь серьёзно научиться
Очнись, тут нет таких. Тут неучи и ленивые жопы
Аноним 30/05/24 Чтв 23:25:33 #420 №954066 
Screenshot39.png
Screenshot41.png
>>953997
Как закончу хотя бы квартиру.
Я как-то выкладывал на реддит видео другой демки
https://youtu.be/wpZODOlzOCg
Это реворк демки одного нсфв художника. Реакция на реддит была в целом положительная, но пользы от этого было никакой. Даже художник не мотивировался вернуться к геймдеву, а жаль.
Аноним 30/05/24 Чтв 23:27:42 #421 №954067 
Стикер
>>954066
Базовый стол. У меня такой есть. Охуенно!
Аноним 31/05/24 Птн 00:02:02 #422 №954080 
>>954066
>видео другой демки
О, а я помню это видео, давно видел.
Думал, ты новенький, а ты уже смешарик.

>выкладывал на реддит
>пользы от этого было никакой
>художник не мотивировался вернуться
Куда конкретно ты это выкладывал, r/godot?
Нужно выкладывать прямо к твоей ЦА:
https://old.reddit.com/r/vore/
https://old.reddit.com/r/giantess/
https://old.reddit.com/r/succubus/
Ну и там поищи что-то в этом духе.
Аноним 31/05/24 Птн 00:11:50 #423 №954083 
>>954080
>vore/giantess/

Выкладывал в r/godot, но я потом акк удалил.
Вообще, поглащение и гиганты не мои фетиши, прст технически исполнил.

>>954080
>а ты уже смешарик
Первую демку делал на версии 3.4, потом ничем не занимался аж до конца прошлого года. Там другую демку сделал по поням (тоже реворк чужой работы). Эта вот с квартирой - третья, первая полностью своя... на чужих ассетах, плагат популярной франшизы.
Не густо.
Аноним 31/05/24 Птн 00:27:26 #424 №954086 
>>954039
Советы хороши.

А я нирикаменую пиксель арт как таковой. Это обман, наебка, ловушка. Он кажется обманчиво простым, но если делаешь что-то выше 12х12, то оно тебя сожрет. А потом сожрет второй раз, когда начнешь ебаться с пиксель-перфект в движке, с y-сортами и прочим геморроем. А уж анимировать его, ууу бля, сидишь как даун половину спрайта перерисовываешь, а потом понимаешь что он уехал не туда и слышь давай по-новой. Я уж лучше на primitive shapes and colors игры поделаю.
Аноним 31/05/24 Птн 01:05:51 #425 №954091 
>>954020
У lpc лицензия кривоватая
Аноним 31/05/24 Птн 02:29:59 #426 №954097 
video.twimg.comtweetvideoFN0-NxgWUAYN5iz.mp4
video.twimg.comtweetvideoFQElBXNXoAAECTO.mp4
m1EJcLPjl0Sn72rW.mp4
video.twimg.comtweetvideoF-83NLjXcAA5ZjK.mp4
>>954086
>если делаешь что-то выше 12х12
Чем выше разрешение, тем ближе к обычному арту, а тут уже решает то, насколько ты хорош в обычном арте и его теоретической базе. Если знать теорию - у тебя будет меньше вопросов "что делать" и рисунки станут привлекательнее. Дальше всё сводится к механическому дрочу пикселей, в этом инструменты помогают. Теория - технические знания, бояться их не надо, но большинство новичков ленится читать и разбираться, потому и разочаровываются в себе - это как если бы начинающие программисты садились писать Hello World без чтения мануала по незнакомому им языку и потом плакали, что код - это не для них и больше они к нему не притронутся.

>анимировать его, ууу бля, сидишь как даун половину спрайта перерисовываешь, а потом понимаешь что он уехал не туда
У тебя неправильный порядок работы. Ты сначала полностью детализировал один спрайт, а потом пытаешься кадр за кадром анимировать его, верно? На практике лучше наоборот: сначала сделать всю анимацию цветными кляксами, не заботясь о пикселях, и только когда анимация будет удовлетворять, наращивать на неё все необходимые детали вроде одежды, волос, лица, предметов, и т.д. Сначала делаешь свою супер-пупер анимацию удара ногой с разворота с подробной физикой прыгающих сисек, а потом уже натягиваешь на неё свою бимбу в микрокини. Тогда у тебя не будет "ой, чёт криво прыгают". Пикрилы в своё время открыли мне глаза на анимацию.
Аноним 31/05/24 Птн 05:42:45 #427 №954106 
>>954097
Ужасные пикчи. Тупо обрисовка видосов или блендера. Аж трисет.
Аноним 31/05/24 Птн 11:47:39 #428 №954129 
Метод move_and_slide() может давать ошибку instance_set_transform: Condition "!v.is_finite()" is true если я нигде не накосячил со скоростями? Как вообще пофиксить подобное без трай-кетчей если и так везде уже столько всяких проверок понатыкал, что вероятность того, что эта ошибка вылезает где-то кроме move_and_slide() стремится к нулю?
Аноним 31/05/24 Птн 12:02:01 #429 №954131 
image.png
В чём прикол, ГДаны?
Аноним 31/05/24 Птн 12:02:45 #430 №954132 
>>954131
Он просто дурак!
Аноним 31/05/24 Птн 13:23:11 #431 №954139 
>>954131
Масло = дорого (особенно в пендостане, где нет ни молока, ни хуя)
Т.е. он кичится своим богатством, которое приобрел за счет своих инди-игор. Получается, это такая ирония, мол, он говорит - ха-ха, мне так трудно быть гейдевом, что приходится жрать черную икру ложками (если адаптировать эту историю для граждан Российской Федерации).
Аноним 31/05/24 Птн 13:28:17 #432 №954141 
>>954139
> ни молока
Разве? Там же сильно с середины прошлого века производители молока продавливали молоко в массы
Аноним 31/05/24 Птн 13:39:46 #433 №954145 
>>954131
Не смог заработать на нож.
Аноним 31/05/24 Птн 14:16:55 #434 №954149 
>>954139
А еще дикие медведи по центру Ньюйорка ходют.
Аноним 31/05/24 Птн 14:20:52 #435 №954151 
>>954149
https://www.youtube.com/watch?v=C2I9gle7jMg
Аноним 31/05/24 Птн 15:09:45 #436 №954158 
>>954149
И насилуют детей

>>954141
С введением санкций у них нет ни-ху-я
Аноним 31/05/24 Птн 21:57:24 #437 №954227 
kJwGUr.jpg
>>954131 >>954132 >>954139 >>954141
>>954145 >>954149 >>954151 >>954158
Разработка игр уровня /godot/...
Чтоб до переката все сделали игру!
Иначе к вам придёт пикрил Годетта.
Аноним 31/05/24 Птн 21:59:29 #438 №954228 
Доставка годноты в тред: https://youtu.be/5oMSJFczcOE
Аноним 31/05/24 Птн 22:04:05 #439 №954229 
>>954227
Вообще не до этого бро. Сплошные игры живого действия, времени остается только на самописный sdl микродвиг.
Аноним 31/05/24 Птн 22:23:39 #440 №954235 
>>954129
>instance_set_transform: Condition "!v.is_finite()" is true
Ты забыл указать строчку кода в исходниках (она всегда указывается дебаггером при таких ошибках), так что придётся играть в форумного экстрасенса.

Эта ошибка генерируется, например, здесь:
https://github.com/godotengine/godot/blob/705b7a0b0bd535c95e4e8fb439f3d84b3fb4f427/servers/rendering/renderer_scene_cull.cpp#L935
Суть проблемы: один из компонентов матрицы NaN или бесконечность, поэтому матрицу не удаётся применить.

Нужно смотреть, какие значения у тебя в матрице мешей, которые закреплены за телом, которое ты пытаешься двигать. Если используешь MultiMeshInstance3D, то нужно смотреть, какие данные находятся в его буфере - там иногда могут быть ошибки, которые, похоже, пока не удалось исправить:
https://github.com/godotengine/godot/issues/75485

>Как вообще пофиксить подобное
Удалить меши и пересоздать их заново. Особенно если у тебя MultiMeshInstance3D.

>вероятность того, что эта ошибка вылезает где-то кроме move_and_slide() стремится к нулю
С чего такая уверенность? Этот метод двигает физическое тело. Если подозреваешь, что проблема именно в нём, а не в графике, тогда удали все MeshInstance3D и оставь только CharacterBody3D с его CollisionShape3D. Включи отображение коллизий, чтобы видеть персонажа на экране без мешей, и тестируй.
Аноним 31/05/24 Птн 23:47:51 #441 №954252 
xebd32a6d.jpg
>>954228
Не нравится мне его подход к чарактер контроллеру.
Лучше абстрагировать инпут игрока от персонажа.
Пикрил (не нашёл более подходящую картинку).
Аноним 01/06/24 Суб 00:00:54 #442 №954254 
>>954235
>Ты забыл указать строчку кода в исходниках
E 0:00:38:0649 instance_set_transform: Condition "!v.is_finite()" is true.
<Исходный код C++>servers/rendering/renderer_scene_cull.cpp:922 @ instance_set_transform()


>С чего такая уверенность?
>Суть проблемы: один из компонентов матрицы NaN или бесконечность, поэтому матрицу не удаётся применить.
Ну мб я преувеличил. Я, по сути, почти совсем нюфаня. Я как раз делал везде где только можно проверки скоростей и величин, чтобы они были не нан и не бесконечность, и только после этого применял move_and_slide().

>а не в графике
Я вообще не в курсе, что это тоже влияет

>удали все MeshInstance3D и оставь только CharacterBody3D с его CollisionShape3D
Сделал. Та же хуйня.

>Нужно смотреть, какие значения у тебя в матрице мешей, которые закреплены за телом, которое ты пытаешься двигать.
Подскажи, плс, как это сделать, и как это поможет
Аноним 01/06/24 Суб 00:01:26 #443 №954255 
>>954106
>Аж трисет.
Не завидуй. У него 6.9К лайков, а у тебя сколько?
https://reddit.com/r/PixelArt/comments/17xgycv/

>Тупо обрисовка
По его словам в комментариях, рисовал без этого:
https://en.wikipedia.org/wiki/Rotoscoping
Но даже если этой техникой, то какая разница?
Главное, чтобы результат был хороший.

Дрочь на техники == дрочь на движкописание.
Делайте игры на ассемблере, а то не труъ.
Аноним 01/06/24 Суб 00:13:32 #444 №954256 
>>954254
><Исходный код C++>servers/rendering/renderer_scene_cull.cpp:922 @ instance_set_transform()
Да, это та самая строчка.

>>значения в матрице
>как это сделать
Либо через инспектор в сцене Remote в запущенном проекте, либо print(transform).

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

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

Ты случайно не трогал масштаб CharacterBody? Сбрось его в исходное состояние.
Аноним 01/06/24 Суб 00:48:57 #445 №954264 
1.jpg
>>954256
[X: (-0.767623, 0, -0.640902), Y: (0, 1, 0), Z: (0.640902, 0, -0.767623), O: (-7.212014, -0.294964, 1.819657)]
[X: (-0.767623, 0, -0.640902), Y: (0, 1, 0), Z: (0.640902, 0, -0.767623), O: (-7.25317, -0.294962, 1.784231)]
[X: (-0.763492, 0, -0.645818), Y: (0, 1, 0), Z: (0.645818, 0, -0.763492), O: (-7.25317, -0.294962, 1.784231)]
[X: (-0.763492, 0, -0.645818), Y: (0, 1, 0), Z: (0.645818, 0, -0.763492), O: (-7.293885, -0.294962, 1.749318)]
[X: (-0.760393, 0, -0.649464), Y: (0, 1, 0), Z: (0.649464, 0, -0.760393), O: (-7.293885, -0.294962, 1.749318)]
[X: (-0.760393, 0, -0.649464), Y: (0, 1, 0), Z: (0.649464, 0, -0.760393), O: (-7.334162, -0.294962, 1.714919)]
Я хз, как это поможет.

>Ты случайно не трогал масштаб CharacterBody? Сбрось его в исходное состояние.
Скейл, вроде, весь по 1

>Алсо, мог бы хотя бы скриншот своего кода показать, скриншот дерева сцены и т.д.
Да я даже проект позже могу приложить, вот только надо разобраться с баном от двоща, лол (не ебу, какого хуя прилетел)
Древо сцены - см. пик
Код кидать смысла нет - там ща лютый говнокод, который надо разгребать. Я как раз находился в процессе, когда обнаружил баг.

Вообще, ситуация осложняется тем, что изначально код не мой. Основу кода и древо сцены делал другой чел, и он там где-то, в теории, мог накосячить - он еще больший ньюфаг, чем я
Аноним 01/06/24 Суб 01:46:29 #446 №954268 
>>951925 (OP)
У вас часто такое бывает, что редактируешь-редактируешь один скрипт (у него @tool и class_name), а когда пытаешься использовать его из другого скрипта, редактор почему-то не знает актуальное состояние скрипта и ругается на отсутствующие ошибки? Ничего не помогает, приходится перезагружать проект.

Пример: я объявил метод close() -> void, использовал его в другом скрипте, всё было нормально, а потом я решил, что мне нужно, чтоб этот метод возвращал какой-то результат. Я изменил скрипт, а потом попытался использовать возвращаемый результат - редактор ругается, что метод ничего не возвращает.

Нажимать "soft reload tool script" пробовал, не помогает. Также пробовал убирать метку @tool, это не влияет. Похожая проблема наблюдается при частом редактировании нескольких class_name скриптов (без @tool), редактор почему-то не может их вовремя обновить и выдаёт ошибки.

Проблема мелкая, но перезагружать весь редактор раздражает.
Аноним 01/06/24 Суб 02:14:26 #447 №954270 
Безымянный.png
>>954264
Что тебе CollisionShape3D говорит? Жёлтый значок - предупреждение о каком-то косяке, как правило - твоём, кликни и прочитай. Если там сообщение с пикрила - сбрось ему масштаб. Встроенный физический движок непредсказуемо косячит с масштабированием.

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

Алсо, рекомендую привыкать разделять сцену на отдельные самостоятельные сущности, которые сохраняются в отдельные tscn-файлы и затем используются в композиции других сцен:
- Player - главный кандидат на такое выделение, он же должен забрать к себе Camera3D (исключение, если это камера локации, фиксированная на месте и следящая за игроком как ИРЛ камера).
- Часто используемые звуки лучше сгруппировать в одну сцену, типа "плеер звуков", исключение - если это локальные звуки вроде открывания ящика (они принадлежат сцене ящика).
- Препятствия разложить по отдельным сценам, особенно если они часто повторяются, вроде конусов на дороге, барьеров и т.д. Иначе задолбаешься расставлять/двигать их по сцене.

Тогда для тестирования Player было бы достаточно закинуть его на пустую площадку, уже с камерой и всем необходимым для его работы.
Аноним 01/06/24 Суб 05:15:55 #448 №954274 
image.png
>>954227
Да делаю, я делаю! Блин!
Аноним 01/06/24 Суб 07:40:16 #449 №954277 
totally pies.mp4
1632560156126560517.png
>>953823
>А что там в секторы засунуть - это мелочи.
Засунул немного мелочей в секторы, норм?
Аноним 01/06/24 Суб 09:11:45 #450 №954281 
Анончики-шарписты, если в рандомные моменты я ловлю "The program '[35204] Godot_v4.2.2-stable_mono_win64.exe' has exited with code -1073741819 (0xc0000005).", то что я могу сделать? Ни указания на строку, ничего. Я конечно могу закомментить части кода, но я всё равно не узнаю, это ошибка ещё не выскочила, или действительно проблемный фрагмент закомментировал. Помогите пожалуйста...
Аноним 01/06/24 Суб 10:24:08 #451 №954287 
>>954281
>0xc0000005
По-человечески это называется STATUS_ACCESS_VIOLATION.

>что я могу сделать?
1. Проверить, где ты в своём коде обращаешься туда, куда обращаться тебе запрещает ОС: скорее всего, ожидаемый тобой по ссылке объект был уже уничтожен, а ты пытаешься к нему обратиться - ОС запрещает это, чтобы программы не могли залезть в чужую память, и поэтому крашит без разбора всех, кто так делает.

2. Перейти на GDScript, на нём такого нет (дебаггер сразу указывает туда, где ты обратился куда не следует, вместо краша с ошибкой ОС, и чётко говорит, в чём проблема).

>не узнаю, это ошибка ещё не выскочила, или действительно проблемный фрагмент закомментировал
Чтоб такого не было, применяют TDD:
https://en.wikipedia.org/wiki/Test-driven_development
Аноним 01/06/24 Суб 14:40:08 #452 №954302 
>>954287
Всё дело в том, что ошибка вылезает не в моей логике, а будто после того как один Process закончился, а следующий ещё не начался.
Аноним 01/06/24 Суб 14:48:17 #453 №954304 
>>954302
> ошибка вылезает не в моей логике
Если ты обнаружил баг движка, то можешь сделать новый проект, по шагам воспроизвести баг, убедиться, что ты обнаружил баг движка, и зарепортить на гитхаб ищью.
Аноним 01/06/24 Суб 14:50:05 #454 №954305 
Анон, как правильно в паттерне стейтмашины обрабатывать инпуты - в скрипте каждого стейта или в одном плейерконтроллере макаронно?
Аноним 01/06/24 Суб 14:51:03 #455 №954306 
>>954305
Не бывает "как правильно", бывает - как удобно тебе.
Аноним 01/06/24 Суб 14:58:01 #456 №954309 
>>954302
>ошибка вылезает не в моей логике
Если ты в этом так уверен, то иди на гитхаб и создавай issue. Желательно к описанию проблемы приложить минимальный проект, в котором гарантированно воспроизводится эта проблема. Там почитаешь, что нужно для правильного оформления (версия движка, версия ОС, что делал и т.д.).

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

Сам движок тут ничем не поможет, твой код (или ошибка в движке) приводит его в состояние, в котором ОС принудительно завершает процесс. Можно отследить, на каком конкретно этапе происходит остановка, если использовать внешний дебаггер, но он, наверное, будет выдавать кучу ассемблерных кодов, и ты в этом, скорее всего, ничего не разберёшь.

А, вот ещё. Если делаешь регулярные бекапы или заливаешь код в систему контроля версий, тогда попробуй открыть предыдущий бекап и проверь, есть ли там эта ошибка. Потом сравни, что ты успел налепить в коде до появления ошибки. Так сузишь область поиска проблемы. Мне пару раз помогало, когда я наговнокодил кучу всего и сам в этом запутался.

На будущее рекомендую тестировать проект после минимальных изменений. Чем меньше изменений между тестами, тем меньше мест, в которых придётся искать ошибку - чаще всего ошибка возникает из-за свежего кода.
Аноним 01/06/24 Суб 15:05:27 #457 №954312 
>>954305
Я считаю более выгодным создавать абстрактного персонажа, который никем конкретным не управляется, но имеет состояния и переходы между ними, может ходить, бегать, прыгать и т.д. Создав такого персонажа, ты сможешь не только с клавиатуры его контролировать, но и через код, т.е. создать бота, который игромеханически будет равен игроку - в плане того, что он точно так же бегает, прыгает и делает все остальные действия.

Соответственно, тебе нужен скрипт, реагирующий на внешние команды, и отдельный скрипт, генерирующий эти команды от ввода с клавиатуры или от мозгов неигрового персонажа. Двух зайцев одним выстрелом, да? В туториалах об этом не говорят и чарактер контроллеры, которые я видел, прибиты гвоздями к вводу с клавиатуры...
Аноним 01/06/24 Суб 15:51:49 #458 №954322 
>>954304
>>954309
Я не думаю, что это баг движка, скорее всего это я где-то накосячил, но косяк вылезает в месте, которое я не могу отследить.
Аноним 01/06/24 Суб 15:58:38 #459 №954324 
>>954322
>косяк вылезает в месте, которое я не могу отследить
Ещё раз, разбираемся:
1. Изначально твой проект был без ошибки (как минимум пустой).
2. Ты добавил код - он работал всё ещё без ошибки.
3. Ты добавил больше кода - начала выпадать ошибка.
4. Убрал добавленный код - ошибка перестала выпадать.
5. Изучаешь, что ты делаешь в коде, и понимаешь, откуда ошибка.
Я в таких случаях стараюсь исполнить код в голове или в Блокноте.
Аноним 01/06/24 Суб 16:01:17 #460 №954327 
>>954322
Ещё попробуй сбросить весь кэш проекта (.godot), вдруг это Godot что-то сам себе сломал.
Аноним 01/06/24 Суб 16:02:31 #461 №954328 
>>954324
Понимаешь, проблема в том, что это
> 3. Ты добавил больше кода - начала выпадать ошибка.
Это смена библиотеки ECS, я знаю, что если я откачусь на версию до смены, то там этой ошибки не будет. У меня слишком много кода, чтобы выполнять его в голове и анализировать классическими методами.
>>954327
Попробую, но надежды мало
Аноним 01/06/24 Суб 16:54:56 #462 №954344 
>>954328
>Это смена библиотеки ECS, я знаю, что если я откачусь на версию до смены, то там этой ошибки не будет.
Даже и не знаю, чем тебе помочь, если ты не можешь отказаться от багованной библиотеки, про которую ты уже знаешь, что она багованная. Попробуй написать разработчикам этой библиотеки.

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

Вот чего я не пойму, ты ведь новичок? Судя по тому, что ты не знал про ошибку доступа, вряд ли у тебя богатый опыт программирования. Но ты взял C# (объективно сложнее GDScript, хуже поддержка движком, меньше туториалов и годотеров, способных помочь в контексте движка), в добавок взял ECS (объективно сложнее отлаживать, чем классическое ООП, а его главное преимущество играет роль только на очень большом количестве одинаковых компонентов - десятки тысяч), навалил кучу какого-то кода, который сам не можешь проанализировать (нейронкой генерировал?), а теперь бодаешься с ошибкой, которую не можешь понять. Зачем ставить себе столько палок в колёса? Ты игру хочешь сделать или что? Или у тебя какое-то задание, которое ты взял, не подумав о последствиях? Если ты сам для себя это делаешь, проще бросить проект и начать с нуля, чем распутывать клубок неудачного кода, в котором ты сам не разбираешься. Всё равно большинство инди-проектов так и остаются недоделанными - это факт.

Извини, если что, не хочу обидеть.
Аноним 01/06/24 Суб 17:11:36 #463 №954346 
>>954344
> Попробуй написать разработчикам этой библиотеки.
Я перешёл на более популярную библиотеку. Думаю она стабильнее.
> Вот чего я не пойму, ты ведь новичок?
> Судя по тому, что ты не знал про ошибку доступа,
> вряд ли у тебя богатый опыт программирования
> который сам не можешь проанализировать (нейронкой генерировал?)
> которую не можешь понять.
> Извини, если что, не хочу обидеть.
Не буду тратить время на расписывание, что я не дурак. Складывается впечатление что ты хочешь самоутвердиться за мой счёт. Вместо того, чтобы просто сказать "Анон, я не знаю метода как отловить ошибку доступа" ты начал предлагать мне сменить язык, принцип разработки и начал учить что такое ошибка доступа.
Аноним 01/06/24 Суб 17:27:58 #464 №954350 
И так, ноды крутятся - кликер мутится. В целом основа сделана, самое сложное было понять как лучше сделать юай и скомбенировать его с игровым полем, т.к яндекс хуй пропустит игру если она не все поле окна занимает пришлось много думать чтоб что то получилось адекватное ибо саму игру рендерит 3д камера, а опыта в 3д до этого вообще небыло. Пришел крч к тому что сплитнул экран на две части, на одной юай, на другой вьюпортконтейнер, вроде неплохо выглядит, и ресайзится нормально. Сам юай и худ полностью готовы, базовые улучшения готовы, осталось только зарескинить на что то более приятное, а так же прикрутить звуки и под конец сам яндекс. В целом опыт с кликером достаточно приятный, да и вообще когда твой шизоидный высер из головы становится похожим на игру это плюс мораль и мотивация всегда.
В планах пока что только отдохнуть ибо хуярил чтоб не спиздеть часов 20 подряд. А потом напиздить ассетов гуи.
Такие вот дела.
А ты чем щас занять анон?
Аноним 01/06/24 Суб 17:35:00 #465 №954352 
>>954346
>Думаю она стабильнее.
Но у тебя ошибка доступа, которую ты не можешь отловить. После смены библиотеки на "стабильную". В проекте, где у тебя уже куча кода, в котором ты не можешь просто так взять и разобраться. Сам себе приключение устроил.
>что я не дурак
Я не говорю, что ты дурак, но, судя по постам, ты допускаешь ошибки новичка, и я заранее предупреждаю об этом.
>Анон, я не знаю метода как отловить ошибку доступа
Я знаю, как её отловить, и уже писал - берёшь отладчик и смотришь, на какой инструкции процессора Godot крашится. Только это вряд ли чем-то может помочь, если ты не разбираешься в низкоуровневой отладке. Если у тебя стоит подходящий отладчик, Windows сама должна предложить открыть процесс в отладчике.
>начал предлагать мне сменить язык, принцип разработки
Потому что в GDScript реально легче работать. Если ты на C# с ECS только ради производительности, то это преждевременная оптимизация. Тем более что API Godot само по себе медленное, так что у тебя получается бутылочное горлышко между Godot и твоей библиотекой. Там много нюансов. На GDScript можно быстро сделать игру, а потом уже думать, что и зачем переносить на более производительный язык или в ECS. Да, сделать в первый раз всегда сложнее и дольше, чем перенести готовое куда-либо. Да и в целом, GDScript более чем достаточно для большинства задач, а код пишется легко и гибко. К табам и отступам привыкаешь очень быстро.

У тебя Microsoft Visual Studio Debugger есть? По идее, он должен помочь с поиском проблемного места.
Аноним 01/06/24 Суб 17:46:03 #466 №954353 
>>954346
Вон, создатели твоего любимого C# целую статью про отладку для чайников накатали:
https://learn.microsoft.com/en-us/visualstudio/debugger/debugging-absolute-beginners
Аноним 01/06/24 Суб 18:03:45 #467 №954357 
pies.mp4
>>954277
Доработал немного.

>>954350
>А ты чем щас занят
Прокрастинирую.
Результат на видео.
Аноним 01/06/24 Суб 19:07:44 #468 №954373 
dev-snapshot-godot-4-3-beta-1.jpg
>>953962
>беты всё ещё нет
ВЫШЛА ВЫШЛА ВЫШЛА
https://godotengine.org/article/dev-snapshot-godot-4-3-beta-1/
Ещё немного подождать и сможем начать делать игры!
Аноним 01/06/24 Суб 20:21:31 #469 №954397 
image.png
>>954352
>>954353
Я разобрался без дебаггера. Оказалось - библиотека и ЕКС в принципе не виноваты. Какой-то подлец залил мне диверсию прямо в костыльный второй контроллер инпута. Вот что бывает когда спешишь делать что интересно, а не как по уму.
Аноним 01/06/24 Суб 21:00:07 #470 №954410 
>>954397
>Какой-то подлец залил мне диверсию
Это самоирония? Или проект на гитхабе? Или код - копипаста?

>спешишь делать что интересно
Что интересного в InputEvent.Unreference()?

Насколько я понимаю, InputEvent нельзя уничтожать, потому что он последовательно проходит по всему дереву. Т.е. уничтожив этот объект в одном месте ты вызываешь ошибку доступа где-то дальше по дереву, где его кто-то ждёт. Хотя как это к C# относится - не знаю, разве в C# принято удалять объекты вручную? Кажется, там GC автоматически всё удаляет.

Ну, главное, ты разобрался - рад за тебя.
Аноним 01/06/24 Суб 21:06:16 #471 №954411 
>>954397
https://docs.godotengine.org/en/stable/classes/class_refcounted.html#class-refcounted-method-unreference
>bool unreference ( )
>Decrements the internal reference counter. Use this only if you really know what you are doing.
>Returns true if the object should be freed after the decrement, false otherwise.
Т.е. получается, что ты уменьшил счётчик ссылок, и это вызвало преждевременное удаление объекта. По-прежнему непонятно, зачем это нужно было делать в данном конкретном случае. Возможно, эту функцию нужно использовать для разрешения циклических зависимостей, когда A и B ссылаются друг на друга и поэтому не могут быть освобождены штатным путём (читал что-то об этом в документации).
Аноним 01/06/24 Суб 21:07:12 #472 №954412 
>>954410
> самоирония
Это
> Что интересного в InputEvent.Unreference()
> Decrements the internal reference counter. Use this only if you really know what you are doing.
Оказалось я не знал что тогда делал. Думаю что я тогда хотел сделать так, чтобы если в одном инпуте обработал ивент, то больше его никто не мог использовать
> рад за тебя
Спасибо
Аноним 01/06/24 Суб 21:10:39 #473 №954415 
>>954412
>если в одном инпуте обработал ивент, то больше его никто не мог использовать
Для этого тебе нужно это, если ещё сам не нашёл:
https://docs.godotengine.org/en/stable/classes/class_node.html#class-node-private-method-unhandled-input
https://docs.godotengine.org/en/stable/classes/class_viewport.html#class-viewport-method-set-input-as-handled
Аноним 01/06/24 Суб 21:12:33 #474 №954417 
>>954415
Я находил, но по неизвестной причине, выбрал этот мутный вариант.
Аноним 02/06/24 Вск 10:21:41 #475 №954481 
>>954417
Ну зато теперь ты чуть больше знаешь о том, что ты делаешь.
Аноним 02/06/24 Вск 12:51:32 #476 №954530 
>>954344
>ECS
>главное преимущество играет роль только на очень большом количестве одинаковых компонентов - десятки тысяч
Я от про слышал, что ECS в гейдеве - это единственно правильное и оптимальное решение.

Изи в рефакторинге, изи в масштабировании и реюзабельности. Да и много логичней остальных подходов.

Я только мечтаю вкатиться в геймдев и многого не знаю еще. Но просто пока искал информацию о разных подходах, то нашел, что TCS - самый топ номер 1.
Аноним 02/06/24 Вск 15:17:34 #477 №954578 
>>954530
Не, это инфоцыгане были. Реальные про как раз сказали, что это оказалось ошибкой.
Аноним 02/06/24 Вск 15:19:45 #478 №954579 
>>954530
>нашел, что ECS - самый топ номер 1
Некоторые шизы будут тебе и про функциональные языки точно так же говорить, мол, иммутабельность - топ номер 1, всё должно состоять из функций, игра - это тоже одна иммутабельная функция, типа вызываешь game() и получаешь игру, если захотел нажать кнопку - выбросил старую игру и вычислил новую игру с нажатой кнопкой, и т.д. Это прекрасно работает в идеальном мире, но мы живём в реальности, а не в фантазии функциональщиков. Ты можешь, конечно, использовать .all(), .any(), .filter(), .map() и прочие полезные функции, популярные в функциональщине, но всю игру на одном этом не построишь.

>Изи в рефакторинге, изи в масштабировании и реюзабельности
При условии, что ты мыслишь в стиле ECS.

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

В чём преимущество? Допустим, у тебя 100 тысяч прыгателей. Если ты пользуешься классическим ООП, в теории процессор будет метаться по разным участкам памяти, по отдельности прыгая каждого прыгателя, и так 100 тысяч раз. Если ты обмазал код ECS, тогда в теории процессор загрузит в свой кэш все компоненты "прыгатель" одним массивом и быстро пройдётся по этому массиву кодом из "прыганья", не обращаясь к чипам оперативной памяти, потому что все данные у него уже есть в кэше (обращение к RAM - долго, именно поэтому придумали кэш и с каждым годом его увеличивают в процессорах).

На практике хрен знает что будет, процессор не только с твоей игрой работает (игра - только гость в ОС, которая всем управляет), и вообще там все эти оптимизации сложнее, чем в фантазии геймдевелоперов. Часть оптимизаций оказались уязвимы к вирусам... Но наверняка придумают что-то ещё. Короче, не всё так однозначно в процессорах.

Зато тебе, как разработчику игры, приходится разделять код на тысячи якобы (по заявлениям любителей ECS) ничем не связанных сущностей ("прыгатель", "ходитель", "предметособиратель", "стрелятель", "умиратель", "подлечатель", "подмыватель", "пенетратель", "оратель" и прочее), которые в реальности очень тесно друг с другом связаны и ты не можешь думать о них по отдельности - ты думаешь об игроке, который бегает, прыгает, стреляет, умирает и орёт, а не о кучке полностью независимых систем и компонентов. Мышление человека - основа ООП, а не наоборот, человеку намного проще думать о цельных объектах, чем о кучке ничем не связанных компонентов и систем. А комбинировать компоненты можно и на ООП, никто тебя не заставляет пользоваться наследованием (на которое обычно ругаются, аргументируя в пользу ECS) - пользуйся преимущественно композицией и агрегацией, получишь точно такую же гибкость архитектуры проекта, что и в ECS, но зато объекты будут как в твоих мыслях.

Короче, ИМХО, ООП намного лучше подходит геймдеву, и страдает только в случае если тебе нужно сто тыщ юнитов с одним и тем же кодом, что бывает крайне редко и не факт что вообще получится. Древние стратегии в реальном времени создавали и без модного ECS на медленных процессорах с крайне ограниченным кэшем. Godot, между прочим, имеет под капотом множество оптимизаций по кэшу процессора в системах, где это действительно необходимо (эти системы тут называются "серверы"). Если тебе нужно оптимизировать сто тыщ сущностей по кэшу - ты берёшь и пишешь собственный модуль движка на C++, выставляешь API и дёргаешь по необходимости из GDScript. Да и вообще, Godot не то чтобы самый эффективный, пытаться максимально оптимизировать проект на нём - это как ставить двигатель от реактивного истребителя на Запорожец - технически возможно, но результат вряд ли обрадует. Обещают сфокусироваться на оптимизациях движка, начиная с версии 4.4, тогда как версия 4.3 только вышла в бету. Однако, для освоения базы геймдева Godot сегодня подходит лучше всех, ты просто качаешь движок, создаёшь проект и начинаешь играть в разработчика игр в своё удовольствие, развлечение гарантировано на сотни часов. Можно забыть обо всяких Скретчах, Гейм Мейкерах и т.д.
Аноним 02/06/24 Вск 15:26:41 #479 №954581 
>>954579
Ты не понимаешь сути ECS
Аноним 02/06/24 Вск 15:30:14 #480 №954583 
Композиция наследование получаешь просто блоб, который ты просто не можешь рефакторить.

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

Я только пытаюсь вкатиться в игродевелопмент.
Аноним 02/06/24 Вск 15:39:14 #481 №954589 
>>954583
>Но я не соображаю вообще о чем речь идет, а ты меня грузишь.
>Я только пытаюсь вкатиться в игродевелопмент.
Англюсик знаешь ведь? Хорошо. Иди поиграй в это - онлайн, без смс и регистрации:
https://www.gdquest.com/news/2022/12/learn-gdscript-app/
>Our app is designed to be accessible to people with no programming experience. It provides a step-by-step guide to learning GDScript, starting with the absolute basics and gradually introducing more concepts.

О всяких ECS пока не думай вообще, начинай с самых основ (переменная, цикл, функция и т.д.).
Аноним 02/06/24 Вск 15:42:09 #482 №954590 
>Англюсик знаешь ведь? Хорошо. Иди поиграй в это - онлайн, без смс и регистрации:
Минимальность только. Уровня хеллоу, зэариз э говнотред.

В системах просто описываешь поведение компонентов. В чем проблема?

Я так же не понимаю программирование. Просто позырил что-то и подумал, что так и должно быть.
Аноним 02/06/24 Вск 15:43:38 #483 №954592 
>>954589
>переменная, цикл, функция и т.д.
Ну такие залупы я знаю. Это слишком изи для дебилов совсем.
Аноним 02/06/24 Вск 15:45:09 #484 №954593 
>>954579
Буквально база, фундамент. Расписал все даже лучше чем я бы смог.
Аноним 02/06/24 Вск 15:46:05 #485 №954595 
>>954590 >>954592
Если вы такие умные и сами всё можете, зачем вопросы здесь задавать?
Потом похвастаетесь готовыми играми собственного производства.
Аноним 02/06/24 Вск 16:06:29 #486 №954601 
>>954595
Крыша совсем поехала?
Аноним 02/06/24 Вск 18:42:31 #487 №954637 
>>954579
База, но нужно не забывать упоминать, что ECS придумали для анчартеда на третьей плойке, в рамках оптимизации под трёшкоплойковский массив сопроцессоров. Там этот ECS давал просраться остальным игорам и выжимал из плойки весь потанцевал.

На архитектуре пека это зачем - вопрос открыт.
Аноним 02/06/24 Вск 18:53:04 #488 №954639 
Вот мы с аноном в прошлом треде обсуждали утиную типизацию. И вот я тут подумал, что в Годоте при помощи групп и утиной типизации можно запилить аналог ЕЦС, без необходимости тащить сторонние компоненты.
Есть метод get_tree().call_group("группа", "метод"). Он вызывает метод из аргумента для всех нод, состоящих в группе и присутствующих в дереве. Ноды могут состоять в любом количестве групп, вплоть до того, что ноды в течение игры могут исключаться из групп и включаться снова. Чем это не ЕЦС? Это больше чем ЕЦС. В группе могут быть непосредственные ноды-"делатели", а могут быть ноды-компоненты, прикреплённые к целевой ноде, и манипулирующие ею. В результате всё равно собирается массив и обрабатывается как в ЕЦС.
Надо будет потестировать этот вариант.
Аноним 02/06/24 Вск 20:40:51 #489 №954668 
spiral.jpg
>>951925 (OP)
КОТОРЫЙ РАЗ СЛУЧАЙНЫМ КЛИКОМ ПО [ Х ] ЗАКРЫЛ В Е С Ь ПРОЕКТ
@
ВСПОМНИЛ, ЧТО ВРОДЕ БЫЛА КАКАЯ-ТО ОПЦИЯ В НАСТРОЙКАХ
@
ПОИСКАЛ
@
НЕ НАШЁЛ
@
ПОГУГЛИЛ
@

>This seems a neverending wheel. Some people requested confirm quit, so it was added, then people said modern apps do not have this, so this was removed, and now people ask for confirm quit again...
Аноним 02/06/24 Вск 21:09:45 #490 №954673 
>>954639
>Есть метод get_tree().call_group("группа", "метод").
Есть пара проблем:
https://docs.godotengine.org/en/stable/classes/class_scenetree.html#method-descriptions
>Calls method on each member of the given group. You can pass arguments to method by specifying them at the end of the method call. If a node doesn't have the given method or the argument list does not match (either in count or in types), it will be skipped.
Т.е. ты должен реализовать этот метод везде, где хочешь его вызвать (это не метод вызывающей ноды, а метод вызываемой ноды, иначе этот аргумент был бы Callable, а не StringName). Не проблема, если в группе состоят дубликаты одной и той же сцены/ноды, но ты не можешь просто добавить рандомную ноду в группу, не реализовав в её скрипте соответствующий этой группе метод. Точнее можешь, но тогда попытка вызывать метод пропустит эту рандомную ноду без подходящего метода.
>Note: call_group will call methods immediately on all members at once, which can cause stuttering if an expensive method is called on lots of members.
Т.е. метод выполняется у всех нод в группе, и ты не можешь как-то легко взять и разделить этот процесс на несколько потоков или шагов (не создавая новые группы для каждого потока/шага). Нормально, если нужно всего лишь поставить галочку на сотне нод, но десятки тысяч ты так не обработаешь за один кадр. Впрочем, наверное, можно реализовать параллелизм, если забраться в исходники движка... но это может вызвать проблемы с методами, которые обращаются к каким-то внешним данным.

>Ноды могут состоять в любом количестве групп, вплоть до того, что ноды в течение игры могут исключаться из групп и включаться снова. Чем это не ЕЦС? Это больше чем ЕЦС.
Группы - это всего лишь теги. Аналог компонентов из ECS - это метаданные:
https://docs.godotengine.org/en/stable/classes/class_object.html#class-object-method-set-meta
>Adds or changes the entry name inside the object's metadata. The metadata value can be any Variant, although some types cannot be serialized correctly.
Потому что компоненты хранят в себе какие-то данные, а не просто тег. Система проходит не по массиву тегов, а по массиву конкретных данных, которые, по идее, должны всем массивом загружаться в кэш процессора.

Т.е. бесполезно вызывать метод на нодах. Пример системы в ECS:
>for entry in data_array: entry.x += 1
Этот код загрузился в процессор, процессор увидел "data_array" и скачал весь массив из RAM, пробежался по этому массиву, добавляя +1 для поля x в каждом компоненте, а в конце вернул изменённый массив в RAM. При этом массив должен состоять только из данных, без ссылок (pointer), иначе весь профит теряется при попытке процессора перейти по ссылке, которая указывает в рандомное место в RAM. Конечно, современные процессоры пытаются предугадать переходы по ссылкам и запросить данные заранее, но уязвимости в этом алгоритме вроде как заставили отключить эту фичу (или другую похожую... не помню).

Собственно, без этой фичи (загрузка данных одним блоком) смысла и преимуществ у ECS нет.

Т.е. если ты делаешь так:
>for object in object_array: object.x += 1 # переход по ссылке object в поисках x в RAM
Или, тем более, так:
>for object in object_array: object.do_work() # переход по ссылке object в поисках do_work()
Это не ECS и преимуществ у этого никаких нет.
Аноним 02/06/24 Вск 21:28:23 #491 №954675 
>>954673
Я не могу понять в какой момент ECS от примитивных данных на стеке (интов, флотов) переходит к сложным данным в куче (стрингов, мешей)?
Когда мне рассказывают про ECS то как и ты в этом посте приводят пример как проц пробегает по массиву, состоящему из структа с интами, я полагаю из твоего же кода, но игра это же не структы с интами, и ты не сможешь избегать указателей всё время.
Аноним 02/06/24 Вск 21:38:04 #492 №954677 
>>954675
Второй пункт ECS состоит в том чтобы не бегать по таблицам виртуальных методов

https://ru.wikipedia.org/wiki/Таблица_виртуальных_методов

Считается что системы уменьшают промахи кеша процессора, типа за раз обходится массив компонентов вызывая один и тот же код системы. А сам компоненты уже плоские структуры данных без методов
Аноним 02/06/24 Вск 21:39:11 #493 №954678 
>>954677

мимо шел
Аноним 02/06/24 Вск 21:41:44 #494 №954679 
>>954675
>переходит к сложным данным в куче (стрингов, мешей)
>но игра это же не структы с интами, и ты не сможешь избегать указателей всё время.
Вот-вот, и я о том же. ECS только в фантазии даёт твоей игре буст в 100500% скорости по сравнению с "постоянно прыгающим по ссылкам" ООП, а на практике ощутимая разница будет только в узком круге задач, и то не факт.

Зато проблемы архитектуры проекта вылезут, как только начнёшь делать что-то сложнее Hello World, потому что запутаешься в куче неявных связей между "никак (явно) не связанными" компонентами и системами.

Тут где-то был тред Katabasis - по-моему, ОП там признался, что пожалел о своём выборе ECS (на Unity).
Аноним 02/06/24 Вск 21:43:16 #495 №954680 
>>954678
>>954677
Это очень интересно, но вопрос остаётся в силе. В какой момент пробегание по массиву примитивных данных в кеше процессора превращается в игру на экране? Со звуком, модельками, анимациями, геймплеем. От меня эта магия ускользает.
Аноним 02/06/24 Вск 22:01:25 #496 №954685 
>>954680
Это надо гуглить насколько оправданы такие выводы. Если бенчмарки.
С другой стороны основная фича ECS это замена наследования композицией. Чтобы каждая игровая сущность могла происвольную функциональность иметь.

Эта функциональность разбивается на компоненты. Каждая сущность связывается со своим набором компонент.

И тут представление копонент в виде плоских данных сильно упрощает разработку логики.

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

Для плюсов например максимально прозрачно это делается в популярной библиотеке EnTT
Аноним 02/06/24 Вск 22:01:53 #497 №954687 
>>954685
Если есть бенчмарки.
Аноним 02/06/24 Вск 22:14:09 #498 №954691 
>>>>954685
> С другой стороны основная фича ECS это замена наследования композицией.
Не проблема для годота. К любой ноде можно прикрепить любую ноду, составив тем самым композицию. При этом, основной набор нод основан на наследовании. В итоге движок нас никак не ограничивает. Хочешь наследование - наследуйся. Хочешь композицию, цепляй ноды-компоненты к чарактербоди.

Но я не могу понять другое, как там от примитивных данных на стеке переходят к прогрузке ресурсов в игру, которые как ни крути, в стек не влезут?
Аноним 02/06/24 Вск 22:26:37 #499 №954696 
>>954691
Не понял почему примитивных данных

К примеру у тебя классический компонет
stкuct TransformConmponent {
Vector3f position;
Vector3f velocity;
}

система
stкuct TransformSystem {
void update(Registry &registry, Time &deltaTime) {
...
for (auto elem: components) {
elem.position += elem.velocity * deltaTime;
}
}
}
Аноним 02/06/24 Вск 22:29:03 #500 №954698 
>>954696
Потому что им не нужно выделять память в куче.
ПЕРЕКАТ Аноним OP 02/06/24 Вск 22:30:02 #501 №954700 
1717356597037.jpeg
>>954699 (OP)
>>954699 (OP)
>>954699 (OP)
Аноним 04/06/24 Втр 17:20:54 #502 №955057 
>>954668
Надо было добавить настройку "хотите ли вы видеть подтверждение".
Аноним 09/06/24 Вск 14:05:43 #503 №955704 
>>951993
бтв скретч заебись. Там часто взрослые дядьки программисты любят своим скиллом литерелли детишек унизить
Аноним 09/06/24 Вск 14:07:59 #504 №955705 
>>952224
иди нахуйээээээээээ
Аноним 09/06/24 Вск 14:09:02 #505 №955707 
>>952391
>А, еще надо сделать игру.
а без этого как-нибудь?
Аноним 09/06/24 Вск 15:54:10 #506 №955780 
1717937642899.jpg
1717937642926.jpg
1717937642927.jpg
Аноним 11/06/24 Втр 20:59:42 #507 №956228 
Антуаны, что за хуйня происходит? Чому у меня все работает, но дебаггер спамит ошибкой:

E 0:00:01:0491 player.gd:88 @ _physics_process(): Condition "det == 0" is true.
<Исходный код C++>core/math/basis.cpp:47 @ invert()
<Трассировка стека>player.gd:88 @ _physics_process()


Кот:
https://pastebin.com/ZEQA5pM5
Аноним 11/06/24 Втр 21:01:56 #508 №956230 
>>956228
>Кот
На коменты не обращайте внимания, они для дружбана одного, я для него эту фигню писал
Аноним 11/06/24 Втр 21:14:45 #509 №956232 
>>956228
Все, разобрался, я сам дурак - масштаб нечаянно выставил в (0.1, 0, 0)
Аноним OP 12/06/24 Срд 10:17:40 #510 №956268 
1718176652545.png
Бамп!
Аноним 28/06/24 Птн 16:48:14 #511 №958999 
>>952172
Нах качать из репов если есть аппимейдж? Вообще никогда даже не пытался сам скачивать, всё и так удобно и ебли с зависимостями меньше.
comments powered by Disqus

Отзывы и предложения