Godot #16

 Аноним OP 17/04/20 Птн 19:02:58 #1 №658384 
1587139375584.png
С чего начать, сидя дома на карантине?
С изучения документации. Если не можешь в инглиш, и даже в гугл-переводчик, то продолжается перевод официальной документации: https://docs.godotengine.org/ru/latest/
Но вообще, будь мужиком и изучи английский: https://docs.godotengine.org/en/stable/

Вместе с движком обязательно смотри примеры, там есть всё - от платформера до чата. Примеры качаются прямо в движке через свой магазин.
Скачать движок: https://godotengine.org/download/ или http://store.steampowered.com/app/404790/Godot_Engine/
FAQ: https://docs.godotengine.org/ru/latest/about/faq.html
Игры, созданные глобальными кириллами: https://godotengine.org/showcase или https://steamcommunity.com/app/404790/discussions/0/412448792354265655/
Скажи "Годот круто!" https://github.com/Calinou/awesome-godot - подборка дополнений, модулей и минишоукейс от одного из авторов.

Годнота от анона:
Для приверженцев опенсорца существует возможность распространять проекты в незапакованном формате. Просто скачай темплейт с оф.сайта и положи экзешник/эльфешник в папку с проектом, этого достаточно. Дополнительно можешь вшить свою иконку в экзешник. После этого, запустившийся файл темплейта обнаружит рядом с собой файл project.godot и начнет грузить проект из него и из файлов, лежащих в распакованном виде в той же директории.
В версии 3.2 появилась возможность прикреплять pck к бинарнику. Бриллиант для любителей однофайлового продукта!
Редактор персонажей на основе makehuman: https://github.com/Lexpartizan/Go_MakeHuman_dot
Все языки в одном месте: https://vk.com/topic-70467171_35982467
Тест-бенчмарк:
Веб-версия - https://govdot.herokuapp.com
Вишмастер для винды - https://govdot.herokuapp.com/4Anon.rar

Предыдущий тонет там: >>643188 (OP)

Архивы:
1 http://arhivach.ng/thread/207802/
2 http://arhivach.ng/thread/388500/
3 http://arhivach.ng/thread/388501/
4 http://arhivach.ng/thread/388502/
5 http://arhivach.ng/thread/388503/
6 http://arhivach.ng/thread/432708/
7 http://arhivach.ng/thread/433902/
8 http://arhivach.ng/thread/436355/
9 http://arhivach.ng/thread/455461/
10 http://arhivach.ng/thread/479963/
11 http://arhivach.ng/thread/489815/
12 http://arhivach.ng/thread/494513/
13 http://arhivach.ng/thread/515567/
14 http://arhivach.ng/thread/533171/
Loading...
Аноним 17/04/20 Птн 19:40:25 #2 №658422 
>>658384 (OP)
Видос в шапку не забудьте плиз

https://www.youtube.com/watch?v=BAsVI-Yv928
Аноним 17/04/20 Птн 20:11:53 #3 №658439 
>>658406
Есть.
Аноним 17/04/20 Птн 20:55:44 #4 №658477 
>>658439
Пости его сюда скорее
Аноним 17/04/20 Птн 22:23:01 #5 №658549 
>>658422
Ну где ж ты раньше был?
Аноним 17/04/20 Птн 23:54:53 #6 №658604 
>>658558 →
Так я и не программист ._.
Аноним 17/04/20 Птн 23:58:12 #7 №658607 
>>658604
Не грусти! Хочешь, я буду твоим программистом?
Аноним 18/04/20 Суб 00:36:27 #8 №658630 
>>658607
Спасибо! братишка :3
Сам справлюсь
Аноним 18/04/20 Суб 20:25:06 #9 №658892 
Смотрите, какую я чорную магию изобрёл:
> func pause_game(state : bool = !get_tree().paused):
> > get_tree().paused = state
Ответ, что функция делает - под спойлером. Сначала догадайтесь сами.










Когда вызываешь функцию без параметра, она работает, как переключатель. На входе получается инвертированное состояние паузы. Однако, ты всегда можешь вызвать функцию с явным параметром, и она уже сработает как включатель: либо гарантированно включит, либо гарантированно выключит.
Аноним 18/04/20 Суб 20:27:37 #10 №658894 
>>658892
Точно ли это работает? Вдруг там кешируется значение, а не вызывается по честному функция. Ну я конечно таким пользоваться не буду, предпочел бы тут три метода с четкими названиями - pause(), unpause() и toggle_pause
Аноним 18/04/20 Суб 21:26:45 #11 №658963 
1587234405178.png
1587234405241.png
>>658894
> Вдруг там кешируется значение, а не вызывается по честному функция.
Ну, вроде как.
Аноним 19/04/20 Вск 12:49:13 #12 №659146 
Как скопировать\переместить узел из одной сцены в другую, а то я объебался со структурой узлов и сцен, и я заебусь заново ее пересоздавать
Аноним 19/04/20 Вск 13:52:02 #13 №659158 
В вот Camera - это наследник Spatial, поэтому у нее есть поле Visibility. На что оно у нее влияет?
Аноним 19/04/20 Вск 16:17:15 #14 №659199 
>>659146
В редакторе - правый клик в дереве новых сцен, там merge from scene... откроется меню откуда можно выбрать подветку.
Аноним 19/04/20 Вск 16:33:13 #15 №659208 
>>659158
Похоже ни на что. Я особо не вникал, камеры работают примерно по таким правилам: камера рендерит в ближайший вьюпорт выше по дереву (таким образом можно рендерить в текстуру для постпроцессинга), если вьюпорта нет, рендерит в главное окно, если камер несколько, то надо ставить только одной current=true, если current у нескольких, то наверное работает более поздняя по списку (не знаю, гарантируется ли это). Например, если добавить контроллер игрока (сцену с камерой), и после него еще камеру, то включая current у последней, можно включать/выключать вид "извне" на игрока.
Аноним 19/04/20 Вск 16:40:35 #16 №659211 
1471396900113.png
>>659146
Вот изобразил нагляднее.
Аноним 19/04/20 Вск 16:56:22 #17 №659217 
gd.png
Еще такой вопрос, есть ли ограничение на вложенность нод в пределах сцены или дерева? Иначе поле parent в файле сцены может стать очень безумной длины. Или он все равно внутри это преобразует просто в ссылку на уже загруженную ноду, когда распарсит это поле и ограничений нет?
Аноним 19/04/20 Вск 17:01:14 #18 №659227 
>>659217
А зачем так делать? Они реально все должны быть поднодами, или тебе было просто лень располагать их параллельно?
Аноним 19/04/20 Вск 17:02:46 #19 №659228 
>>659227
Понятно, что в реальном проекте этого надо избегать. Просто знакомлюсь с особенностями движка.
Аноним 19/04/20 Вск 18:47:10 #20 №659271 
>>659211
>>659199
Спасибо, который раз уже помогаешь.
Аноним 20/04/20 Пнд 05:08:37 #21 №659437 
Тут кто-нибудь юзал 2д-партиклы?
Пытаюсь сделать выхлоп дульных газов. Но пока не понимаю, как сделать некоторые вещи, буду рад совету или (лучше) подходящему видеотутору. Что я уже посмотрел, там эти вопросы не освещаются.
а) Чтобы частица поворачивалась вместе со стволом. Вот я поворачиваю ствол, источник и направление полёта частиц вертятся вместе с ним; но сами спрайты не поворачиваются. В материале есть настройка Angle, можно фиксированно развернуть спрайт, и он в таком виде будет стрелять в любую сторону. Неужели это придётся кодить? Было бы очень неудобно.
б) Не нахожу никаких настроек прозрачности. Это же дым, он должен не резко исчезать, а постепенно. Но чёт не вижу такой опции. Это странно, вроде ж первейшее применение для партиклей. Сама картинка полупрозрачная, но этого мало же.
в) Как заставить её выплёвывать ровно по одной частице ровно тогда, когда мне нужно? Есть выключатель вкл/выкл, но он работает как-то по-своему, не начинает испускать частицы сразу по включению, а чего-то ждёт. В режиме ваншот после испускания всех частиц источник не хочет включаться вообще, и это типа фича.
Аноним 20/04/20 Пнд 05:26:20 #22 №659439 
>>659437
Окей, с прозрачностью понял, в разделе Color надо создать градиентную текстуру. Метод "спроси у анона, тут же сам найдёшь ответ" сработал.
С поворотом частиц и единичным выплёвыванием пока не.
Аноним 20/04/20 Пнд 06:14:58 #23 №659446 
>>659439
Ага, методом научного тыка удалось установить, что за поворот отвечает параметр Flags/Align Y.
Осталось разобраться с порционным выплёвыванием партиклей. Тут я вообще не представляю, куда копать, да и тыком уже не получится.
Аноним 20/04/20 Пнд 09:51:40 #24 №659502 
>>659446
хз, попробуй поставить One Shot и рестартить по таймеру..
Аноним 20/04/20 Пнд 12:13:16 #25 №659525 
>>658384 (OP)
Бамп
Аноним 20/04/20 Пнд 13:11:08 #26 №659548 
Можно ли пропукивать материалы в параллельном потоке?
Вот тут описан хак как пропукивать их при загрузке сцены
https://www.reddit.com/r/godot/comments/e7sf82/godot_background_loading_tutorial/
Но всё равно основной поток при этом висит.
Аноним 20/04/20 Пнд 17:57:04 #27 №659790 
>>659502
У него нет метода "рестартить", есть только свойство вкл/выкл. Ваншот работает так:
1. Включаем
2. Ждём, пока эмиттер поссыт
3. Ждём, пока умрут все партиклы
4. Эмиттер выключаеся сам, ни в коем случае нельзя его торопить
5. Только после этого можно попробовать заново его включить, и он, может быть, включится.
Да и если бы он просто работал так, как задумано, в любом случае, для автоматического оружия не подходит, потому что у него дым от предыдущего выстрела не успевает рассеяться перед следующим.

Пока что я использую костыльное решение без ваншота: просто подгоняю темп испускания частиц под темп стрельбы и выключаю, когда игрок отжимает кнопку или кончаются патроны. Но это не подходит уже для медленного оружия, когда время жизни пороховых газов меньше времени до следующего выстрела.
Аноним 20/04/20 Пнд 18:06:03 #28 №659795 
Как использовать годот с fixed pipeline, без шейдеров?
Аноним 20/04/20 Пнд 18:20:06 #29 №659801 
>>659795
Не очень понял вопрос. Создаешь не Shader Material, а Spatial Material, там всякие цвета и текстуры. Но внутри там шейдеры. Ты имеешь в виду, есть ли специальный рендерер типа как GL1, с glBegin/End? Думаю нет. Примитивы рисования какие-то доступны, конечно. drawLine и т.д.
Аноним 20/04/20 Пнд 18:44:28 #30 №659816 
>>659801
>типа как GL1
типа как GL 3 1
Значит, на старом железе не запустится
Аноним 20/04/20 Пнд 18:55:30 #31 №659818 
>>659816
НУ типа выбрать рендер GLES2, она на GL 2.1 основан
Аноним 20/04/20 Пнд 21:32:13 #32 №659856 
>>659446
> разобраться с порционным выплёвыванием партиклей
E X P L O S I V E N E S S
Аноним 21/04/20 Втр 00:11:39 #33 №659881 
>>659856
Прочитал жопой
@
В З О Р В А Л С Я

Специально для тебя повторю задачу: сделать дульную вспышку, которая будет адекватно отрисовываться при любом темпе стрельбы. Поведение вспышки:
1. Единовременно испускается в момент выстрела
2. Испускается после каждого выстрела, а не после некоторых
3. После испускания некоторое время рассеивается в воздухе
4. Последующие выстрелы и вспышки никак не влияют на поведение уже выпущенной
5. Следующий выстрел может быть произведён раньше, чем рассеется вспышка от предыдущего, это тоже не должно на неё повлиять.
Аноним 21/04/20 Втр 01:07:54 #34 №659883 
>>659881
Мимо проходил, я партиклами не занимался еще, но если такие условия, то я бы просто создал пул например из 5 эмиттеров, и раскидывал на них по очереди.
Аноним 21/04/20 Втр 01:20:41 #35 №659891 
>>659883
Это точно такой же костыль, как те два решения, которые я уже придумал:
1. Поставить ваншотный таймер с маленьким временем. Выстрел - партиклы запустились, таймер включился; таймер протикал и выключил партиклы.
2. Для каждого оружия выставляются свои параметры для партиклы, соответствующие скорострельности данного оружия. Партикла включается с началом стрельбы и выключается с концом.

Но хотелось бы что-то менее костыльное. Наверняка в партиклах есть какая-то подходящая опция, просто её расположение не очень очевидно.
Аноним 21/04/20 Втр 13:44:43 #36 №659998 
Держу в курсе.
2д-персонаж анимирован из кусочков. Наделал ему кучу анимаций: отдельно для ног и туловища, отдельно для рук и головы. Ко всему этому подвязал AnimationTree, нарисовал там сложное дерево с вложенными стейт-машинами. Теперь пытаюсь это всё заставить работать.
Пока что впечатления: дерево анимаций - очень мощная штука. Завтра, видимо, весь день потрачу на то, чтобы привести в порядок взаимодействия с ней.
Аноним 21/04/20 Втр 14:28:05 #37 №660019 
>>659208
>если добавить контроллер игрока (сцену с камерой), и после него еще камеру, то включая current у последней, можно включать/выключать вид "извне" на игрока.
У меня наоборот получалось. Player со своей камерой должен стоять выше остальных сцен с камерами, активной по умолчанию становится первая вошедшая в сцену камера.

>надо ставить только одной current=true
По-моему проще вызывать make_current(), а свойство current использовать только для чтения.
Аноним 21/04/20 Втр 14:47:02 #38 №660026 
>>660019
>Player со своей камерой должен стоять выше остальных сцен с камерами, активной по умолчанию становится первая вошедшая в сцену камера.
Ты прав, но и я тоже прав, ты пишешь про то что если нет ни одной current, то рендерится с первой по списку, а я пишу о том, что если нескольким камерам поставили current, то из них побеждает более поздняя. Проверял в 3.2.1
Аноним 21/04/20 Втр 14:55:38 #39 №660031 
1587470136728.mp4
1587470136729.png
>>659881
Блять, не отвлекай меня от ТВГ! Так не устроит штоле?
Аноним 21/04/20 Втр 15:11:06 #40 №660037 
>>660031
Как - "так"? Ты включил партиклю, и она испускает порции частиц с равным промежутком времени. Как думаешь, игрок будет нажимать стрельбу с равными промежутками времени?
Аноним 21/04/20 Втр 15:27:01 #41 №660039 
>>659891
Я вот не уверен что это костыль. У тебя что, персонаж неподвижен? Если предположим 3д шутер, и во время стрельбы персонаж бежит вперед и поворачивает ствол между выстрелами. Разве это должен быть один эмиттер? С разными тракеториями, исходной точкой, углом? Ну хз может можно как то *текстурой?) передавать в шейдер координаты и углы.
Аноним 21/04/20 Втр 15:45:22 #42 №660042 
>>660037
Включи воображение. На эту партиклю навешиваем ваншот. Дополнительно выставляем частицам глобальные координаты, чтобы дымок оставался в месте выстрела, а не перемещался вместе со стволом. Делаем из неё префаб. Прелоадим его в скрипт оружия. Создаём инстанс при каждом выстреле. Инстанс автоматически срабатывает один раз. Затем он должен удалить сам себя. Можно по таймеру, зная тайминг партикла, можно по сигналу, подбери подходящий.
Но вообще конечно, с таким уровнем тупости ты вряд ли сделаешь игру, если на такой банальной задаче у тебя случился затык на два дня. Без обид, бро, может стоит сменить профессию?
Аноним 21/04/20 Втр 17:01:29 #43 №660053 
>>660026
>если нескольким камерам поставили current, то из них побеждает более поздняя
Скорее всего она не "побеждает", а перезаписывает предыдущую. Т.е. должно быть какое-то свойство типа Viewport.RenderFrom: Camera, в котором лежит ссылка на камеру. У свойства камеры Camera.current вызывается сеттер set_current(), который кроме установки значения true, обращается к вьюпорту и записывает ссылку на эту камеру в соответствующий параметр. Следовательно, не имеет значения, скольким камерам ты сделаешь current = true, поскольку значение имеет ссылка на камеру в текущем вьюпорте. Не будет же вьюпорт бегать по сцене и проверять if Camera.current == true: каждый раз, когда собирается рисовать (т.е. каждый кадр)?

А если не ставить камеру вручную, то вьюпорт идёт по списку вложенных сцен и присваивает своему свойству ссылку на первую попавшуюся камеру; если камеру не найдёт, будет пустота. Как-то так должно быть под капотом устроено...
Аноним 21/04/20 Втр 19:02:52 #44 №660092 
>>660042
>Создаём инстанс при каждом выстреле. Инстанс автоматически срабатывает один раз. Затем он должен удалить сам себя.
Оптимизация стрельбы уровня /gd/? А потом они ненавидят ООП за медлительность...

>>658013 →
>Ставлю на сцену двух инстансов от одной и той же сцены "человечек" (игрок и враг). Игрока вкладываю в ноду Control, которая передаёт сигналы с клавиатуры как команды своему человечку-потомку.
ИМХО, лучше, наверное, наследоваться от общего скрипта. Т.е. есть скрипт human.gd:
class_name Human extends KinematicBody
# тут всё, что нужно для движения человечка

Далее скрипт игрока player.gd:
extends Human
# тут вызываются методы Human в ответ на нажатия клавиш

И скрипт бота bot.gd:
extends Human
# тут вызываются методы Human в соответствии с решениями ИИ

Я так сделал, выглядит вроде логичнее, чем набрасывать отдельный контрол на абстрактного чувака. Хотя, если у тебя какая-нибудь РТС, в которой игрок может попеременно управлять разными юнитами, тогда, похоже, следует именно перекидывать отдельную контролирующую ноду-скрипт (но тогда она сама должна быть потомком, наверное)...

>>658373 →
>видимо ты в этой строчке случайно ее жамкнул
Там хоткей вроде F9, я часто его случайно нажимаю, т.к. в нормальных IDE компиляция забита на F9, а не F5.
Первый раз точно так же недоумевал, почему у меня брекпойнт возник, пока не понял, что на автомате жму F9...
Аноним 21/04/20 Втр 19:18:05 #45 №660095 
1447615514661.jpg
>>660092
>в нормальных IDE компиляция забита на F9, а не F5.
Ты, наверное, шутишь.
Аноним 21/04/20 Втр 19:35:44 #46 №660099 
Безымянный.png
>>660095
Мы просто с разных планет, ничего страшного.
Аноним 21/04/20 Втр 20:36:01 #47 №660112 
>>660042
Чем этот костыль лучше уже придуманных выше костылей >>659891
? Вопрос был про поиск решения встроенными в партиклу средствами (т.е. без других нод и дополнительного кода), а не про обход технических ограничений в виде отсутствия этих средств.

>>660039
>во время стрельбы персонаж бежит вперед и поворачивает ствол между выстрелами. Разве это должен быть один эмиттер? С разными тракеториями, исходной точкой, углом?
Снимаем галку Local Coords и не плодим сущности. Не смотрел, как это работает в 3д, я делаю в 2д, и это работает при любых перемещениях и поворотах ствола.
Аноним 21/04/20 Втр 20:54:09 #48 №660118 
pUeB0iXLER4.jpg
>>660112
>Чем этот костыль лучше уже придуманных выше костылей
Смирись, программирование - это само по себе костыль.
Аноним 21/04/20 Втр 20:56:12 #49 №660120 
g.png
А как примерно в текстуру рендерить содержимое другой камеры?
Вот есть пара кубов и пара камер. Вторая камера смотрит на второй куб, они оба дочерние узлы вьюпорта.
На первом кубе создаю материал, в нем текстуру вьюпорта.. ?
Аноним 21/04/20 Втр 21:26:58 #50 №660137 
>>660118
>Смирись
Я уже выбрал и использовал из костыльных решений наименее ресурсоёмкое: индивидуальные параметры для каждого оружия. И давно уже разрабатываю дальше. Вопрос был на тот случай, если не костыльное решение вообще существует, и его кто-то знает.
Аноним 21/04/20 Втр 22:17:13 #51 №660197 
>>660120
Ну да. Как-то так. Там засада в том, что нужно вручную выставить размеры вьюпорта. Иначе размеры будут 0 на 0 и чорная текстура.
Аноним 21/04/20 Втр 22:18:22 #52 №660198 
>>660099
Братиш, на твоей планете не осталось никого, вали оттудова.
Аноним 21/04/20 Втр 22:53:27 #53 №660233 
>>660197
размеры поставил, но все равно ничего никуда не выводит
Аноним 21/04/20 Втр 23:19:43 #54 №660276 
1587500353585.mp4
>>660233
Загрузи пример 2d in 3d из библиотеки и посмотри, как там.
Аноним 21/04/20 Втр 23:33:39 #55 №660291 
1587501190039.mp4
Залез в старые видосы. Такая ностальгия. Трёшка - уже история.
Аноним 22/04/20 Срд 07:47:45 #56 №660571 
g.png
>>660276
не, те примеры слишком громоздкие и непонятные, что этот что с понгом
без них проще было разобраться)
Аноним 22/04/20 Срд 08:52:08 #57 №660577 
AnimationTree оказалось гораздо легче, чем можно было предположить. Управление осуществляется буквально одной строчкой кода. Нужно потратить некоторое время на расстановку дерева, конечно, зато дальше оно работает само без каких-либо дополнительных плясок. Интерфейс прост в освоении и интуитивен. Немножко неожиданно ведёт себя только субнода Transition, которая на первый взгляд не делает вообще ничего, но на самом деле у неё просто проблемы с отрисовкой, её нужно дополнительно пнуть, чтобы она отрисовалась после изменений.
В общем, моё монструозное дерево из if'ов пошло под нож, вместо него теперь короткие обращения к дереву анимации. Я прям доволен. Пойду интерфейс пилить теперь.
Аноним 22/04/20 Срд 11:18:07 #58 №660649 
>>660577
скинь пример как это теперь выглядит, можно еще в сравнении как было
Аноним 22/04/20 Срд 12:24:45 #59 №660749 
1587547484065.png
1587547484185.png
>>660649
Я не он, но вот моё дерево и вот моя стейтмашина.
Как видишь, дерево еле влезло на один экран, хотя там я заморочился со скоростью анимаций, без них на 4 ноды меньше было бы. В стейтмашине тоже можно заморочиться со скоростью, но щас я клепаю проект на ТВГ и там уже не до таких красивостей.
В общем, постигнув суть стейтмашин, я как-то отошёл от дерева. У него какие-то свои специфичные задачи. Стейтмашиной всё то же самое делается быстрее и компактнее.
Аноним 22/04/20 Срд 12:45:01 #60 №660760 
1587548699702.png
1587548699784.png
1587548699819.png
1587548699841.png
>>660749
Вот как это делается:
В корневую стейтмашину вместо блендспейсов добавляешь бленддеревья, внутри котоых блендспейс и таймскейл. Получается дополнительный уровень вложенности, не критичный для кода. Всё равно пути один раз прописываешь в сеттере.
И всё, получается, легко и просто контролируешь скорость анимаций. Третья пикча показывает сравнение в инспекторе старого walk0, которое просто блендспейс и нового walk, которое теперь поддерево.
Ну и приблизительный код сеттера для нового дерева.
Аноним 22/04/20 Срд 15:15:06 #61 №660863 
Че-то я опять туплю: как сделать в годо, чтобы все дальнейший действия проводились с указанным объектом? чтобы не писать каждый раз:
$'object'.a=$'object'.hz_func()
$'object'.do_something('object'.a)
Аноним 22/04/20 Срд 16:53:14 #62 №660906 
>>660863
onready var TButton1 := $Form/Button1
Аноним 22/04/20 Срд 17:00:25 #63 №660914 
>>660906
Ты мне сейчас предлагаешь просто запихнуть $'object' в переменную some_object? Если да, то это абсолютно не то. Во многих языках существуют конструкции для доступа к разным областям видимости, и меня интересует, есть ли подобное в годо?
Аноним 22/04/20 Срд 17:01:54 #64 №660916 
>>660914
так он тебе и предлагает получить ссылку на объект один раз и работать уже по ее адресу, а не каждый раз заново ее получать
Аноним 22/04/20 Срд 17:02:25 #65 №660918 
>>660916
Ясно, значит не совсем понял, сорь.
Аноним 22/04/20 Срд 17:34:14 #66 №660934 
пример.png
>>660916
>так он тебе и предлагает получить ссылку на объект один раз и работать уже по ее адресу, а не каждый раз заново ее получать
Нет, он хочет вот такое (я тоже это очень хочу): <картинка>
Аноним 22/04/20 Срд 18:26:40 #67 №660945 
>>660934
Что? К годоте можно прикрутить паскаль?
Аноним 22/04/20 Срд 19:14:16 #68 №660959 
>>660934
>Нет, он хочет вот такое
Да, так и есть. Ты правильно меня понял.
Я просто че-то по объяснениям другого (>>660916) анона подумал, что тут (>>660906) через ссылку и можно перейти в другую область видимости надолго. Смутили " := ", "$" без кавычек, итд. Думал, я чего-то не знаю о синтаксисе.
Аноним 22/04/20 Срд 19:15:49 #69 №660960 
>>660959
>Думал, я чего-то не знаю о синтаксисе.
Хотя, по факту, я дохера чего о нем пока не знаю.
Аноним 22/04/20 Срд 19:35:53 #70 №660965 
присваивание.png
сокращения.png
>>660945
>Что? К годоте можно прикрутить паскаль?
То был пример конструкции with <something> do ... на полноценном ЯП.
А так - вроде бы да, можно прикрутить с помощью GDNative, но я пока не пробовал.

>>660959
>Смутили " := "
Первая картинка. Это позволяет пропустить указание типа, определив тип по присваиваемому значению.
>"$" без кавычек
Вторая картинка. Кавычки писать не нужно, сам $-синтаксис всего лишь сокращает запись get_node("").
Источник - https://docs.godotengine.org/en/stable/getting_started/scripting/gdscript/gdscript_basics.html

В принципе, писать так:
onready var button := $form/panel/button
button.text = "text"
Проще (и, возможно, оптимальнее), чем так:
$form/panel/button.text = "text"
Но в ряде случаев хотелось бы иметь with-сокращения как в Паскале (и других языках).
Аноним 22/04/20 Срд 19:40:33 #71 №660967 
>>660965
>В принципе, писать так:
>onready var button := $form/panel/button
>button.text = "text"
>Проще (и, возможно, оптимальнее), чем так:
>$form/panel/button.text = "text"

Ой, все.

>Но в ряде случаев хотелось бы иметь with-сокращения как в Паскале (и других языках).

Я вообще хз, почему этого нет в годо. Это же гиперудобная вещь, и, если ее нет, то могли бы хоть добавить заменитель идентичный натуральному.
Аноним 22/04/20 Срд 19:41:46 #72 №660968 
>>660967
не нужно
https://github.com/godotengine/godot/issues/1736
Аноним 22/04/20 Срд 19:58:56 #73 №660977 
>>660967
>Я вообще хз, почему этого нет в годо. Это же гиперудобная вещь
Согласен.
>могли бы хоть добавить заменитель идентичный натуральному.
Решили не добавлять, потому что:
>>660968
>https://github.com/godotengine/godot/issues/1736
>I don't think we'll implement any with statement in GDScript, as it is used in different languages for different things...
(лолшто)
>If you need with for a long block of code, it's a hint that this code should likely be placed in the script of that node, and replaced by a single function call in the parent node.
--> "сокращайте код ручками, лалки".

То есть если у меня класс в классе в классе, я должен ручками делать дополнительный метод в главном классе, который упрощает доступ к классу в классе в классе, чтобы сделать несколько таких обращений подряд? Понятное дело, что лучше так не делать, но а что если у меня длинные имена главного класса и длинные имена методов?
Всяко проще было бы сделать:
with EntityWhatDoesSomethingCool do
param1 = param2 # синхронизация внутренних параметров
Чем делать:
EntityWhatDoesSomethingCool.param1 = EntityWhatDoesSomethingCool.param2
Да даже если эта операция пишется в функции:
func sync_params_of_cool_slave_entity():
EntityWhatDoesSomethingCool.param1 = EntityWhatDoesSomethingCool.param2
Всё равно это выглядит отвратительно по сравнению с with.

Впрочем, ладно. Всегда можно прикрутить Паскаль отдельной DLL-кой...
Аноним 22/04/20 Срд 20:09:20 #74 №660979 
>>660977
Я думаю, Хуан просто не хочет ебать себе мозг с проблемами пространств имён, которые неизбежно возникнут с with при таком-то наследовании.
Аноним 22/04/20 Срд 20:11:15 #75 №660981 
>>660979
В результате проблемами пространств имен ебу себе мозг я
Аноним 22/04/20 Срд 20:15:28 #76 №660984 
>>660979
Если ты про такое:
with Player, Enemy do
Position = Position
Достаточно вывести ошибку парсинга:
[error] Position of wich class do you call?
Однако если у классов есть разные поля, то проблемы нет:
with Player, Enemy do
Target = Inventory.Position
Enemy имеет цель преследования Target, Player несёт в себе рюкзак-инвентарь на спине.
Ну, это абстрактный пример, трудно с ходу выдумать что-то реально полезное...
Аноним 22/04/20 Срд 20:19:07 #77 №660987 
>>660965
> with <something> do … на полноценном ЯП.
Но... на полноценном языке, то есть на си и его потомках нет такой функции. А паскаль для школьников не полноценный язык. Даже автор паскаля от него отказался и перешёл на си-шарп.
Аноним 22/04/20 Срд 20:28:08 #78 №660989 
>>660984
Это абстрактный пример, но он прекрасно иллюстрирует, почему в настоящем языке (Си, повторюсь) от этой конструкции отказались. Срачом на эту тему форумы забиты с 90х годов, не вижу смысла пересказывать, иди гугли сам, раз вышел из криостаза только в этом году.
Хочешь сокращать? Пожалуйста:
var p = $my/long/player/node/path
var e = $my/long/enemy/node/path
var i = $my/long/player/node/path/inventory
e.position = p.position
e.target = i.position
Так делают сишники, настоящие программисты на настоящем языке программирования, а не на учебном.
Аноним 22/04/20 Срд 20:39:03 #79 №660995 
>>660989
>однобуквенные переменные повсюду
>Так делают сишники
Теперь понятно, почему код на C-подобных языках настолько уродлив.

Чтобы не разводить срач, GDScript предназначен для школьников/студентов/дизайнеров, если хочешь обмазываться своим C++ - пиши на C++, никто тебе не мешает, а GDScript нужен для быстрого прототипирования без особых познаний в программировании и всего такого, и я не вижу смысла пилить неудобные однобуквенные костыли там, где можно было бы воспользоваться мощным оператором удобного языка. Между прочим, C++ - это и есть мусорка из "мощных операторов", с каждым годом количество операторов удваивается, каждая задача одинаково решаема десятком разных операторов. Так что не сравнивай.

Алсо, по-моему у тебя бомбануло, потому что в твоём языке with нет, а в моём - есть.
Аноним 22/04/20 Срд 20:53:55 #80 №661000 
>>660995
про плюсы согласен, что развиваются куда-то не туда
про gdscript, как раз для прототипирования геймдизами или художниками он тоже плох, постоянно плюются, особенно с значащими отступами
мимо другой анон
Аноним 22/04/20 Срд 21:14:46 #81 №661005 
>>660995
> по-моему у тебя бомбануло
Ага, у меня бомбит от того, что 99% софта написано на си/си++. Конечно. А у тебя НЕБОМБИТ! Твёрдо и чотко!
Аноним 22/04/20 Срд 21:39:30 #82 №661009 
>>660977
>лолшто
Там потом 100500 примеров из разных языков и действительно везде свои нюансы.
Аноним 22/04/20 Срд 21:45:07 #83 №661010 
>>660995
В однобуквенных переменных нет ничего плохого, когда речь идет об алгоритмах и математике, а код на С-подобных языках благодаря им выглядить компактно и аккуратно.
Прописывать полностью каждый раз имя, иерархию и тип приходится только на всяких маргинальных языках без типизации и нормальной поддержки IDE.
В самом деле, если идет в цикле работа с врагами, его логичнее называть e., чем каждый раз enemy., а че сразу не писать enemy_from_array_of_active_enemies. ?
Аноним 22/04/20 Срд 21:55:33 #84 №661012 
>>661005
>Ага, у меня бомбит от того, что 99% софта написано на си/си++. Конечно. А у тебя НЕБОМБИТ! Твёрдо и чотко!
Причина бомбления очевидна: ты юзаешь ЯП только из-за его популярности, а я юзаю ЯП, который мне по нраву.

>>661000
>геймдизами или художниками он тоже плох, постоянно плюются, особенно с значащими отступами
Ну фиг знает, значащие отступы приучают человека писать хорошо читаемый визуально код.
Скажем так, конструкция
if (something) {
action1;
action2;
} else {
action3;
action4;
}
читается намного хуже, чем
if (something) {
_ action1;
_ action2;
} else {
_ action3;
_ action4;
}
А уж без программных скобок вообще не было бы ясно, что к чему относится.
Поэтому синтаксис GDScript в целом лучше для восприятия, чем у классических ЯП.

>>661009
>Там потом 100500 примеров из разных языков и действительно везде свои нюансы.
Какое отношение 100500 примеров других языков имеют к GDScript? Я об этом.

>>661010
>В однобуквенных переменных нет ничего плохого, когда речь идет об алгоритмах и математике
Только если это абстрактный алгоритм для обработки чего-либо абстрактного, как в математике.
>код на С-подобных языках благодаря им выглядить компактно и аккуратно
Ты дважды ошибся, пытаясь написать "нечитабельно". Сишники и функции 2-3 буквами обзывают.
>Прописывать полностью каждый раз имя, иерархию и тип приходится только на всяких маргинальных языках без типизации и нормальной поддержки IDE.
Это когда речь идёт о написании кода. Каким образом IDE может помочь тебе в чтении написанного?
>В самом деле, если идет в цикле работа с врагами, его логичнее называть e., чем каждый раз enemy., а че сразу не писать enemy_from_array_of_active_enemies. ?
В цикле ещё ладно, но только если этот цикл занимает одну строчку, а не несколько экранов.
А так, "e" может быть и entity, и element, и ещё куча всякого. Написав строчку вида
for e in get_children():
уже на следующей строке можно забыть о том, что e - это enemy, а не какая-то там entity.
А уж что говорить о том, когда ты вернёшься к этой e через недельку/месяц/год... Особенно, если это не твоя e.
Аноним 22/04/20 Срд 22:07:16 #85 №661018 
>>661012
> отступы приучают человека писать хорошо читаемый визуально код.
Вот только это делается в IDE автоформатированием, а значащие отступы - это мина замедленного действия.
Аноним 22/04/20 Срд 22:26:42 #86 №661023 
>>661018
>мина замедленного действия
Согласен, если ты часто делаешь случайные нажатия на клавиатуре или рандомно правишь код в Блокноте.
Я бы предпочёл обязательные отступы + программные скобки begin..end, но хомячки не обрадуются писать лишние символы.
Аноним 22/04/20 Срд 23:03:26 #87 №661028 
>>661023
>Я бы предпочёл обязательные отступы + программные скобки begin..end, но хомячки не обрадуются писать лишние символы.
Люто двачаю.
Вторая проблема этих отступов - нельзя просто так взять и обрамить готовый кусок кода дополнительным if'ом, например. Скажем, проверкой на состояние здоровья. Да, в годоте можно выделить текст и нажать tab; но это костыль. Плюс табуляции занимают много места на экране, я бы предпочёл пробелы.
И ещё очень печалит отсутствие комментариев вида / .. / - чтобы быстро закомментировать и раскомментировать блоки кода.

>значащие отступы приучают человека
Воспитанием должны заниматься родители. Ну, или хотя бы учителя. Когда взрослый человек берётся самостоятельно заниматься чем-то, предполагается, что он уже приучен ко всяким таким вещам, типа не гадить под себя.
Аноним 22/04/20 Срд 23:24:28 #88 №661032 
>>661023
Да даже не случайные. Можно сказать что вообще все ошибки совершаются случайно )
Я тоже предпочитаю обязательные отступы + скобки, сишные компиляторы выдают предупреждение (а при флаге warning as errors - ошибку) на плохое форматирование, в случаях типа
if(c)
 foo();
 bar();
Но при этом я не хочу чтобы пробелы были значащими символами.
Аноним 23/04/20 Чтв 00:02:34 #89 №661039 
табы и пробелы.png
>>661028
>нельзя просто так взять и обрамить готовый кусок кода дополнительным if'ом, например
>Да, в годоте можно выделить текст и нажать tab; но это костыль
Я обычно код пишу в PS Pad, тут для отступов есть ctrl+shift+I (вправо) и ctrl+shift+U (влево), мне удобно. Да и в любом другом редакторе, заточенном под кодинг, скорее всего будут аналогичные "костыли". Ты ж всё равно будешь вынужден отступы добавлять, даже если они чисто декоративные, если только пишешь не на Форте в одну строчку. Да, есть автоформатирование, но это точно такой же костыль, придуманный для того, чтобы облегчать работу над стилем кода, тогда как стиль кода сам по себе костыль, призванный облегчить чтение кода... >>660118

>Плюс табуляции занимают много места на экране, я бы предпочёл пробелы.
Это всё настраивается (картинка). Ширина табов, кстати, настраивается во многих текстовых редакторах.

>чтобы быстро закомментировать и раскомментировать блоки кода.
Есть функция IDE для этого (шорткат ctrl+k вроде бы), но да, это тоже костыль получается)

>Воспитанием должны заниматься родители. Ну, или хотя бы учителя
Родители-программисты и учителя информатики? Возможно, но не всем так повезло.

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

Поэтому, имхо, транслятор кода, понятно объясняющий/комментирующий большинство очевидных ошибок, всегда лучше транслятора, который съедает любой валидный код, никак не помогая найти ошибки, связанные с неопытностью пишущего этот код. Пусть лучше транслятор приучает, чем вообще никто.
Аноним 23/04/20 Чтв 01:13:24 #90 №661071 
>>661039
>Когда только учишься программировать, не понимаешь многих вещей
Для обучения существуют учебники, гайды и мануалы. Язык - это инструмент для выполнения работы, а не обучения. Автомобиль тебя ведь не учит ПДД и не учит манерам поведения на дороге, он просто едет туда, куда ты его ведёшь; ведёшь неправильно - твои проблемы. Представь, что автомобиль отказывается поворачивать колёса, если выключен поворотник; по учебной площадке на таком автомобиле ездить можно, однако в город на нём лучше не соваться.
Язык не должен ничего тебе объяснять, он должен просто работать. Не понимаешь - пиздуй в поиск. Особенно когда только учишься.

Хотя да, наверное, я сужу с позиции человека, который умеет учиться. Многие не умеют и всячески сопротивляются.
Аноним 23/04/20 Чтв 01:39:59 #91 №661089 
https://godotengine.org/article/godot-getting-more-languages
>Re-create Godot's basic types in your new language: These are types such as Vector3, int, float, String, etc. Many of these are usually provided already.
Фрипаскаль пасасал с нативными векторами. В math есть какое-то говно из 70х, не имеющее 90% функционала. То есть, либо велосипедить, либо брать из имеющихся готовых модулей для фрипаскаля.
>Create a module: A C++ module that creates binding code needs to be done (creating modules in C++ is well documented). The entire exposed Godot API can be accessed via the static functions in ObjectTypeDB.
Какой язык ни пытайся добавить в годо - знание си обязательно.
>Generate binding code in your new language that accesses the exposed functions in the MethodBind class (there is one for each exposed method).
Титанический, монотонный труд, который Хуаном для си автоматизирован (есть готовые заголовки) - остальные ебитес как хотите.
>Create a ScriptLanguage class and supply the neccesary methods exposed for debugging, profiling, etc. You can supply symbols, code completion helpers, etc. if this language is meant to be edited inside Godot.
Основной титанический труд по добавлению связки фрипаскаля с редактором. Если предполагается кодить в лазаре - этот пункт можно пропустить.
Аноним 23/04/20 Чтв 02:29:31 #92 №661103 
Чёт я не очень понимаю с интерфейсом. Разве зелёные ноды не должны перемещаться вместе с камерой? Ни в одном туториале нет перемещающейся камеры, но из контекста вроде следует, что должны; да и для чего тогда они вообще нужны. А у меня почему-то они намертво прилеплены к картинке уровня. Хотя иерархия нод такая:
-Игра
--Интерфейс
--Уровень
Читаю оф. мануалы и не могу вкурить, нигде про это ничего не говорится.
Аноним 23/04/20 Чтв 02:35:22 #93 №661104 
>>661089
> >Generate binding code in your new language that accesses the exposed functions in the MethodBind class (there is one for each exposed method).
> Титанический, монотонный труд, который Хуаном для си автоматизирован (есть готовые заголовки) - остальные ебитес как хотите.
Что мешает регекспом конвертнуть? Или по api.json сгенерировать. Или по файлу который для моно генерится.
Аноним 23/04/20 Чтв 05:36:46 #94 №661109 
move1.png
move2.png
script.png
>>661103
> Разве зелёные ноды не должны перемещаться вместе с камерой
Не совсем так, но для простоты - да.
Например, делаем как на картинке:
UI - это все твое дерево интерфейса. Можно сделать в виде узла control, в которое засунешь весь необходимый интерфейс данного состояния игры.
player - это просто камера, на которую навешен простейший скрипт движения на кнопки влево/вправо (без дублирования на кнопки AD), скрипт на третьем пике
Есть твоя загружаемая сцена уровня, которую меняешь. Сейчас это просто Меш кубика, который окрашен.
Запускаем - нажимаем кнопки, камера перемещается в пространстве, UI "вместе с ней", сцена на месте (первые две картинки)
Аноним 23/04/20 Чтв 06:17:49 #95 №661111 
>>661109
Забыл сказать, что речь идёт про 2D.
Проблема была в том, что камера масштабирует всю сцену вместе с интерфейсом (HUDом). И перемещается по всей сцене и по интерфейсу. Если интерфейс сделать потомком камеры, он будет перемещаться вместе с игроком (потому что камера - потомок игрока), но не с камерой (потому что у камеры есть всякие плюшки типа смуфинга и драг маргинов).
Решение нашлось. Нигде (НИГДЕ) об этом прямым текстом не говорится. Все туториалы рассматривают либо перемещаемую камеру без интерфейса, либо интерфейс в неподвижной сцене. Итак, решение: интерфейс надо делать потомком CanvasLayer'а. Тогда он адекватно масштабируется и размещается в правильном месте. При этом сам канваслой у меня никак не связан ни с персонажем, ни с уровнем.
Такие дела. Всю ночь тыкался в поисках ответа, только под утро наконец нашёл.
Аноним 23/04/20 Чтв 06:43:13 #96 №661112 
move1.png
move2.png
script.png
camera2d.png
>>661111
Ну да, для 2D можно сделать также почти как с 3D, с некоторыми отличиями: например, да, засунуть UI в отдельный CanvasLayer, также поставить самой камере галку в поле current, что она будет текущей камерой.
Аноним 23/04/20 Чтв 06:54:03 #97 №661115 
>>661112
Ты пьян, иди домой
Аноним 23/04/20 Чтв 07:01:42 #98 №661116 
>>661115
Ок, ушел
Аноним 23/04/20 Чтв 10:03:20 #99 №661129 
r87837gf.png
>>658384 (OP)
Показалось
Аноним 23/04/20 Чтв 11:07:34 #100 №661142 
>>661129
Это же шапочник-летун!
Аноним 23/04/20 Чтв 14:02:20 #101 №661213 
>>661071
>Для обучения существуют учебники, гайды и мануалы
Некоторые вещи можно понять только на практике. Кратковременная память человека очень ограничена.
>Автомобиль ... просто едет туда, куда ты его ведёшь
Автомобиль не взлетает в воздух, когда ты нечаянно дёргаешь руль на себя, и не трансформируется внезапно в самолёт, когда в бак заливается керосин вместо бензина. У реального автомобиля есть жёсткие ограничения - хотя бы тот же ограниченный поворот руля, не позволяющий вертеть его бесконечно долго - тогда как типичный транслятор позволяет совершать намного более жуткие вещи, чем банальный и предсказуемый наезд на пешехода. Транслятор как волшебная палочка, может сделать что угодно, в том числе совсем не то, что ты от него ожидал, особенно если инструкция частично утрачена (не написана).
>Представь, что автомобиль отказывается поворачивать колёса, если выключен поворотник
Умный автомобиль будет включать поворотник при повороте руля. Хотя я не знаю тонкостей ПДД, может, так нельзя...
>Язык не должен ничего тебе объяснять, он должен просто работать
Дарю тебе сведения о языке программирования Forth. Он просто работает. Всё, что он умеет - это выполнять инструкции, которые ты ему даёшь. Если инструкция выполнилась, он пишет ok. Если stack overflow или underflow, он пишет соответствующее сообщение. Если он не нашёл в словаре твоё слово, он пишет, что слово not found. Ещё может писать division by zero, допустим. Всё остальное зависит исключительно от тебя, и если ты что-нибудь нечаянно сломаешь - а ты обязательно что-нибудь сломаешь - всё рухнет и последствия придётся разгребать именно тебе, в одиночку. То есть ты можешь сделать на Forth всё, что можешь себе вообразить, и никаких встроенных проверок на безопасность и корректность кода тут нет и быть не может; код на Forth - это просто слова, разделённые пробелами, как этот текст (он может быть корректной программой на Forth/Forth-подобном языке). Много людей программирует на Forth? А вот нифига. Потому что все любят, когда кто-нибудь указывает на их ошибки, а не взрывается столпом искр и останавливается до тех пор, пока код не будет изменён на что-нибудь другое. А вот Ada - почему Ada сокращает время отладки на 80%? Потому что она заранее предотвращает твои ошибки, и тебе труднее выстрелить себе в ногу. Язык не должен слепо выполнять твои команды, если это не низкоуровневый язык типа Ассемблера, язык должен упрощать твою работу.

>>661089
>Фрипаскаль пасасал с нативными векторами
В чём проблема написать самому? TVector2, TVector3. Можно в точности повторить функционал из GDScript.
>Какой язык ни пытайся добавить в годо - знание си обязательно.
Что-то я не понял, биндинг ведь через DLL идёт, не?.. Ааа, понял, это DLL-ку нужно биндить к Godot, а не Godot к DLL-ке. Лол. Ну ладно, Си - это как Паскаль, только со {скобочками}. Не даром же Паскаль создавался для обучения программированию на Си. В крайнем случае можно скопипастить...
>Титанический, монотонный труд
ctrl+c/ctrl+v в основном? В остальном только заголовки функций поправить и типы в аргументах?
>титанический труд
Ты меня будто на слабо вызываешь. Но, если честно, не так уж мне хочется делать игры...

>>661109 >>661112
Почему такая разница между 3D/2D? Я думал, логика построения сцены должна быть одинаковой. Что делает CanvasLayer?
Аноним 23/04/20 Чтв 21:21:43 #102 №661419 
Антоны, а как наиболее просто, без кода-пустышки, объявить трехмерный массив? Чтоб не куча уебанских циклов с присвоением нулей, а типа такого:

var a=[][][]
a[1][2][3]='Збс!'
print(a[1][2][3])
Аноним 24/04/20 Птн 00:43:04 #103 №661524 
>>661419
По-моему никак. Ну сделай себе функцию, которая инициализирует, var a=ArrayInit3Dim()
Аноним 24/04/20 Птн 01:00:15 #104 №661534 
>>661419
>трехмерный массив
Лучше забудь о больших массивах в GDScript. Эта такая неповоротливая хрень, что пожалеешь, когда начнёшь активно работать с ними. Они ведь целиком на variant'ах, от массива тут только название...
Аноним 24/04/20 Птн 01:20:26 #105 №661540 
>>661534
Эмм... то есть там какие-то проблемы с производительностью? Я просо не шарю от слова совсем
Аноним 24/04/20 Птн 02:23:52 #106 №661561 
>>661540
Да. В нормальном, строго типизированном ЯП ты мог бы создать массив элементов одного типа, они все размещались бы в памяти последовательно (массив же), и при проходе подряд обрабатывались бы быстро (такой массив вроде должен автоматом подгружаться в кэш процессора). В GDScript обычный массив[] содержит нетипизированные элементы, т.е. "variant", которые могут принимать любое значение. Делается это в ущерб производительности, т.к. для чтения/перезаписи каждой такой переменной тратится время ЦП на проверку или перезапись метки типа (не считая того, что на эту метку тратится память); кроме того, ещё не факт, что они располагаются последовательно, данные могут разбрасываться по памяти (ЦП не сможет подгрузить в кэш). Чтобы обойти этот недостаток, существуют классы с именами Pool<N>Array, где <N> - название типа (например, Int); это одномерные типизированные массивы, оптимизированные по использованию памяти, но вкладывать друг в друга их уже не получится.

Так что если ты собираешься держать в трёхмерном массиве огромный массив информации, который будет часто обновляться, лучше подумать о написании модуля на C++. Впрочем, не знаю, насколько серьёзные просадки будут на практике, сам тестов не проводил, читал только (когда искал типизированные массивы). Если часто обновлять не планируешь, то, возможно, сойдёт и так, просто помни, что по сути будешь палить из пушки (variant'ы) по воробьям (int'ы какие-нибудь).

Да, кстати, для воксельных игр а-ля Майнкрафт как раз-таки пишут модули на C++, GDScript слишком слоупок для этого.
Аноним 24/04/20 Птн 05:51:30 #107 №661600 
В чем разница между?
_input(event)
_unhandled_input(event)
Ivent
Когда и что надо использовать?
Аноним 24/04/20 Птн 08:14:47 #108 №661609 
>>661213
>Почему такая разница между 3D/2D? Я думал, логика построения сцены должна быть одинаковой. Что делает CanvasLayer?
Эту магию пока не дано мне постичь. Но из побочных эффектов - сбилось глобальное позиционирование, и теперь пули вылетают не из ствола (они рождались по глобальным координатам Position2D, дочерней от оружия), а откуда попало. Другие объекты со своих мест не уехали, и координаты мыши правильно определяются; и вообще, вся сцена с персонажем и оружием находится не в той ветке, в которой интерфейс и канвас. ЧХ выхлопы от генератора частиц, который тоже привязан к стволу, позиционируются правильно.
Аноним 24/04/20 Птн 09:10:21 #109 №661615 
>>661561
Че-то у годо слишком уж много таких подводных. Еще вопрос тогода знающим: все-таки что лучше для сравнительно крупных 2д проектов, гей мейкер студио 2 десктоп, или годо? Я знаю, что сорта, но все-же
Аноним 24/04/20 Птн 09:14:28 #110 №661616 
>>661561
>Pool<N>Array, где <N> - название типа (например, Int)

Еще момент - такой фокус, я так понял, проворачивается только со встроенными типами? Массив классов так не запилишь (В котором будет свой массив классов, итд, лол)?
Аноним 24/04/20 Птн 10:33:06 #111 №661630 
Как настроить свои шары, чтобы они не летали сквозь стены?
Аноним 24/04/20 Птн 11:02:47 #112 №661651 
>>661615
Не обращай внимания на поехавшего, он нахватался знаний по верхам и выпендривается сложными словами, в программировании есть принцип предварительная оптимизация зло, все зависит от конкретного случая и нужно тестировать, я один раз тестировал производительность тайлмапов в годоте и замена гдскрипта на плюсы дала прирост порядка 5%, а не 500% как должна была бы, а все потому что система упиралась в скорость вывода графики. Если у тебя какой то простой случай то все спокойно будет работать с 3д массивами, но конечно игру на микровокселях в 1см не сделать
Аноним 24/04/20 Птн 12:38:52 #113 №661715 
>>661630
>Как настроить свои шары, чтобы они не летали сквозь стены?
У тебя KinematicBody проваливается сквозь RigidBody? Если так, поставь infinite_inertia = false у move_and_slide().
https://docs.godotengine.org/en/3.1/classes/class_kinematicbody2d.html#class-kinematicbody2d-method-move-and-slide
Если у тебя пролетают очень быстро движущие объекты через тонкие статичные стенки, я полагаю, нужно либо делать стенки физически толще, либо тестировать смещение на более короткую дистанцию, прежде чем "прыгать" далеко.

>>661615
>лучше для сравнительно крупных 2д проектов
Godot лучше, к тому же Godot универсальнее, его предпочтительнее изучать.
Но ещё зависит от того, что ты называешь "крупным". Terraria-like ни Godot, ни GM "из коробки" не потянут, нужны специфичные для таких игр оптимизации, которые трудно прикрутить к универсальному движку/конструктору.

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

>>661651
>есть принцип предварительная оптимизация зло
Я всего лишь предупредил, где могут возникнуть подводные камни, если он замутит какой-нибудь 3D массив 1000x1000x1000 и внезапно обнаружит, что всё стало в разы медленнее (или вообще падает).
>все зависит от конкретного случая и нужно тестировать
И я о том же, но он не сказал конкретики, так что я обрисовал худший сценарий. А то сейчас понасоздают тут массивов в массивах в массивах, а потом будут говорить "чёт Годо медленный, чёт Годо лагает".
Аноним 24/04/20 Птн 12:48:26 #114 №661722 
>>661715
>Если у тебя пролетают очень быстро движущие объекты через тонкие статичные стенки, я полагаю, нужно либо делать стенки физически толще, либо тестировать смещение на более короткую дистанцию, прежде чем "прыгать" далеко.

Да, вот этот вот вариант. Про тест мув знаю, но не хотел писать доп код. Ну ок, раз по другому низя.

>Но ещё зависит от того, что ты называешь "крупным". Terraria-like ни Godot, ни GM "из коробки" не потянут

А единство?

>1000x1000x1000 и внезапно обнаружит, что всё стало в разы медленнее (или вообще падает).

Это же вроде не супербольшой массив, не? Если я не буду каждый фрейм его сортировать, то не должно же вроде быть проседаний фпс? Обращение к элементам по индексам наверное уж не должно так жрать ресурсы?
Аноним 24/04/20 Птн 13:04:22 #115 №661724 
Еще вопрос: как наиболее просто и незамороченно передать в строку содержимое переменной-класса

class container
( )var a=1
( )var b=4

var tmp=container.New()
s=str(tmp)

Типа такого, но чтобы передало значения a и b, а не реф
Аноним 24/04/20 Птн 13:05:19 #116 №661725 
>>661615
Ты бы лучше с проектом точнее определился, тогда уже можно под него инструменты советовать.
Аноним 24/04/20 Птн 13:07:10 #117 №661727 
>>661725
Я просто учусь, пока что. Но надо же знать, на что рассчитывать.

>>661724
Тут, конечно, для двух переменных все очень просто, но у меня их сильно больше, чем две, в каждом классе.
Аноним 24/04/20 Птн 13:12:16 #118 №661729 
>>661722
>Да, вот этот вот вариант. Про тест мув знаю, но не хотел писать доп код. Ну ок, раз по другому низя.
Покажи, какой код и при каких условиях у тебя пролетает. А то гадаем на кофейной гуще.

>А единство?
Ты про что?

>Это же вроде не супербольшой массив, не?
Миллиард указателей, разбросанных по памяти, и указывающих на миллиард разбросанных по памяти классов? Даже если бы это был просто миллиард 32-битных Int, такой массив занял бы почти 4 ГБ оперативной памяти. А безтиповые переменные занимают по идее намного больше места, чем 32-битный Int, плюс каждый класс будет добавлять вес.

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

Воксельные игры вообще-то используют чанки, это, по сути, 5(6)-х мерный массив, два измерения индексируют чанки, а остальные три индексируют малое пространство внутри чанка (16x16x128, допустим). Но даже так, для нормальной игры потребуется ещё куча всяких костылей-оптимизаций, в лоб это не решается.
Аноним 24/04/20 Птн 13:18:40 #119 №661731 
>>661729
>Ты про что?
Unity

>Покажи, какой код и при каких условиях у тебя пролетает. А то гадаем на кофейной гуще.
Да я ж как раз не про код. Как в коде сделать я и сам знаю. Думал настройка есть под это, какая-нибудь, для более точного рассчета столкновений

>Воксельные игры вообще-то используют чанки, это, по сути, 5(6)-х мерный массив, два измерения индексируют чанки, а остальные три индексируют малое пространство внутри чанка (16x16x128, допустим). Но даже так, для нормальной игры потребуется ещё куча всяких костылей-оптимизаций, в лоб это не решается.
У меня как-раз подобная структура намечается, но немного для других целей
Аноним 24/04/20 Птн 13:18:48 #120 №661732 
>>661727
>Я просто учусь, пока что. Но надо же знать, на что рассчитывать.
Попробуй придумать что-нибудь и потом реализовать это своими руками. Если не получится - ищи другую идею, если получится - уже будет опыт для новых идей. А так ты сейчас обучишься инструменту, а идей как не было, так и не возникнет. Личный опыт...

>>661724
>Еще вопрос: как наиболее просто и незамороченно передать в строку содержимое переменной-класса
>Тут, конечно, для двух переменных все очень просто, но у меня их сильно больше, чем две, в каждом классе.
По идее, каждый класс должен сам формировать такую строку, если тебе очень надо:
func to_string():
return бла-бла-бла
Универсальных инструментов под это вроде как нет, это вообще весьма странная задача, если подумать. Зачем тебе?
Аноним 24/04/20 Птн 13:20:20 #121 №661733 
>>661732
>это вообще весьма странная задача, если подумать. Зачем тебе?
В файл писать и обратно
Аноним 24/04/20 Птн 13:23:01 #122 №661737 
>>661731
>Unity
Ой, хочешь выбрать идеальный движок - иди в движкосрач и там спрашивай. Unity такой же универсальный движок, как и Godot; все кубопесочницы на Unity, что я видел, лагали намного сильнее оригинального майнкрафта. Для кубопесочниц нужен узкоспециализированный движок - либо форкай minetest, либо пиши свой с нуля.

>У меня как-раз подобная структура намечается, но немного для других целей
Оптимизировать открытое пространство? Если нужны просто чанки, то чанками размером, условно, 50x50 метров можно покрыть очень большую карту без особых затрат, я так думаю. Сам хотел что-то такое сделать, но потом забил на проект и чот приуныл.
Аноним 24/04/20 Птн 13:24:44 #123 №661739 
>>661737
>Ой, хочешь выбрать идеальный движок - иди в движкосрач и там спрашивай. Unity такой же универсальный движок, как и Godot; все кубопесочницы на Unity, что я видел, лагали намного сильнее оригинального майнкрафта. Для кубопесочниц нужен узкоспециализированный движок - либо форкай minetest, либо пиши свой с нуля.
Вот поэтому и не хотел здесь даже упоминать про юнити, ибо, как понял, для здешнего анона это больная тема.

> но потом забил на проект и чот приуныл.
ЖЫза
Аноним 24/04/20 Птн 13:29:25 #124 №661744 
>>661733
>В файл писать и обратно
А, ты про streaming... Не уверен, есть ли в Godot это в таком виде.
Но можно сохранять ноды/сцены целиком: https://godotengine.org/qa/903/how-to-save-a-scene-at-run-time
Правда, я не уверен, сохраняется ли состояние переменных прикреплённого скрипта, т.к. сам пока не пробовал так.
Аноним 24/04/20 Птн 13:30:29 #125 №661747 
>>661744
Збс, что-то такое я и искал
Аноним 24/04/20 Птн 13:44:17 #126 №661762 
>>661737
Кстати, раз уж речь зашла о Майнкрафте, объясните, почему существуют такие моды, как оптифайн? При чем они реально работают. Почему разрабы не закладывают это в код программы? Только ли тут дело в криворукости, или есть какой-то скрытый смысл?
Аноним 24/04/20 Птн 14:03:33 #127 №661785 
>>661762
>почему существуют такие моды, как оптифайн
Понятия не имею, как работает оптифайн, но он вроде какие-то файлы подменяет на свои.

>Почему разрабы не закладывают это в код программы?
>есть какой-то скрытый смысл?
Возможно, несовместимость лицензий. К примеру, код под лицензией GPL, насколько мне известно, не может линковаться с каким-либо кодом под несовместимой с GPL лицензией (т.к. GPL как зомби-вирус - всё, что линкуется с GPL, обязано лицензироваться GPL и выкладываться в виде исходных кодов). Код майнкрафта - закрытый, то есть лицензия проприетарная, а это значит, что в код майнкрафта нельзя легально поместить GPL-код. То есть разрабам майнкрафта либо свой велосипед писать, либо искать код под какой-нибудь лицензией типа MIT, в то время как моддеры могут наплевать на законность и вволю пиратствовать (моддинг игр сам по себе незаконен, пока разраб не сделает ModAPI).

Ну и фиг знает, возможно есть внутренние проблемы, по которым нельзя просто взять и заменить что-то. Майнкрафт - это большая куча легаси кода, насколько я понимаю, выдернешь одно, может рухнуть другое. Его постепенно оптимизируют (и наверняка рефакторят), судя по всему, но процесс трудоёмкий и всё сразу сделать не получается.
Аноним 24/04/20 Птн 14:15:31 #128 №661797 
>>661785
Вот всегда интересовало, как можно кому-то предъявить за закрытый код? Он же закрытый))))))) То-есть, если что-либо всплывет, то налицо факт взлома ПО. Поэтому, что мешает использовать что-угодно в закрытом коде? Если нашел нарушение - значит взламывал и сам пидорас.
Хотя, я, конечно, понимаю, что все далеко не так просто
Аноним 24/04/20 Птн 14:23:26 #129 №661806 
>>661213
> Ааа, понял, это DLL-ку нужно биндить к Godot, а не Godot к DLL-ке. Лол. Ну ладно
Эх, моя мечта, чтобы годот существовал как ДЛЛ, которая бы через бинды подключалась к Лазарусу как компонент, чтобы весь код создавался и редактировался прямо в ИДЕ, все ресурсы так же в ИДЕ, отдельными окнами-инспекторами, чтобы сцену можно было редактировать в отдельном окошке с OPENGL выводом, как простую форму. А потом билд экзешника средствами фрипаскаля с полным доступом ко всем секциям бинарника, иконки/ресурсы и т.п. Ресурсы вшивать в соответствующие секции бинарника, а не как сейчас - файл PCK приклеивается в хвост заранее скомпилированного "шаблона экспорта". Эх, мечты.
Аноним 24/04/20 Птн 14:25:03 #130 №661808 
>>661797
Потому что взял ты такой код gpl у васи пупкина и вставил в свою закрытую игру, в потом некий анон выложил исходники твоей игры, т.к. работали вы компанией и произошла утечка (типа как у вальв сейчас). В лучше случае ты как компания найдешь анона а анально покараешь через суд, который обяжет его выплатить штраф, и тот будет тебе по 100 рупий платить каждый месяц до конца жизни. Но и ты как компания в свою очередь выплатишь охуеть какой штраф Васе Пупкину за нарушение лицензии и будешь открывать свой код.
Аноним 24/04/20 Птн 14:26:58 #131 №661810 
>>661806
так у него и так есть ядро, которое линкуется статически к редактору, вот его извлеки и компилируй в динамическую либу, может там уже все есть для этого
только вот весь инструментарий будешь заново писать для лазаруса
Аноним 24/04/20 Птн 14:27:56 #132 №661811 
>>661808
>т.к. работали вы компанией и произошла утечка
Это отдельный случай.

>потом некий анон выложил исходники твоей игры
А в этом случае, по идее, нужно еще доказать, что это ТВОИ исходники, а не его маняфантазии на тему твоей программы. Хотя, наверное, можно перекомпилить и сравнить хэш или типа того..
Аноним 24/04/20 Птн 14:30:50 #133 №661814 
>>661810
Я хочу игоры делать, а не портировать движки. Портированием софта я уже наигрался в нулевых-десятых. Остоебенило. Хочу чтоб мне сделали. Под опенсорц лицензией. Сделойти!
Аноним 24/04/20 Птн 14:31:36 #134 №661815 
>>661797
>Если нашел нарушение - значит взламывал
Однако нарушение-то есть. Если вор вломился в дом и увидел маньяка-педофила, вора судить будут за взлом дома, а маньяка - за педофилию. Загугли, были какие-то прецеденты с GPL, прям до суда дошло вроде. Да и, к тому же, закрытый код доступен сотрудникам компании, а те, хоть и подписывают NDA, по-прежнему могут доложить о нарушении, пусть даже анонимно.

Вокруг GPL вообще много срачей, поэтому ровные пацаны, как Godot, лицензируются под чем-то вроде MIT, чтобы не отпугивать людей жёсткими требованиями "только опенсурс" и "только под той же лицензией".
Аноним 24/04/20 Птн 14:33:13 #135 №661816 
>>661815
> Загугли, были какие-то прецеденты с GPL
Из недавнего - nginx, рамблер доебался к уасе, который начинал писать продукт в рабочее время на рабочем пека рамблерской серверной.
Аноним 24/04/20 Птн 14:33:21 #136 №661817 
>>661811
> нужно еще доказать, что это ТВОИ исходники
1) ты не проебал исходники
на тебя подают в суд и происходить проверка твоих закрытых кодов группой экспертной комиссии
2) ты клятвенно уверяшь, что ты потерял исходники, т.к. их же украли
берут слитые и ассемблируют, берут твою игру - аналогично.. сверяют до какого-там процента, который в суде считается достаточным
Аноним 24/04/20 Птн 14:37:02 #137 №661824 
>>661817
Ну, ок, как то так и подумал.
>Хотя, наверное, можно перекомпилить и сравнить хэш или типа того..

Едиснтвенное, еще одну вещь спрошу: насколько реально обнаружить свои исходники в сети одним прекрасным утром, если работаешь один?
Аноним 24/04/20 Птн 14:41:22 #138 №661833 
>>661806
>подключалась к Лазарусу как компонент, чтобы весь код создавался и редактировался прямо в ИДЕ, все ресурсы так же в ИДЕ, отдельными окнами-инспекторами, чтобы сцену можно было редактировать в отдельном окошке с OPENGL выводом, как простую форму
По-моему, в таком виде существуют GLScene и Castle Game Engine, нет? А ещё были DelphiX и ещё что-то...

>Ресурсы вшивать в соответствующие секции бинарника
По-моему у EXE есть строгое ограничение на ресурсы. Во всяком случае, если пытаться через .res запихнуть больше скольких-то десятков мегабайт изображений - приложение сломается. Так что лучше обращаться к внешним файлам (возможно, упакованным в свой формат), чем совать что попало в EXE.

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

>>661814
>Я хочу игоры делать
Эх, все мы хотим, да не у всех хоть что-то получается(
Аноним 24/04/20 Птн 14:47:37 #139 №661843 
>>661824
>Едиснтвенное, еще одну вещь спрошу: насколько реально обнаружить свои исходники в сети одним прекрасным утром, если работаешь один?
Такое может произойти, если:
1. Ты не Неуловимый Джо, и кому-то позарез нужны именно твои исходники;
2. У тебя на компьютере вирус или антивирус, любезно сливающий все файлы в Сеть;
3. Ты был пьян или с температурой 41+ пытался что-то делать, и сам слил исходники;
4. У тебя есть девушка/родственники/дети/друзья/соседи, которые имеют доступ к твоему ПК;
5. У тебя есть кот или любое другое животное, способное осмысленно нажимать клавиши клавиатуры;
6. Твой ПК изъяли менты на экспертизу, а уже у них завелась какая-то крыса или просто приколист;
7. ???
8. Тебя похитили инопланетяне, узнали пароль от компьютера и слили исходники ряди эксперимента.
В остальных случаях, думаю, шансы малы.
Аноним 24/04/20 Птн 14:51:29 #140 №661851 
>>661843
Так и думал, что будет куча мистики. Очевидно, интересен только первый вариант
Аноним 24/04/20 Птн 14:51:52 #141 №661853 
>>661843
Коту я доверяю
Аноним 24/04/20 Птн 15:17:43 #142 №661878 
>>661853
Приведёт кошек через балкон, пока ты за хлебушком вышел. А кошки спиздят твой код. И кота.
Аноним 24/04/20 Птн 16:00:32 #143 №661888 
>>661824
>насколько реально обнаружить свои исходники в сети одним прекрасным утром, если работаешь один?
В треде по опенсурсному движку этот вопрос выглядит очень странно. Вы или крест снимите, или штаны наденьте. А лучше заберите этот дискурс обратно в движкосрачи; и шапочку из фольги не забудьте.
Аноним 24/04/20 Птн 16:26:41 #144 №661894 
изображение.png
>>661744
Чому не работает?
Аноним 24/04/20 Птн 16:34:12 #145 №661896 
изображение.png
>>661894
Сейвил вот так, сцена создалась
Аноним 24/04/20 Птн 16:40:19 #146 №661899 
>>661894
Эддчайлд что-то там делает противозаконное явно. Т.к. если его убрать, то программа запускается (если оставить, то на экран выводится только логотип годо), хотя print(a) в сохраненной сцене ничего не выводит в аутпут, так что я хз, где эта нода вообще находится, если она вообще загрузилась
Аноним 24/04/20 Птн 16:49:32 #147 №661904 
>>661899
>хотя print(a) в сохраненной сцене ничего не выводит в аутпут
Он находится в физикс процесс, так что должен спамить только в путь, если сцена вообще добавилась в игру
Аноним 24/04/20 Птн 16:57:10 #148 №661916 
изображение.png
>>661896
>>661894
Вот еще, если это важно
Аноним 24/04/20 Птн 17:11:13 #149 №661928 
>>661916
>>661904
>>661899
>>661896
>>661894
Соряны, я кажется затупил. Я сохранил вообще все походу, оттуда и ошибки
Аноним 24/04/20 Птн 17:17:55 #150 №661931 
>>661811
> А в этом случае, по идее, нужно еще доказать, что это ТВОИ исходники
Посылаешь заказным письмом самому себе диск с исходниками. Не распечатываешь. Теперь у тебя есть пакет с исходниками датой государственной почты.
Аноним 24/04/20 Птн 17:24:07 #151 №661935 
>>661843
Ты запускаешь демки скачанные с двачей и прочих твг :3
Аноним 24/04/20 Птн 17:38:21 #152 №661944 
>>661928
А ты что собственно хочешь реализовать?
Аноним 25/04/20 Суб 04:23:09 #153 №662299 
>>661609
https://www.youtube.com/watch?v=MA7jSbXfS34
Стоило решить проблему самому, как тут же появилось решение в сети.
После некоторых тестов оказалось, что положение пуль сбивается вовсе не из-за CanvasLayer'а, а по какой-то причине в коде самих пуль.
Аноним 25/04/20 Суб 08:17:51 #154 №662304 
Годаны, а lerp ведь быстро работает? Никаких более дешёвых функций уже не придумать, потому что эта и так предельно простая, верно?
Речь про 2д, всякие сглаживания движений на масштабах в 20-30 пикселей.
Аноним 25/04/20 Суб 11:08:15 #155 №662325 
>>662304
У тебя игра-то есть чтобы её преждевременно оптимизировать?
Аноним 25/04/20 Суб 13:20:13 #156 №662359 
>>662325
#Культураобщения #ответнавопрос
Аноним 25/04/20 Суб 13:30:52 #157 №662365 
>>662359
Ну а что ты хочешь? Сделай миллион вызовов lerp в цикле, потом замени lerp на какой-нибудь велосипед, сделай сравнение по затраченному времени. Нам за тебя это делать?
Аноним 25/04/20 Суб 14:37:08 #158 №662409 
>>662365
Какой же ты зануда. Специально для тебя перефразирую вопрос.
Существует ли в годоте функция, которой можно было бы заменить lerp для плавного движения чего-либо? Или же lerp и так предельно дешёвая?
Аноним 25/04/20 Суб 15:06:15 #159 №662426 
>>662359
#преждевременнаяоптимизация #XYпроблема
Он все правильно тебе ответил. Ну если тебе так важно то lerp это обертка над чем то вроде a(1-t)+bt и имеет 1 или 2 умножения, в зависимости от формулы. Что будет быстрее? Во-первых, если у тебя значения только от нуля, то одну половины формулы можно выкинуть. Во-вторых, если у тебя начальное и конечное значение неизменны, то иногда можно вынести все из цикла, а в цикле оставить только x+=delta
Аноним 25/04/20 Суб 15:53:58 #160 №662448 
>>662426
Ну вот, ответ по существу, спасибо.
Это приблизительно совпадает с моими догадками. Прежде чем спросить, я, естественно, погуглил, прочекал суть идеи, выяснил, что под словами "линейная интерполяция" скрывается простое ax+b. Сам вопрос возник по той простой причине, что зачастую простые решения, описываемые в гайдах, имеют какие-то недостатки; или, например, в гайдах не упоминаются какие-нибудь тонкости или частные случаи. Например, ситуация с канвасом выше по треду. Или вот, из найденного сегодня: функция lerp_angle меня спасла, потому то я поворачивал lerp'ом ствол вслед за мышкой, и для гладкого поворота из левой верхней четверти круга в верхнюю нижнюю без этого пришлось бы поизвращаться. В конце концов, все эти гайды существуют для обучения, они не рассчитаны на работу проектах в более сложных, чем демка в один экран.
Почему возникли подозрения в скорости lerp'а: ну, например, потому что он принимает разные типы данных, а значит могла бы существовать более строго типизированная функция, которая работает быстрее. Или ещё почему. Хз, что там за код под капотом. Я спросил в треде, потому что тут, может быть, есть кто-то, кто копался в исходниках и смотрел, как оно там реализовано.

Что касается "преждевременной" оптимизации. Лучше я сразу напишу оптимальный код, чем напишу сначала не оптимальный, а потом буду оптимизировать. Времени на написание кода уйдёт одинаково, зато потом на оптимизации сэкономлю. А ещё я узнаю что-то новое, если попробую какой-то метод, который прежде не пробовал.
Такие дела.
Аноним 25/04/20 Суб 18:18:15 #161 №662512 
>>662448
Нет. Лучше написать lerp в лоб, потом посмотреть а есть ли тормоза, потом в профайлере посмотреть что они реально в этом месте, и только потом переделывать. Разгадка проста - твой lerp может занимать 0,00000001% кадра. Это экономия на спичках.
Аноним 25/04/20 Суб 18:47:52 #162 №662523 
>>662512
>Разгадка проста - твой lerp может занимать 0,00000001% кадра. Это экономия на спичках.
Самая главная проблема преждевременных оптимизаций не в том, что может быть экономия на спичках; порой каждая спичка имеет цену. Самая главная проблема в том, что пока он >>662448 будет искать самый оптимальный способ решения какой-то абстрактной задачи, он будет занят только этой задачей, забыв про собственно разработку конкретной игры. Это как движкописательство, вот ты заметил, что твоей игре в твоём движке не хватает какого-то компонента, сел его писать, и через несколько недель у тебя есть превосходная версия компонента, само совершенство, идеальный код, но за всё это время ты не вспоминал об игре, ради которой этот компонент делался, и в итоге возвращаться к игре трудно... а самое страшное, что после возврата к игре окажется, что планировавшаяся в игре фича неинтересна или работает не так, как хотелось, поэтому написанный за эти недели идеальный компонент придётся убрать в ящик идеальных, но бесполезных вещей, и больше никогда не использовать.

Короче, преимущество движков типа Godot в быстром прототипировании - можно одним пальцем накидать заготовку игры, поиграть в неё и определиться, что нужно для финальной игры. А потом можно даже выкинуть Godot и взять что-то более узкоспециализированное, более сложное в работе, потому что к тому моменту у тебя будет чёткое понимание того, что нужно игре. Раньше игры было трудно делать не потому, что не было простых в освоении готовых инструментов, а потому, что прототипы делались месяцами, а потом выкидывались тем же образом, что выкидываются проекты-однодневки сегодня.
Аноним 25/04/20 Суб 19:09:09 #163 №662536 
Сука. Сделал ветвистое дерево анимаций. Всё работает, красота. В одном месте решил поэкспериментировать, воткнуть дополнительный модуль. Всё повисло, причём не просто намертво, а завесило всю систему вместе с мышью и клавой - а так подвесить линух это надо постараться. Причём сначала только годот перестал реагировать, а секунд через 10 мышь начала терять фпс.
Ок, ребут. Последнее сохранение-то, думаю я, было до того, что вызвало это подвисание. Загружаю проект, нажимаю на ноду дерева_анимаций - и она не нажимается, а снова всё вешает. После нескольких попыток я понял, что любое нажатие хоть левой, хоть правой кнопкой вызывает подвисание. Походу, годоте сам граф дерева не нравится.
Открыл в текстовом редакторе файл сцены, нашёл там дерево анимации, стёр. Предварительно забэкапив, конечно же. Часа за два сделал дерево заново. Начал тестить, случайно рассоединил в одном месте. Соединил обратно, и оно снова зависло. И снова это зависание каким-то неведомым образом записалось в файл сцены.
Особая вкуснота ситуация в том, что у меня не винда, а линух. А его подвесить это надо постараться.
Сборкой 3.2.2 пробовал открывать. Точно так же виснет.
Скачал виндовс-версию, запустил через Wine. При нажатии на дерево анимации на пару секунд годотя подвисла, но потом нормально его открыла.
Такой вот опыт.
Аноним 25/04/20 Суб 19:21:02 #164 №662541 
>>662536
Попытка сохранить вин-версией и открыть заново линуксовой провалилась. Пересохранённое дерево всё равно виснет. Попробовал оставить в подвисшем состоянии, через пару минут годо упало.
Аноним 25/04/20 Суб 19:21:13 #165 №662542 
>>661142
Голубь шляпу свою суёт
Аноним 25/04/20 Суб 20:05:56 #166 №662551 
>>662542
По самые помидоры? Ммм... Это сюжет для новой игры!
Аноним 25/04/20 Суб 20:08:48 #167 №662552 
>>662536
>>662541
Кошмар! Сочувствую, бро! Скинешь мне дерево, потестить?
Аноним 25/04/20 Суб 20:19:17 #168 №662555 
Почему вы не делаете игру про голубей?
Аноним 25/04/20 Суб 20:27:17 #169 №662561 
>>662555
Потому что мы не рабы-разрабы, очевидно же.
Аноним 25/04/20 Суб 20:29:21 #170 №662563 
>>662561
Но ведь они же голуби
Аноним 25/04/20 Суб 20:48:38 #171 №662572 
Еее! ГОДОТ!
https://youtu.be/UEDEIksGEjQ
Аноним 25/04/20 Суб 20:54:35 #172 №662575 
И в категории мобилок:
https://youtu.be/AIapugketbs
Аноним 25/04/20 Суб 21:36:35 #173 №662600 
>>662536
Я нашёл твою проблему, ты упомянул её как минимум дважды:
>линух
Если серьёзно, сколько у тебя RAM и как настроен файл подкачки? Полный висяк линукса мне очень хорошо знаком, у меня он часто происходил из-за переполнения физической RAM без файла подкачки (разные дистрибутивы, 3 полностью разных машины). Учитывая то, что редактор Godot очень любит кушать память (VRAM в т.ч., а при её нехватке отбирается RAM), подозреваю, что у тебя в сцене с деревом анимаций происходит резкое переполнение RAM, которое и вешает линукс. Почему на Windows/Wine такого не случается? У Windows работа с памятью устроена как-то иначе, из моего опыта она стремится во что бы то ни стало сохранить стабильность своих процессов, убивая самые толстые пользовательские процессы, но только когда заканчивается RAM+файл подкачки; т.о. даже забитая до предела память не вешает системные процессы, а только создаёт тормоза на несколько секунд (пока приложение не отдаст память обратно) и некоторые минимальные глюки (диспетчер рабочего стола Explorer может упасть и загрузиться с небольшими глюками, видимо он не входит в число бережно защищаемых процессов).

Короч, попробуй включить/увеличить файл подкачки, по идее должно помочь. И посмотри по диспетчеру задач, что происходит с памятью/процессом Godot сразу после нажатия на файл сцены, если происходит резкий всплеск потребления памяти - это точно оно.
Аноним 25/04/20 Суб 22:00:15 #174 №662610 
1587841214536.png
Годаны! Как же охуенно клепаются интерфейсы в годоте, если юзать боксконтейнеры! Прям веб-вёрстка какая-то получается. Не нужно заботиться о расположении элементов (anchor), всё размещается само, как ты один раз настроил, как бы не менялось окно. И даже при уменьшении более менее сохраняется внятность интерфейса, хотя я понимаю, что при совсем уж уменьшении надо бы масштабировать отдельно скриптом. Но суть в том, что как поют в рекламе корпораций - без единой строчки кода полноценный лук эн фил!
Аноним 25/04/20 Суб 23:20:12 #175 №662662 
>>662600
Погоди-ка, я правильно понимаю, что ты предлагаешь рекурсивному процессу, отжирающему всю доступную память, дать ещё памяти, чтобы он сожрал и её?
График потребления памяти рос равномерными такими ступеньками. И да, до потолка, а потом и своп. А перед тем, как начать жрать память, на 100% нагрузилось первое ядро процессора.
Вайн сандбоксит приложения, вроде как, поэтому у него краш случается гораздо быстрее, до достижения предела памяти. А вот почему вин-версия иногда вообще не пытается ничего сожрать, и граф открывается за пару секунд, не отъедая память, вот это не очень понятно.

>>662552
Скину, когда точно перепробую все варианты. Да и не очень понятно, как его скидывать: не весь же проект в архив запихивать, там говнокод и заглушки, нельзя такое показывать; а вне проекта не факт, что баг воспроизведётся.
Аноним 25/04/20 Суб 23:20:20 #176 №662663 
>>662610
Нашёл чем хвастаться, такое было ещё в Borland Delphi в 1995 под Windows 3.1.
Аноним 25/04/20 Суб 23:26:26 #177 №662670 
>>662600
>Я нашёл твою проблему, ты упомянул её как минимум дважды:
>godot
(Автор этого поста был забанен. Помянем.)
Аноним 25/04/20 Суб 23:30:33 #178 №662674 
1587846632961.png
>>662662
> и не очень понятно, как его скидывать
Сохрани ресурс в ресурсный файл, очевидно. В анимплеере анимации тоже схорони в файлы.
>>662663
Ну и делай игры в своем дельфи. К нам-то в тред чего залез и ноешь? Допиздишься, побрацки тебе говорю.
Аноним 25/04/20 Суб 23:32:08 #179 №662676 
Один вот уже допизделся, забыл, что выкатился из своего загона. Репорт ушёл на золото.
Аноним 25/04/20 Суб 23:32:20 #180 №662677 
>>662662
>Погоди-ка, я правильно понимаю
Какой-то грубый тон однако чувствую я.
>ты предлагаешь рекурсивному процессу, отжирающему всю доступную память, дать ещё памяти, чтобы он сожрал и её?
Да. Ведь когда-нибудь он остановится, так? Рекурсивные процессы не бывают бесконечными - в какой-то момент переполняется стек вызовов и всё рушится, но в твоём случае ему просто нужно больше памяти (а тебе - не строить такие деревья). Даже если у тебя файл подкачки на SSD, ничего страшного не случится, в следующий раз просто не будешь делать такие жирные сцены.
>А вот почему вин-версия иногда вообще не пытается ничего сожрать, и граф открывается за пару секунд, не отъедая память, вот это не очень понятно.
Возможно, какой-то баг конкретно линуксовой версии, попробуй открыть issue на гитхабе.

Вообще, ты так бойко отвечаешь, будто хочешь сказать "я и без тебя всё это знал" или будто обиделся, что линукс, оказывается, проще уронить, чем винду. А ведь я просто попытался подсказать, в чём может быть проблема. С:

>>662670
Если немного подумать, в чём-то ты прав. У Godot как минимум какое-то фиговое хранение сцен. То есть если уровней вложенности мало, всё ОК, но как только ты пытаешься вложить сцену в сцену в сцену в сцену, в какой-то момент всё начинает дико тормозить на СОХРАНЕНИИ этой сцены, и это очень огорчает.
Аноним 25/04/20 Суб 23:32:50 #181 №662679 
>>662536
>подвесить линух это надо постараться
Чего то улыбнуло, про баг 12309 ты не слышал видимо.
Аноним 25/04/20 Суб 23:35:04 #182 №662681 
>>662674
>Ну и делай игры в своем дельфи. К нам-то в тред чего залез и ноешь?
Я сюда залез, потому что пытаюсь сделать игру на Godot, очевидно же)
А пост было в том смысле, что он >>662610 открыл Америку - древовидные GUI с контейнерами были ещё в первых RAD. Godot может многим похвастаться, но древовидный GUI - это не изобретение Godot, вот я о чём.
Аноним 25/04/20 Суб 23:36:53 #183 №662682 
>>662681
> он >>662610 открыл Америку
Похвастаться уже нельзя.
>>662679
Вау, это с ним я вчера столкнулся! При копировавшемся образе венды на флешку отказывалась запускаться венда в QEMU и одновременно резко приостановилось копирование файла с образом. Это было оно?
Аноним 26/04/20 Вск 00:18:08 #184 №662716 
>>662674
>В анимплеере анимации тоже схорони в файлы.
Их там два с половиной экрана по 1080p. Я пересоздавал сцену, копипастил анимации, задолбался. Больше чёт не хочется.
>Сохрани ресурс в ресурсный файл
У меня почему-то эта кнопочка неактивна. Можно попытаться сохранить tree_root, но работает это весьма криво.
>Рекурсивные процессы не бывают бесконечными
Не вижу, почему бы ему не быть достаточно прожорливым, чтобы не всосать ещё пару гигов, которые я чисто теоретически мог бы ему дать.
>в следующий раз просто не будешь делать такие жирные сцены.
Переделать дерево анимаций - это да, это мне видится единственным адекватным решением. Перераспределить по стейт-машинам, чтобы было меньше всяких блендов.
>Вообще, ты так бойко отвечаешь, будто хочешь сказать "я и без тебя всё это знал" или будто обиделся, что линукс
Ты зря пытаешься уловить интонации в печатном тексте.
Я так отвечаю, потому что в моём понимании это нелогично: дать ещё памяти, если процесс без причины съедает её всю. Это всё равно что пытаться затушить пожар из ведра и кастрюли, когда одного ведра оказалось мало. Да, наверное, если дать терабайт подкачки, может, что-то и получится. Но это всё равно очень сомнительно.
>У Godot как минимум какое-то фиговое хранение сцен.
Если быть точным, там полнейший бардак. Ресурсы раскиданы по файлу без какого-либо порядка, ссылаются друг на друга по номерам, которые тоже не по порядку. Я хотел аккуратненько вырезать дерево вместе со всеми внутренностями, но оказалось, что это не так-то легко сделать. Почему там нет хотя бы подобия иерархической структуры не очень понятно.
Аноним 26/04/20 Вск 00:28:02 #185 №662725 
>>662716
> Переделать дерево анимаций — это да, это мне видится единственным адекватным решением. Перераспределить по стейт-машинам, чтобы было меньше всяких блендов.
А вот же, глянь, анончик сначала юзал дерево, потом заменил его на КА: >>660760 >>660749 и получил нехилый буст, судя по его восторженному тону.
Аноним 26/04/20 Вск 00:56:15 #186 №662734 
1587851775000.png
1587851775125.png
>>662716
> Если быть точным, там полнейший бардак. Ресурсы раскиданы по файлу без какого-либо порядка, ссылаются друг на друга по номерам, которые тоже не по порядку. Я хотел аккуратненько вырезать дерево вместе со всеми внутренностями, но оказалось, что это не так-то легко сделать. Почему там нет хотя бы подобия иерархической структуры не очень понятно.
Поэтому я лично рекомендую все ресурсы по возможности сохранять в отдельные файлы. Файл tscn по возможности должен содержать ТОЛЬКО пути к файлам ресурсов. Но вообще, это сложно, когда привык лепить ресурсы, как это принято в видеотуториалах. Вот я специально для тебя заморочился и сохранил все вложенные ресурсы одной из своих сцен в отдельные файлы. Файл сцены похудел очень сильно (я не подумал заранее и не запомнил предыдущий размер, было около 40 Кб, стало 2 Кб). Пикрелейтед содержание начала файла вместо длинных текстов с описаниями ресурсов.

И ещё одна полезная фишка: Файлы tscn - это текстовые файлы, есть бинарный формат scn, который сильно тоньше (вышеуказанная сплеш-сцена в бинарном виде стала 1 Кб). То же самое с ресурсами, когда ты их сохраняешь через "сохранить как", тебе диалог предлагает фильтр .tres, .material или *.anim, так вот tres - текстовый и раза в два больше, чем файлы с аббревиатурой ресурса. Выглядят бинарные сцены и ресурсы как второй пик.

Вроде как при экспорте это всё равно в ПАК-файл конвертируется как бинарное, но это не точно. В любом случае, ты можешь нехило бустануть работу с проектом в редакторе, если будешь сохранять всё в бинарные форматы. А если требуется что-то ручками в блокноте подшаманить - всегда можно сохранить копию в текстовый формат, подшаманить, открыть, проверить что всё норм и пересохранить в бинарном.
Аноним 26/04/20 Вск 01:02:43 #187 №662736 
>>662716
>Не вижу, почему бы ему не быть достаточно прожорливым, чтобы не всосать ещё пару гигов, которые я чисто теоретически мог бы ему дать.
Ох, я тебе говорю - если ты в следующий раз столкнёшься с такой проблемой, просто докинь ещё гигов 8 памяти, а потом удали из сцены всё лишнее, чтобы она больше так не делала. Это только чтобы попытаться разрулить ситуацию, которую сам же случайно и создал, чтобы не пределывать всё с нуля с тем же результатом.

Или в линуксе файл подкачки занимает фиксированное пространство? Когда я пользовался, там вроде вместо "файла" была "папка подкачки"... У меня на Windows сейчас 8 ГБ физической RAM, 2 ГБ исходного файла подкачки (на всякий случай) и верхний предел 16 ГБ, чтобы в сумме получалось 24 ГБ. Раньше было меньше (16 ГБ в сумме), недавно расширил, т.к. заметил переполнение, когда попытался поиграть в одну игру, не закрывая редактор Godot...

>в моём понимании это нелогично: дать ещё памяти, если процесс без причины съедает её всю
Условно, может быть два варианта:
1. Процесс заглючил и вошёл в бесконечный цикл и будет жрать столько, сколько дадут;
2. Процесс в порядке, просто ты задал ему слишком тяжёлую задачу, ресурсов не хватает.
Ты думаешь про 1-й вариант, а я тебе говорю про 2-й. Тем более, как я уже говорил, у меня линукс вис намертво от простейшего переполнения памяти, а это как минимум говорит о том, что железо не тянет (в моём случае памяти реально мало было, <1 ГБ). Если физическая оператива не тянет и нет возможности её проапгрейдить (как у меня, 8 ГБ потолок), остаётся только расширять файл подкачки (подкачка с SSD вообще незаметна), если хочешь стабильно работать с тяжёлыми проектами. А то у тебя так и будет всё чуть что падать от переполнения...

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

>Да, наверное, если дать терабайт подкачки, может, что-то и получится.
Глупости. Просто скажи, что тебе лень докинуть десяток гигабайт про запас и забыть об этом)

>>662734
>рекомендую все ресурсы по возможности сохранять в отдельные файлы
У меня как раз с таким методом сохранения получилась какая-то фигня, правда у меня получается что-то вроде "tscn <- tscn <- tscn <- tscn <- tscn <- tscn", очень глубокая степень вложенности, может из-за этого сохранение так жутко тормозит.
Аноним 26/04/20 Вск 01:08:39 #188 №662737 
>>662736
> правда у меня получается что-то вроде "tscn <- tscn <- tscn <- tscn <- tscn <- tscn", очень глубокая степень вложенности, может из-за этого сохранение так жутко тормозит.
Скорее всего. Как я выше написал, форматы с приставкой t - текстовые, соответственно их парсинг будет обладать всеми тормозами работы с текстом. Попробуй организовать
> "scn <- scn <- scn <- scn <- scn <- scn"
внутри которых
> "scn <- res <- material <- texture <- anim <- etc"
Аноним 26/04/20 Вск 01:09:45 #189 №662739 
>>662737
... И отпишись о результатах, если не затруднит. А я пошёл на боковую. Чот поздно уже.
Аноним 26/04/20 Вск 05:20:37 #190 №662748 
>>662736
>если ты в следующий раз столкнёшься с такой проблемой
В момент возникновения этой проблемы решать докидывать что-либо будет уже поздно, всё зависнет.
А потом я лучше воспользуюсь вайн-версией для удаления всего лишнего. Нынешний объём подкачки меня устраивает, нет никаких задач (работающих как задумано), где бы мне понадобилось больше.
>просто докинь ещё гигов 8 памяти
>Просто скажи, что тебе лень докинуть десяток гигабайт про запас
HDD-боярина благородные речи
>Когда я пользовался, там вроде вместо "файла" была "папка подкачки"
Раздел на диске. Увеличить-уменьшить его довольно проблематично.

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

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

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

Я тут повкладывал бленддеревья одно в другое. Вместо одного огромного разветвлённого бленддерева получилось много маленьких. И это, кажется, сработало. По крайней мере, пока что всё нормально открывается. Да и ориентироваться стало, в общем-то, удобнее.

Теперь воюю с новой странностью:
var a: bool = True #тут сначала было false
var b: float = PI #там могут быть разные значения от -PI до PI, это на самом деле результат работы angle_to
print(b)
#3.14...
if a and abs(b) > PI/2:
#и тут мы падаем с ошибкой:
#Invalid type in built-in function 'abs'. Cannot convert argument 1 from Nil to float

Я даже явным образом задавал значение b непосредственно перед проблемным местом. Если непосредственно перед условным блоком написать var c = abs(b) и потом в условие добавлять это самое c, то всё работает. Либо это какое-то очень сильное колдунство, либо я чего-то не знаю о том, как работают условия в гдскрипте. Либо просто спать ночью надо было.
Аноним 26/04/20 Вск 13:19:25 #191 №662825 
>>662748
Нет ничего страшного в том, чтобы объявить локальные переменные. Ты даже можешь объявить:
> c : bool = abs(b) > PI/2
> if a and c:
Аноним 26/04/20 Вск 13:32:06 #192 №662830 
>>662748
Написано что у тебя в b не float, а Nil. Значит ты что то накосячил в своей angle to print. Не инициализировал возврат во всех ветках, к примеру.
Аноним 26/04/20 Вск 13:38:14 #193 №662832 
>>662830
> в своей angle to print
Монитор квадрат? Угадал?
Аноним 26/04/20 Вск 13:41:49 #194 №662834 
>>662832
Чего? Нет монитора.
Аноним 26/04/20 Вск 13:42:24 #195 №662835 
>>662834
А как ты мой пост увидел без монитора?
Аноним 26/04/20 Вск 13:43:26 #196 №662837 
>>662835
Есть телевизор, смартфон. Причем тут это?
Аноним 26/04/20 Вск 13:44:53 #197 №662838 
>>662837
Притом, что в его посте нет никакой "angle to print"
Есть отдельная строка с angle to
и есть отдельная строка с print
Аноним 26/04/20 Вск 15:29:31 #198 №662871 
память.png
>>662748
>В момент возникновения этой проблемы решать докидывать что-либо будет уже поздно, всё зависнет.
Вот поэтому памяти на ПК нужно иметь с запасом. Когда-нибудь да не хватит, тем более когда игры пилишь.
>HDD-боярина благородные речи
Мой HDD умер от старости. Но с тех пор, как поставил SSD, держу файл подкачки на SSD, ибо так быстрее.
inb4: нет, SSD не изнашивается слишком быстро, за 3/4 года 24/7-аптайма потратилось всего ~2% износа.
>Раздел на диске. Увеличить-уменьшить его довольно проблематично.
Насколько я помню, в линуксе есть несколько видов виртуальной памяти, их можно переключать между собой.
>2-й вариант не выглядит чем-то правдоподобным
Однако и такое бывает. Достаточно импортнуть какую-нибудь большую модель в 3D-редактор, например.
>Пиксельное 2д, какие там тяжёлые проекты.
Всё относительно)
>>662825
>Нет ничего страшного в том, чтобы объявить локальные переменные
Кроме того, что выделение памяти под локальные переменные должно отнимать дополнительное время.
>>662832
Скорее разрешение мелкое какое-нибудь, или вертикальный дисплей. 3:4 уже редко встречается.
Аноним 26/04/20 Вск 22:06:41 #199 №663084 
Когда уже в годотовские партикли прикрутят физику ака колизии?
Аноним 26/04/20 Вск 22:14:55 #200 №663085 
>>663084
разве gles 3 такое предусматривает? там же geometry shader нужны
Аноним 26/04/20 Вск 22:19:15 #201 №663086 
>>663085
хуан обещал вроде год назад, что добавит. Мб с вулканом такое буит
Аноним 26/04/20 Вск 22:35:09 #202 №663093 
>>663086
ну такое может быть только на новом рендеринге, годо на gles2-3, а тут надо gl3.3+ или vulkan
Аноним 27/04/20 Пнд 00:34:02 #203 №663163 
>>662748
>angle_to(b)
Оговариваться стал от бессонницы. Причём написал angle_to, глядя в свой же код, где написано b = self.global_position.direction_to(мышь).angle()
>>662830
>Значит ты что то накосячил в своей angle to print
Я делал даже присваивание непосредственно перед if'ом. То есть, так и писал:
b = PI
а потом, чтобы убедиться, что оно точно-точно присвоилось, добавлял:
print(b)
И всё равно в abs в условии говорил, что b это nil. Тот же самый abs в том же месте кода, но вызванный на строчку выше условного блока, прекрасно переваривает ту же самую b, никаких nil'ов.
Аноним 27/04/20 Пнд 00:44:34 #204 №663169 
>>663163
Сделай b onready и посмотри на реакцию.
Аноним 27/04/20 Пнд 11:18:55 #205 №663244 
https://youtu.be/gAM3JIplECc?t=270
Аноним 27/04/20 Пнд 19:53:17 #206 №663834 
Антончики, вопрос есть. А делает ли кто-нибудь из вас проект полностью на C# вместо GDScript'а? Ну или есть ли в шоукейсе годота, хоть один проект полностью на C#?
Я просто попробовал для интереса, вроде получилось неплохо и мне понравилось, но слегка смущает что по мануалу поддержка C# еще в 'late alpha' стадии.
Аноним 27/04/20 Пнд 20:49:38 #207 №663842 
>>663834
Не смущайся. Там реально полностью законченный проект запилить. Есть даже канал, где чел всё на шарпе в годоте кодит и туториалы пилит. Интересует? Поищу.
Аноним 27/04/20 Пнд 20:54:25 #208 №663849 
>>663842
Поискал.
https://www.youtube.com/watch?v=ra-BJ-fJ6Qo
Аноним 27/04/20 Пнд 21:18:29 #209 №663856 
>>663842
>Интересует? Поищу.
Спасибо. Хотя там и без уроков все понятно.
Аноним 27/04/20 Пнд 22:07:47 #210 №663892 
Причесал все анимации, довёл до работоспособного состояния, остался всего один баг, который я пока не знаю, как исправлять (если прервать OneShot другой анимацией, то при повторном вызове ваншота проиграется только окончание, не довыполненное в прошлый раз). Сделал шесть новых видов оружия и к ним шесть видов пуль, довёл до работоспособного состояния, остался всего один баг, который я пока не знаю, как лучше исправить (чтобы у дульной вспышки частицы извергались с темпом стрельбы, даже если он медленнее, чем время жизни астиц, и прекращали извергаться, если стрельба окончена). Сделал красивый ХУД, в котором отображается здоровье, арсенал и патроны, и тут даже каких-либо багов не уловил, вроде норм работает.
Продуктивненько, в общем. Я долго ковырялся с начальной частью, тыкался в непонятные места и всё никак не мог с ними разобраться; стоило это сделать, как работа пошла отличными темпами. Завтра доделываю всякое по мелочи, после чего можно приступать к работе над ИИ. Я совершенно хз, как ему лучше выстраивать логику, поэтому попробую для начала обучить простой генетический алгоритм; если не получится, буду уже глубже копать материалы по этой теме.
Аноним 27/04/20 Пнд 22:16:04 #211 №663893 
>>663892
Сейчас, вроде бы GOAP в почете. Ну это если нейронки не копать.
Аноним 27/04/20 Пнд 22:51:04 #212 №663905 
>>663893
Двачую ГОАП для ИИ. В библиотеке ассетов есть готовая реализация.
>>663892
> если прервать OneShot другой анимацией, то при повторном вызове ваншота проиграется только окончание, не довыполненное в прошлый раз
Откажись от дерева и перейди на стейтмашину. Я тебе даже пытался помочь разобраться:
>>660749
>>660760
Аноним 28/04/20 Втр 06:50:54 #213 №663990 
>>663905
>Откажись от дерева и перейди на стейтмашину
У меня сейчас в корне стейтмашина, каждое из состояний в которой это небольшое дерево. Одной только стейтмашиной тут не обойтись, надо совершать много комплексных анимаций, отдельно для рук и ног.
>>663893
>Сейчас, вроде бы GOAP в почете.
Ок
Аноним 28/04/20 Втр 08:39:41 #214 №663996 
>>663892
>попробую для начала обучить простой генетический алгоритм
Лолшто, зачем тебе ГА в игре? И как ты это себе представляешь? Для ГА нужна какая-то виртуальная машина, которая будет исполнять генетический код, при этом сложность кода должна быть мизерной, иначе годное решение никогда не найдётся.

На ГА удобно сделать симуляцию жизни популяции организмов, но для обычной игори смысла в ГА нет, игре нужны чёткие алгоритмы поведения ботов.
Аноним 28/04/20 Втр 08:58:52 #215 №664001 
>>663996
Затем, что
>попробую
В конце концов, это любительский проект, важной целью которого является познание. Мне всегда было интересно узнать, как будет выглядеть такой ии в играх, но никогда не попадалось адекватных готовых примеров.

У меня есть некоторые соображения, как сделать, чтобы ГА можно было обучить на достаточно сложные задачи за адекватное время. Например, увеличивать количество доступных входов и выходов по мере обучения, чтобы новую фичу получали только самые стабильные экземпляры.
Аноним 28/04/20 Втр 11:08:17 #216 №664022 
>>663996
>Лолшто, зачем тебе ГА в игре? И как ты это себе представляешь?
Что-то типа кучи ботов с параметрами, из которых в следующее поколение переходят те, что выжили, не?
мимо
Аноним 28/04/20 Втр 17:11:21 #217 №664171 
>>664001
>увеличивать количество доступных входов и выходов по мере обучения, чтобы новую фичу получали только самые стабильные экземпляры
Всё зависит от того, какой будет исполняющая машина. Может получиться так, что изменяя её параметры, ты будешь делать всех текущих выживальщиков нежизнеспособными. ГА - это не нейронка, в нейронке ты можешь зафиксировать часть нейронов и наращивать новые, а в ГА по идее меняется всё сразу.

>>664022
>Что-то типа кучи ботов с параметрами, из которых в следующее поколение переходят те, что выжили, не?
Так можно только отрегулировать значения параметров (есть/нет/%), это не очень интересно. Грубо говоря, если у твоих ботов есть параметр "цвет", то в конечном итоге они все будут одного выигрышного цвета, и дальше никакой эволюции не будет (хотя окей, выбор идеального значения и есть цель ГА). ГА для ботов можно применить иначе. Щас пример набросаю, надеюсь, не ошибусь...
Сначала задаём исходный алфавит из кодов-команд бота:
0 - ожидание, 1 - идти вперёд, 2/3 - поворот влево/вправо, 4 - атака, 5 - защита, ...
Дальше генерируем каких-нибудь рандомных ботов, примеры:
323534 - вращается на месте, защищается и атакует (ходить не умеет)
121300 - движется по диагонали (ничего кроме этого не умеет)
Предположим, они выжили, скрещиваем, получаем:
323300 - вращается на месте (больше ничего не делает)
121534 - движется по диагонали, иногда защищается и атакует
Вероятно, 121534 будет успешнее предков и брата. Но это абстрактно. Чтобы реально протестировать ботов на успешность, нужны регулирующие условия. Скажем, бот может есть - значит, вокруг разбросана еда, а у бота есть параметр "энергия". Если бот не умеет есть или не находит еду - теряет энергию и погибает раньше всех. Если бот жрёт всё подряд, то еда быстро кончается и он опять же мрёт, хоть и позже. Теоретически, можно выстроить такую цепочку кодов, что бот будет двигаться и потреблять пищу оптимально для конкретной среды обитания. Чтобы эту цепочку найти, мы скрещиваем самых живучих ботов и вносим небольшие мутации:
121534 -> 121434 - теперь бот чаще пытается атаковать/есть, но разучился защищаться
Мутации нужны, скорее всего, потому, что простые комбинации кусочков в конечном итоге потеряют некоторые буквы (например, тут уже потерян 0, а другой бот потерял 1, 4 и 5) или их комбинации (если комбинируем половинками или любыми другими группами, без перемешивания букв), из-за чего наступит однообразие и топтание на одном месте. Ну, тут нужно гуглить реальную генетику.
Так вот... Мы можем расширять алфавит, добавляя разные команды (включая конструкции if/loop, переменные и прочее), можем расширять длину кода, можем добавлять регулирующие условия среды (например, днём жарко, и ботам нужно найти укрытие; боты имеют датчики и условия для проверки, а как ими пользоваться - должны дойти до этого сами через сколько-то поколений бессмысленных смертей, лол). Если всё сделать правильно, то боты за какое-то число поколений (каждое поколение добавляются новички, полученные путём скрещивания выживших или умерших позже всех) должны адаптироваться к любым условиям среды. По сути, в их генах будет хаотически формироваться поведенческая программа, дающая оптимальный вариант для конкретной среды.
Ну, это если рассматривать ботов именно как маленькие программируемые машинки. Если ничего не путаю, ДНК в клетках играет отдалённо похожую роль - коды ДНК описывают белки, рибосомы собирают эти белки, белки делают какую-то работу в клетке, эта работа снаружи клетки наблюдается как поведение клетки. Если описывать не команды поведения, а "параметры", то не будет достаточного разнообразия, я так думаю. Хотя конкретно ГА к параметрам применимо, но мы ведь хотим выработать некое сложное поведение ботов, не так ли?
О, кстати, в описанной модели самое интересное начинается не в генах, а выше - на уровне популяций. Когда ботов много, они могут начать разделяться на виды и кооперироваться. Напоминает колонии одноклеточных, которые в природе тоже объединяются, выживая вместе (и жертвуя собой ради коллектива). Когда-то давно видел такое в одном примере реализации ГА на ютубе...
Ещё небольшая идея - можно рассматривать бота как хранилище подпрограмм, каждая из которых скрещивается индивидуально а-ля хромосома. Подпрограммы могут вызываться из одной главной программы или обращаться друг к другу. Суть подпрограмм в том, что в них могут сформироваться отдельные "навыки" ботов, которые можно зафиксировать, продолжив эволюцию в остальном коде. Тогда если мы дрессируем ботов на определённую задачу и заметили, что они сформировали в одной из подпрограмм подходящее под решение части задачи поведение, мы фиксируем эту подпрограмму, чтобы они не потеряли её из-за последующих скрещиваний и мутаций. Скажем, если некоторые боты научились прятаться в тень от жары, но пока что недостаточно хорошо ищут пропитание.
...так, ладно, я немного запутал, наверное, напишу вкратце:
- бот - исполнитель с набором команд и параметров
- бот погибает, если параметры достигают предела
- из команд бота составляются программы поведения
- первые программки составляются чисто рандомно
- бот исполняет программы в некой среде обитания
- среда имеет параметры вроде еды, освещённости
- сумевшие выжить боты скрещиваются друг с другом
- скрещивание - это склейка половинок программ ботов
- ещё есть мутации - случайные опечатки в программах
...ладно, короч, читайте википедию: https://ru.wikipedia.org/wiki/Генетический_алгоритм
Ну вот, теперь мне жутко захотелось реализовать ГА с ботами на Godot. :C
Аноним 28/04/20 Втр 17:15:40 #218 №664174 
>>664171
Ой, сам того не зная, описал ГП вместо ГА: https://ru.wikipedia.org/wiki/Генетическое_программирование
Но суть та же, ГП - это когда ГА применяется для построения программ (в данном случае - поведения ботов).
Аноним 29/04/20 Срд 00:08:02 #219 №664244 
Весь день сражался с настройкой оружия ближнего боя. Почему-то тело убитого врага не хотело падать рэгдоллом, несмотря на то, что успешно падало, если убивать его из огнестрела. С точки зрения тела вовсе никакой разницы, потому что вызывается одинаковая функция Hurt, которая уже внутри тела вызывает Die, если здоровье опускается до нуля. Только вот поражающая часть ближнего оружия была создана из Area2D, в то время как пули это кинематики. Хотя хз, какая разница, потому что к любому раненому объекту применялось apply_central_impulse и от пули, и от мелии.
В общем, я переделал лезвие в KinematicBody2D, и тела стали падать. Почему сразу так не сделал? Потому что кинематик сталкивался с телом и съезжал со своего места на оружии. Оказалось, это работал move_and_collide, унаследованный от пули. Стоило его отключить, как всё починилось.
Окей. Труп должен выпускать оружие из рук. Но оно почему-то зависало в воздухе. Хотя было риджидбодей. И вот этот баг я так и не смог починить: он починился сам. Хотя до того в течение часа постоянно воспроизводился.
Но ладно. Больше всего времени было убито на коллизии оружия ближнего боя. Они должны были включаться и выключаться по таймерам, но почему-то при зажатой кнопке атаки эти таймеры начинали съезжать. Оказалось, что анимации длятся несколько дольше своей номинальной длятельности. Стоило таймеру задержки до следующего удара выставить время на 0.1с больше, как всё пришло в норму.
Последняя проблема была очень странной. Почему-то персонаж игрока, когда садился, левитировал в полуметре над полом; но если враг умирал, то игрок уже садился на пол нормально. Почему? Потому что коллизия у них одна на двоих. Решение нашлось уже во время написания этого поста: галочка "local_to_scene" под ресурсом коллижен-шейпа. С этой галочкой каждый новый инстанс получал свою уникальную копию ресурса. Вот это, я считаю, важный урок, которым следует поделиться с аноном: в некоторых ситуациях для инстансов нужно ресурсы делать локальными.
Всё. Все активные баги исправлены (про некоторые не упомянул, потому что времени на них почти не потратил). Теперь точно можно дальше двигаться. ИИ пилить. Или подбираемые предметы накодить, типа аптечек.
Аноним 29/04/20 Срд 00:51:04 #220 №664248 
>>664244
> Труп должен выпускать оружие из рук. Но оно почему-то зависало в воздухе. Хотя было риджидбодей. И вот этот баг я так и не смог починить: он починился сам. Хотя до того в течение часа постоянно воспроизводился.
can_sleep?
sleeping?
Проверь эти параметры, по умолчанию физические тела "засыпают" при бездействии.
Аноним 29/04/20 Срд 05:51:44 #221 №664280 
>>664248
Первым делом именно их поковырял. Не помогло.
Аноним 29/04/20 Срд 12:35:02 #222 №664369 
>>664280
Нтиресна, нтиресна. Что же у тебя там нахуеверчено? Показывай код.
Аноним 29/04/20 Срд 17:07:11 #223 №664497 
>>664369
Ствол уже нормально падает.
Тут новая магия творится. Добавляю взрывы. Взрыв - area2d, наносит повреждения бодям по on_Area2D_body_entered и дополнительно делает apply_central_impulse всем попавшим в зону риджидам. Телу особой разницы нет, что именно наносит ему повреждение: если в test() вызывать Die() или даже Hurt(100), оно ведёт себя точно так же, как и при попадании пули: превращается в рэгдолл. Но почему-то взрыв вызывает другой эффект. Тушка замирает и больше не реагирует ни на какие физические воздействия.
Такая же ерунда была, когда я делал холодное оружие на ареа2д. Тогда так и не разобрался, в чём причина, просто заменил на кинематик.
Но теперь причина выяснена. Дело в том, что всё происходящее с телом персонажа обрабатывается через физикс_процесс, а тут происходил вызов через сигналы. Подозреваю, что оно что-то ломало в памяти, после чего тело вообще переставало обрабатываться физическим движком.
Перенёс взрыву код ранения в физикс-процесс, всё равно живёт он доли секунды. Это сработало, умирающие стали нормально превращаться в рэгдоллы.
Аноним 29/04/20 Срд 17:22:23 #224 №664501 
>>664497
>вызывать Die() или даже Hurt(100),
А что они делают? По идее должны выставлять флаги:
wanna_die = true
wanna_hurt = 100
Потом в обработчике _physics_process:
if wanna_die:
_ dead = true
if wanna_hurt > 0:
_ health -= wanna_hurt
_ wanna_hurt = 0
Тогда всё должно быть чотко.
Аноним 29/04/20 Срд 18:24:34 #225 №664529 
Не кидайтесь камнями, но все же - есть желание создать игру на подобии космических рейнджеров т.е пошаговая стратегия/рпг, в связи с чем возник вопрос, насколько логично это делать в годоте (и не имеет ли смысла поискать другой движок), и что приоритетнее изучить - внутренний язык или сразу шарп?
Аноним 29/04/20 Срд 18:27:54 #226 №664531 
>>664529
Пошаговые игры делаются без проблем, язык простой, почти копия питона. Шарп лучше, но документация хуже, экспорт пока хуже, так что одно на одно и выйдет.
Аноним 29/04/20 Срд 18:32:36 #227 №664533 
>>664531
Благодарю, займусь на выходных.
Аноним 29/04/20 Срд 20:13:18 #228 №664554 
>>664531
> Шарп лучше, но документация хуже
Была хуже в прошлом году. Сейчас я например практически всегда в доках вижу обе версии кода.
Аноним 29/04/20 Срд 20:15:38 #229 №664555 
>>664529
Лично я предпочитаю следующий "пайплайн": Сначала делаешь прототип на gdscript, после чего, если имеются неоптимизированные места, переписываешь их на шарпе, а ещё лучше на си.
Аноним 29/04/20 Срд 20:21:20 #230 №664556 
>>664497
> теперь причина выяснена. Дело в том, что всё происходящее с телом персонажа обрабатывается через физикс_процесс, а тут происходил вызов через сигналы. Подозреваю, что оно что-то ломало в памяти, после чего тело вообще переставало обрабатываться физическим движком.
> Перенёс взрыву код ранения в физикс-процесс, всё равно живёт он доли секунды. Это сработало, умирающие стали нормально превращаться в рэгдоллы.
Тебя ещё ждёт интересное открытие, что некоторые вещи с физикой даже в physics_process делать нельзя, а нужно добавлять особую функцию _integrate_forces(Physics2DDirectBodyState state), в которой уже именно со state производить операции.
Аноним 29/04/20 Срд 20:23:16 #231 №664559 
>>664556
>нужно добавлять особую функцию _integrate_forces(Physics2DDirectBodyState state), в которой уже именно со state производить операции
Ну зачем так сложно-то, а?((
Аноним 29/04/20 Срд 20:28:28 #232 №664565 
>>664559
Да разве ж это сложно? Вот получить направление на врага, произведя скалярное умножение векторов, вот это неподъёмная хрень. До сих пор осилить не могу.
Аноним 29/04/20 Срд 20:55:45 #233 №664581 
>>664556
Тащемта у меня в риджидах почти нет кода. А для всех остальных это не актуально.
Аноним 29/04/20 Срд 22:30:20 #234 №664600 
image.png
Как можно подправить тень?
На пике полусфера на поверхности, отбрасывает тень с зазубринами.
Терминатор между тенью и светом на самой полусфере нормально победил, здесь как-то не выходит.
Аноним 29/04/20 Срд 22:36:50 #235 №664603 
>>664600
Если тень не от солнца, то в настройках проекта есть разрешение текстуры теней - чем больше, тем меньше зазубрины.
Аноним 29/04/20 Срд 23:32:58 #236 №664618 
image.png
>>664603
Спасибо. Стало лучше. Хоть и не идеально.
Искал не там изначально.
Аноним 30/04/20 Чтв 01:39:59 #237 №664638 
tileset 32x32 mask.png
Просто оставлю это здесь.
Кидаешь слоем в фотошоп, а сверху рисуешь свои тайлы, согласно этой маске.
Аноним 30/04/20 Чтв 01:58:07 #238 №664641 
>>664638
Имхо, без пояснений не разобраться, что к чему. Я понял только что это обозначения угловых тайлов...
Аноним 30/04/20 Чтв 02:02:31 #239 №664642 
>>664641
32 в названии видишь? Видишь. Сетку 32х32 в своём графическом редакторе установи - и сразу всё увидишь.
Аноним 30/04/20 Чтв 06:19:39 #240 №664663 
Безымянный.png
>>664642
>32 в названии видишь? Видишь. Сетку 32х32 в своём графическом редакторе установи - и сразу всё увидишь.
Об этом я догадался, но не стал сразу делать. Я спрашиваю, что именно рисовать поверх? Переходы между разными видами спрайтов, типа трава/песок и песок/вода? Этот тайлсет только на два материала? Просто для тех, кто ни разу не рисовал тайлсет, как я, это всё вообще тёмный лес. А пиксель-арт - вообще слишком сложен.
Аноним 30/04/20 Чтв 16:45:14 #241 №664775 
>>664663
А потом в годоте по этим серым кубикам выставляешь битовую маску для автотайла в формате 3х3 минимал. И у тебя будет корректный автотайл.
Аноним 30/04/20 Чтв 20:44:04 #242 №664831 
godot bug.png
Годотаны. Помогите с проблемой.
Есть 2Д проект.
В нем ест CanvasLayer. На нем есть TouchScreenButton.

Когда я в скрипте пытаюсь спрятать TouchScreenButton, (с помощью Hide() или SetVisible(false) ) - у меня каждый раз выскакивает ошибка (приложение продолжает работать):
_input: Condition "!is_visible_in_tree()" is true.
(см пикрелейтед)
Если кнопку показать опять то все нормально. Кнопка работает только в видимом состоянии.
При попытке кнопку спрятать она гасится, но в консоли вываливается эта ошибка.
Что с ней можно сделать? Может я как то неправильно наэкранные кнопки прячу и их надо по другому убирать с канваса?
Аноним 30/04/20 Чтв 20:45:29 #243 №664832 
godot bug.png
>>664831
Извиняюсь, не тот пик скинул. Вот правильный.
Аноним 01/05/20 Птн 01:56:13 #244 №664882 
Вопрос по математике.
Есть sqrt(). А как корни других степеней извлекать?
Или через дробные pow()?
Аноним 01/05/20 Птн 05:40:34 #245 №664896 
изображение.png
изображение.png
>>664831
Изучай свой код, у меня всё работает, см. скрин.

>>664882
Сомневаюсь, что в GDScript есть что-то специальное для корней >2, так что да, только через pow().
Но тебе точно нужны эти корни? Просто в играх даже квадратный корень - очень затратная операция...
Аноним 01/05/20 Птн 10:42:21 #246 №664935 
>>664882
Сделай модуль на си, в котором реализуй нужные тебе вычисления и сконпелируй движок со своим модулем.
Аноним 01/05/20 Птн 11:02:40 #247 №664944 
>>664896
>Изучай свой код, у меня всё работает, см. скрин
Блин, не в этом дело. У мея тоже все работает - прячет и показывает кнопку. И приложение продолжает работать нормально без вылетов.
Проблема в том, что при отключении кнопки оно спамит в консоль этим эксепшеном. Даже если это пустая кнопка и она ни к чему не привязана.
Аноним 01/05/20 Птн 11:05:21 #248 №664945 
>>664944
Тебе английским языком, чёрным по белому написано: у тебя кнопка скрыта, но у неё инпут обрабатывается. При скрытии делай ей set_input(false) а при отображении - наоборот.
Аноним 01/05/20 Птн 12:04:45 #249 №664969 
>>664896
>Но тебе точно нужны эти корни? Просто в играх даже квадратный корень - очень затратная операция...
Нужны. Немного сложной математики в движении есть. Про затраты понятно. Но это, думаю, вполне нивелируется тем, что вычисляется значение раз в значительный промежуток времени, в остальных случаях уже готовое расчитанное значение используется.
>>664935
Прототип же.
Аноним 01/05/20 Птн 12:43:21 #250 №664973 
godot.png
Создал panel и ей шейдерный материал, почему она не меняет цвет?
Аноним 01/05/20 Птн 12:59:13 #251 №664977 
>>664969
> Прототип же.
Так о том и речь. нахуй в прототипе заморачиваться с корнями? Юзай дробный пов, как те сразу сказали.
Аноним 01/05/20 Птн 13:00:23 #252 №664978 
>>664973
Потому что тема раскрашивает панель после твоего шейдера. Юзай безтемные контролы, колоррект, например.
Аноним 01/05/20 Птн 13:04:08 #253 №664980 
>>664978
Так там же есть дефолтная тема, он же серым-то рисуется.
Аноним 01/05/20 Птн 13:07:20 #254 №664982 
>>664978
И у колоррект в том числе тоже есть тема.
Аноним 01/05/20 Птн 13:08:36 #255 №664983 
Уууу, да! Я реализовал сложнейший (для меня) алгоритм, при котором есть два набора данных: дефолтный и кастомный, внешний код обращается к менеджеру данных и если искомые данные есть в кастоме - отдаются они, если их нет, ищутся в дефолте и отдаются оттуда, если нет нигде, возвращается либо нуль, либо поданный на вход функции новый образец данных, который записывается в кастомные данные.
Таким образом у нас есть зашитый в игру дефолтный мир, при начале игры объекты активно пишут данные в кастомный словарь, затем при сохранениях этот кастомный словарь сохраняется как сейвфайл, собственно. И восстанавливается при загрузке он же.
Это очень важный этап, а то у меня при сохранениях в файл ебошилось всё подряд: список локаций из дефолтного мира, список персонажей, реплики, триггеры. Всё это не нужно в файлах сохранения, при этом, сохраняется возможность всё таки добавлять и такие данные в файл сохранения, например, если в игру установлен мод, добавляющий локации, эти данные могут быть добавлены. Хотя тут тоже есть над чем подумать, можно же в файл записывать только список модов, а у модов держать свои дефолт-данные, которые так же будут читаться.
Аноним 01/05/20 Птн 13:11:12 #256 №664985 
>>664982
Несомненно. У всех зелёных объектов есть тема.
Аноним 01/05/20 Птн 13:13:49 #257 №664986 
>>664985
Что ты несешь..
Аноним 01/05/20 Птн 14:01:44 #258 №664999 
>>664986
Очевидно он про цвет нод в редакторе, красные - 3д (наследники spatial), синие - 2д (наследники Node2D), фиолетовые - анимация, белые - абстрактные или служебные, а зеленые - наследники Control, и у него действительно появляется поле theme, которого нет у canvasitem от которого он наследуется.
Аноним 01/05/20 Птн 14:58:59 #259 №665021 
>>664986
Когда у движка нет цветовой дифференциации объектов, то нет цели! А когда нет цели - нет будущего!
Аноним 01/05/20 Птн 15:17:25 #260 №665028 
godot.png
>>664999
>>665021
один ответ оху.. лучше другого..
так что значит материал у контролов? как его применять?
Создал я тему у контрола, как выше написали, все равно никаких изменений в применении материала.
Аноним 01/05/20 Птн 15:39:55 #261 №665037 
>>665028
> Создал я тему у контрола, как выше написали
Где тебе выше писали тему создать? Тебе писали заменить панель на колоррект.
Ничего создавать не надо.
Аноним 01/05/20 Птн 16:05:52 #262 №665045 
godot.png
>>665037
Какая разница какой элемент? Ну поменял на колоррект, он рисует Rect цвета, который есть в его свойстве color, материал точно также не применяется.
Аноним 01/05/20 Птн 16:16:35 #263 №665047 
>>664945
>Тебе английским языком, чёрным по белому написано: у тебя кнопка скрыта, но у неё инпут обрабатывается. При скрытии делай ей set_input(false) а при отображении - наоборот.
Не. Нихуя. Я пробовал отрубать все инпуты (и обычный и унхендленые и в дереве) - не помогло.
Знаешь в чем дело было?
Оказалось, надо чтобы кнопки которые мне надо было спрятать, в дереве ноды стояли после той кнопки, по нажатию на которую я их скрывал/показывал и сообщения об ошибке прекратились.
Аноним 01/05/20 Птн 18:14:25 #264 №665067 
>>665045
> материал точно также не применяется
Потому что у тебя материал Spatial, а нужно выставить ему режим CanvasItem.
>>665047
Воистину чудны пути программистьи! А код к самим кнопкам прикреплён? Если да, то рекомендую сделать общий код у парента всех этих кнопок, который будет осуществлять всё управление их поведением.
Аноним 01/05/20 Птн 18:36:37 #265 №665075 
>>665067
Не это просто кнопки которые определенные экшены задают вроде ui_left или ui_up и т.д. Но такая же петрушка была и с полностью пустыми кнопками и с теми на которые я какие-то скрипты вешал.
Я поэкспериментировал по разному. Единственное что влияло на появление ошибки - это положение скрываемой кнопки в дереве относительно кнопки которая выдает сигнал в скрипт в котором прячется нужная кнопка (выше или ниже). Вложенность в другие узлы роли не играет. Скрипт тоже не важен, он может быть прикреплен к любой другой ноде. Дело только в положении кнопки с сигналом.
Не пробовал только еще отключать не через сигнал, а через отдельный экшен, но чет мне влом отдельный ui_ на это дело вешать.
Аноним 01/05/20 Птн 19:00:50 #266 №665080 
godot.png
>>665067
> Потому что у тебя материал Spatial, а нужно выставить ему режим CanvasItem.
все выставлено
Аноним 01/05/20 Птн 20:26:12 #267 №665102 
Анон такой вопрос. Читаю инструкцию к C# в годоте. Там есть вот такое:

public override void _Ready()
{
// This function is called after _enter_tree, but it ensures
// that all children nodes have also entered the Scene Tree,
// and became active.
base._Ready();
}

public override void _Process(float delta)
{
// This function is called every frame.
base._Process(delta);
}

Зачем base. в данном случае нужны?
Аноним 01/05/20 Птн 20:35:40 #268 №665106 
>>665102
Это ООП. Вызов такой же функции у класса, от которого отнаследовались. Не факт что это вообще используется.
Ну например у тебя может быть класс Vehicle: Node, и класс Tank: Vehicle. И ты хочешь чтобы когда создается Vehicle, загружалась моделька шасси. А когда создается Tank, загружалась моделька башни, но при этом чтобы сначала все равно загружалась моделька шасси.
Аноним 01/05/20 Птн 20:43:13 #269 №665111 
>>665106
А разве это не автоматом делаться должно? Ну в смысле по умолчанию же вроде базовый конструктор должен вызываться, не?
А если в этих методах есть другие отличные от базового, то мануале годота о них вообще ни слова.
Аноним 01/05/20 Птн 20:47:42 #270 №665116 
>>665111
Так тут и не конструктор, а функции ready и process.
Аноним 01/05/20 Птн 20:56:47 #271 №665121 
>>665116
Так все таки нужен он или нет?
Я еще полазил по мануалу. Где-то в примерах эти методы приводятся с base. где-то без него. Не пойму логику.
Аноним 01/05/20 Птн 21:02:29 #272 №665124 
>>665121
Ты ведь в курсе, что шарп в годо сыроват еще?
Аноним 01/05/20 Птн 21:03:16 #273 №665125 
>>665121
Дак тебе надо информатику учить, игры делать тебе рано. Пока не поймёшь, как работают вызовы функций и методов - не возвращайся.
Аноним 01/05/20 Птн 21:04:20 #274 №665126 
>>665124
Ты ведь в курсе, что сыровато только сопряжение с редактором? В отдельном ИДЕ это шарп как шарп. Достаточно полноценный для шарпа.
Аноним 01/05/20 Птн 21:05:42 #275 №665128 
>>665121
А хз анон, не проверял. Мое предположение - не нужен, если только ты сам такую логику не закладывал.
Аноним 01/05/20 Птн 21:05:56 #276 №665129 
>>665126
сами биндинги
Аноним 01/05/20 Птн 21:06:12 #277 №665130 
>>665126
Сыроват экспорт на андроид, айфон и особенно веб.
Аноним 01/05/20 Птн 21:31:55 #278 №665133 
>>665130
> андроид
Нинужна. Мабилашобпазванить.
> айфон
Нинужна, фу пидорство.
> и особенно веб
Нинужна. Веб чтоб двачи скроллить.
Аноним 01/05/20 Птн 22:44:04 #279 №665151 
>>665128
> хз анон, не проверял. Мое предположение - не нужен, если только ты сам такую логику не закладывал.
Пока все пробовал без base. делать, вроде бы все работает тип-топ.
>>665124
>Ты ведь в курсе, что шарп в годо сыроват еще?
В курсе. Но пока полет нормальный.
>>665130
>Сыроват экспорт на андроид, айфон и особенно веб.
Я х.з, у меня все нормально. Использую V3.2.2.beta1. Экспорт под веб и андроид работает без проблем. Даже деплой в один клик и туда и туда работает. Яблока у меня нет - проверить не могу.
-----
Аноним 02/05/20 Суб 01:28:30 #280 №665174 
Смотрите, что придумал! У нас есть VisibilityNotifier и нам нужно организовать автоподгрузку уровней (локаций). Мы расставляем эти нотифаеры на домиках деревянных и когда они получают сигнал видимости происходит автоподгрузка внутренностей домика, а когда получают сигнал о невидимости, происходит выгрузка. Таким образом, когда ты подходишь к дверям, за ними уже загружена локация. Как идея?
Аноним 02/05/20 Суб 02:48:06 #281 №665190 
>>665174
Не уверен что будет надежно, отвернулся не вовремя и домик из под ног выгрузился, я бы просто на area делал.
Аноним 02/05/20 Суб 05:02:15 #282 №665200 
godot.png
>>665151
Ну так на ios нет.
Аноним 02/05/20 Суб 11:47:29 #283 №665232 
>>665190
Можно и так, но в любом случае получается, локации будут грузиться даже если ты просто мимо проходил. Как бы этого избежать. Получается, только анимацией долгого, обстоятельного открывания дверей. Во время которой идёт подгрузка.
Аноним 04/05/20 Пнд 08:32:00 #284 №665663 
Годаны, а вам не попадались ли туториалы по 2D-лестницам в годоте? По ladders ещё более-менее нашёл кое-что (но хотелось бы больше и внятнее), а вот stairs - вообще ничего.
Ситуация: герой стоит на полу и может пойти прямо, а может пойти вперёд-вверх по лестнице. А если есть таковая, то вперёд-вниз. А если платформа закончилась, то только по лестнице. А если подпрыгнет с лестницы, то приземляться будет на неё же. Но если сверху платформа, то на платформу. Но если с пола подпрыгнет, то и приземлится на пол.
Крч есть какая-нибудь структурированная инфа по теме?
nb: я очень прошу НЕ рассказывать своё мнение и расписывать мини-тутор прямо в треде. Только ссылки, умоляю.
Аноним 04/05/20 Пнд 14:27:19 #285 №665704 
Если делать на Годоте аналог Террарии, то не будет ли она дико тормозить? Или под Террарию нужно что-то попроще?
Аноним 04/05/20 Пнд 14:59:11 #286 №665715 
>>665704
Из коробки если просто накидать, будет, если оптимизировать и использовать разные трюки с батчингом, шейдерами, то не будет.
Аноним 05/05/20 Втр 00:12:52 #287 №665906 
>>665663
> я очень прошу НЕ рассказывать своё мнение и расписывать мини-тутор прямо в треде. Только ссылки, умоляю.
https://godotengine.org/qa/47794/one-way-collision
https://godotengine.org/article/godot-31-will-get-many-improvements-kinematicbody
Аноним 05/05/20 Втр 11:27:28 #288 №665993 
Снимок экрана от 2020-05-05 15-12-45.png
Снимок экрана от 2020-05-05 15-13-26.png
Снимок экрана от 2020-05-05 15-19-56.png
Народ просвятите за работу освещения, в частности как сделать, чтоб свет не проходил через меши?
Вот первый пик поставил omni light, но при этом все горизонтальные поверхности подсвечены, например пик 2, с другой сотороны стены виден свет. Если включаю тени, то этого не происходит, но тут уже сами тени могут выглядеть как говно, третий пик, я как понимаю, в такм случаи мне нужно будет отдельно заморачиваться над дизайном всех элементов окружения, чтоб они отпрасывали красивую тень? или может есть какие-то более простое выходы из ситуации?
Аноним 05/05/20 Втр 12:24:31 #289 №666005 
stairs.png
>>665906
Прочитал задачу жопой
@
Выдал первое из гугла

Между тем, я так и не придумал и не нагуглил ничего годного. Тредик, давай подумаем вместе. Пикрилейтед - разные виды взаимодействия с лестницами. Односторонней коллизией тут ничего не добиться, хотя, конечно же, она понадобится. В принципе, можно нагородить целую груду кода и пройтись по куче частных случаев. Но я подозреваю, что должно быть какое-то более общее решение, которое лежит настолько на поверхности для людей, плотно знакомых с геймдевом, что им не приходит в голову его обсужить. Или же каждый раз выстраиваются леса из костылей, такой вариант я тоже не исключаю.
В общем. Выкидываем тезис про "только ссылки". Анон, если бы тебе надо было реализовать лестницы, как бы ты это делал в своей игре?
Аноним 05/05/20 Втр 12:45:48 #290 №666010 
>>666005
Делаешь лестницу one-way и на своем отдельном слое коллизий. Цепляешь к лестнице area. От этого area кидаешь сигналы bodyEntered и bodyExited в скрипт который меняет игроку флаг onStairs.
Далее уже в своем обработчике физики в зависимости от инпута, текущего стейта игрока и флага onStairs, включаешь/отключаешь коллизии игрока со слоем лестниц и переводишь его в нужный стейт (walk, walk_on_stairs, fall и т.д.).
Собственно? подобным же образом делается обработка верхних платформ для ladders, когда нужно пролезать вверх/вниз через них. Можешь поискать туториалы на эту тему.
Аноним 05/05/20 Втр 13:04:45 #291 №666017 
>>665993
Увеличь разрешение лайтмапов (UV2 которое генерируется в блендере для модели).
>>666005
> если бы тебе надо было реализовать лестницы, как бы ты это делал в своей игре?
Как он >>666010 сказано идеально. Ни добавить ни убавить.
Аноним 05/05/20 Втр 14:12:26 #292 №666029 
>>665993
Читай доки про свет, грубо говоря у тебя толщина стены меньше какого-то шага сетки, попробуй крутить bias, contact shadows.
Аноним 05/05/20 Втр 14:14:41 #293 №666031 
>>666005
Поскольку то что ты нарисовал невозможно (нельзя одновременно идти по полу и при этом спускаться вниз по лестнице), то надо рассматривать эту систему как железнодорожные стрелки - ты можешь или идти по полу, или спускаться по лестнице. А реализация, как анон выше расписал, видимо. Только надо продумать что если у тебя враги тоже могут так ходить, тогда придется все это раскидать по слоям еще, и на каждом слое может быть свое состояние.
Аноним 05/05/20 Втр 14:48:55 #294 №666050 
>>666031
> рассматривать эту систему как железнодорожные стрелки
Двачую. По умолчанию дорога ведёт по сплошной поверхности (извне), при подходе к развилке появляется подсказка "Press F to" которая переключает на спуск по лестнице. При подходе снизу/изнутри подсказка/операция не требуется.
Аноним 05/05/20 Втр 14:52:01 #295 №666054 
>>666050
Можно и без подсказок, когда удерживаешь ↑↓ в нужной области.
Аноним 05/05/20 Втр 16:02:25 #296 №666074 
>>666054
Ты как будто стримов ТВГ не смотрел: игроки впадают в ступор на самых очевидных моментах. Такшто подсказка нужна. По правилам хорошего тона можешь сделать чекбокс отключения подсказки при первом её появлении.
Аноним 05/05/20 Втр 16:03:34 #297 №666075 
>>666074
>Ты как будто стримов ТВГ не смотрел
Воздержался от такого непотребства.
Аноним 05/05/20 Втр 16:21:12 #298 №666076 
>>666075
... и не понимаешь важных нюансов геймдизайна.
Аноним 05/05/20 Втр 16:28:13 #299 №666077 
>>666076
Ну уж геймдизайну точно не на маньках с двача учиться, лол.
Аноним 05/05/20 Втр 19:06:12 #300 №666167 
Столкнулся с такой вещью как лицензирование. Сейчас нужно публиковать свою игру. Godot использует MIT лицензию, поэтому два вопроса:
1) почему при скачивании редактора движка в виде одного exe файла с ним также не предоставляется копия файла лицензии MIT ?
2) Когда я публикую свою игру, а она у меня тоже состоит из одного запускаемого файла, то мне нужно прикладывать этот файл лицензии или можно распространять в виде одного своего бинарника?
Аноним 05/05/20 Втр 19:29:08 #301 №666174 
image.png
>>666029
>>665993
А не проще, ему на самом деле, просто рэнж этого омнилайта понизить?
Аноним 05/05/20 Втр 19:41:50 #302 №666179 
>>666167
> 1)
Help->About->License.
Аноним 05/05/20 Втр 19:46:18 #303 №666181 
>>666179
Значит я могу в игру встроить также типа gredits пункт и там засунуть лицензию и не распространять дополнительным файлом? MIT это позволяет? Просто там трактовка такая размытая.
Аноним 05/05/20 Втр 19:49:31 #304 №666183 
пиздец, в нем либы под апач лицензией, а она явно говорит распространять с исходными бинарниками два файла
Аноним 05/05/20 Втр 19:53:38 #305 №666184 
>>666017
>Увеличь разрешение лайтмапов (UV2 которое генерируется в блендере для модели).
где можно подробно про это прочитать? я все это дело затеял, что разобраться, я ничего про uv2 не знаю
>>666029
bias это где? я все параметры уже как только не крутил и у света и у материала стены.
>>666174
не понял, как это поможет в моем вопросе?
Аноним 05/05/20 Втр 20:11:15 #306 №666188 
>>666183
Нет, не говорит.
>in at least one of the following places: within a NOTICE text file distributed... or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear.
Аноним 05/05/20 Втр 20:14:36 #307 №666191 
>>666188
https://ru.wikipedia.org/wiki/%D0%9B%D0%B8%D1%86%D0%B5%D0%BD%D0%B7%D0%B8%D1%8F_Apache
Аноним 05/05/20 Втр 20:16:55 #308 №666193 
Опять же большинство этих внутренних либ мне тоже нужно как минимум упомянуть, т.к. я являюсь продуктом от производного
Аноним 05/05/20 Втр 20:20:24 #309 №666197 
>>666191
Я тебе привел текст лицензии.
Аноним 05/05/20 Втр 20:25:10 #310 №666203 
>>666197
http://www.apache.org/licenses/LICENSE-2.0
ну да
только когда я создаю игру, то она уже собрана не с редактором, а с ядром движка и там нет этого доступа к тому, чтобы прочитать лицензии, поэтому нужно самому в игре делать примерно тоже, что в редакторе, но с меньшим количеством либ: апач, мит, либпнг, злиб..
Аноним 05/05/20 Втр 20:35:41 #311 №666207 
>>666203
Судя по всему можно просто хуячить этот файл
https://github.com/godotengine/godot/blob/master/COPYRIGHT.txt
Аноним 05/05/20 Втр 20:40:17 #312 №666209 
>>666207
пиздец.. мне заказчик уже все мозги выебал
Аноним 06/05/20 Срд 05:35:50 #313 №666272 
>>666181
Хули там размытого, все четко написано.
>Note however that the Godot Engine binary that you would distribute with your game is a copy of the "Software" as defined in the license, and you are therefore required to include the copyright notice and license statement somewhere in your documentation.

>The Godot Engine developers consider that a link to this page (godotengine.org/license) in your game documentation or credits would be an acceptable way to satisfy the license terms.
Достаточно линк в на лицензию годота в кридитах игры кинуть и все.
Аноним 06/05/20 Срд 10:41:30 #314 №666288 
>>666272
Видишь ли, мнение разработчиков движка это просто мнение, а есть лицензии, в том числе лицензии тех, чей код разработчики движка позаимствовали.
Аноним 06/05/20 Срд 14:50:36 #315 №666336 
>>666272
А еще в кредитсы надо засунуть часть библиотек, которые он использует и лицензии которых также требуют упоминания от производных продуктов..
Аноним 06/05/20 Срд 14:54:23 #316 №666338 
>>666336
Ну так запихни, в чем проблема? Сделай Ctrl+C, Ctrl+V из справки годота и запихни в свой проект.
Аноним 06/05/20 Срд 15:12:51 #317 №666344 
>>666338
Что ты нервный такой, попей мяты. Я разбираюсь с лицензиями, попутно другие уже не будут наступать на эти же грабли и будут знать, что делать в этой ситуации. Хотя по идее уже в треде должно быть достаточно людей, кто выпускал коммерческий продукт на нем и знает, что там и как правильно.
Аноним 06/05/20 Срд 17:30:53 #318 №666375 
>>658384 (OP)
Кароче, пытался скомпилить движок с https://github.com/perbone/luascript, вроде все ок, создал скрипт но чет не ворк ничерта, скрипт вроде рабочий, но hello world банально не выводит...
windows godot 3.2.1 (пробовал с 3.2)
Аноним 06/05/20 Срд 18:32:17 #319 №666406 
>>666375
По описанию репы, думаю там ничего пока и не работает.
>With this in place it will be possible to start answering engine call backs, like for example, _ready(), _process() etc.
>For now not much is done
Аноним 06/05/20 Срд 18:33:40 #320 №666407 
>>666375
А вот в это больше верится, это же Westnoth
https://github.com/wesnoth/jessenehttps://github.com/wesnoth/jessene
Аноним 07/05/20 Чтв 06:26:02 #321 №666631 
>>666344
>Я разбираюсь с лицензиями
Я вот тут подумал, технически, в лицензировании нужно отталкиваться от требований заказчика/издателя, т.к. это он потом будет использовать/распространять продукт. Такие вещи, по идее еще на стадии т.з. согласовываться должны. А то может он собирается игруху полностью закрытой сделать, а у каких-то компонентов которые ты использовал нужно обязательно открытый код выкладывать. Или наоборот, он захочет полный опенсорц сделать, а у каких-то модулей есть запрет на выкладывание исходников (я кстати с таким столкнулся, хотел к своему проекту прикрутить один модуль диалогов, а потом уже прочитал, что с ним можно делать все, что угодно, кроме выкладывания сорцев в составе проекта, а у меня реп полностью открытый. Хорошо не успел его туда включить).
Поэтому нужно сразу говорить заказчику "Я буду делать проект с тем-то тем-то, лицензии лежат вон там. Пиздуй читать, согласен - делаем, нет - думаем чем заменить". И если по ходу разработки прикручивается какой-то сторонний модуль, то тоже уведомлять об этом.
Аноним 07/05/20 Чтв 07:30:25 #322 №666635 
>>666631
Ну примерно так и было. Заказчик сказал, что хочет такую-то такую-то игру на годоте, чтобы я написал. Лицензия MIT и все дела. Ну я написал, попутно оказалось, что ему нужно, чтобы распространялся строго один файл, т.е. надо как у редактора годо засунуть текст лицензии MIT и то, что игра создавалась на этом движке. А потом оказалось, что у кучи внутренних либ, которые годо использует, есть тоже не с простыми лицензиями и что и всех их тоже надо прикладывать и уведомлять.
Когда есть возможность распространять с кучей файлов - там как выше писали создаешь текстовый файл и все в него вписываешь, но тоже надо не только годо указать, а еще некоторые части, которые под мит, апач, бсд..
Аноним 07/05/20 Чтв 10:40:29 #323 №666682 
>>666406
Спасибо анон, чет не увидел.
Аноним 07/05/20 Чтв 10:41:47 #324 №666683 
>>666407
Не со всем то, здесь получается надо вызывать луа внутри gdscript.
Аноним 07/05/20 Чтв 12:57:39 #325 №666733 
Продублирую вопрос сюда, а то в ньюфаготреде меня уже третий раз с ним динамят походу а здесь вроде более отзывчивые антоши:
Че почитать по созданию ботов? И еще, поясните за эту книгу: Алекс Дж. Шампандар. "Искусственный интеллект в компьютерных играх.", стоит ли ее читать? А то я, блять, уже на 120 странице, а суть даже не начиналась)))))
Аноним 07/05/20 Чтв 13:09:49 #326 №666736 
>>666733
Сколько я ни читал книг по программированию игр, ни одна не принесла мне никакой пользы.
Аноним 07/05/20 Чтв 13:11:39 #327 №666737 
>>666736
Ок, что тогда читать?
Аноним 07/05/20 Чтв 13:17:48 #328 №666739 
>>666737
А я откуда знаю? Я ж говорю - книги читал, никакой пользы не принесло. Следовательно, в теме я нихуя не шарю.
Аноним 07/05/20 Чтв 13:20:03 #329 №666740 
>>666739
Ну ты ващет сказал, что книги по программированию игр, так что я думал, что есть альтернатива... Ладно, проехали.
Аноним 07/05/20 Чтв 15:05:02 #330 №666767 
В CollisionShape2D есть куча опций для всяких форм коллизий. Помимо интуитивных круга, квадрата, капсулы и произвольного многогранника (который, кстати, не имеет удобного интерфейса редактирования) есть ещё всякие линии и лучи, которые вообще хз как работает. В доках про них сплошной сепулькарий, никаких объяснений, как это работает, чем отличается и в каких ситуациях вообще может понадобиться. В гугле я хз как искать, выдаёт только всякие кидсканкоде и другие пособия для начинающих. Упоминание RayShape2D было у чувака с платформером-медвежонком, но и он не разъяснял подробностей, просто пользовался.
Итак, годаны. Где может узнать про все эти формы коллизий и про их применение?
Аноним 07/05/20 Чтв 16:05:04 #331 №666789 
>>666733
>Че почитать по созданию ботов?
Хотел что то посоветовать, но оказалось что сам еще ничего не прочитал и даже в закладках и закачках ничего не нашел. Есть только пара обзорных статей в закладах
https://habr.com/en/post/420219/
https://habr.com/ru/post/173187/
https://habr.com/ru/company/intel/blog/265679/
https://habr.com/ru/company/it-grad/blog/306214/
В общем по моему ограниченному пониманию, есть всякие штуки как поиск пути, там в основном a* (a-star), в том числи и по тайлам, и по навмешу (сетке узлов). Там свои приколы как оптимизировать все это, быстрые эвристики для неточного пути, отсечения в точках схождения, например дверях.
В играх типа шахмат используется min-max, он по очереди пытается сделать лучший ход за одного игрока, потом за другого, до какой-то глубины перебора, фишка в том, что прирост очков для одного игрока является таким же уменьшением очков для второго, поэтому можно его просто вызывать рекурсивно со знаком минус. Оценочная фунция приблизительно считает очки за состояние поля - сколько каких фигур осталось, какие угрозы они создают. Там свои оптимизации, проверять сначала ходы на которые обязательно отвечать, такие как шах.
Дальше, в обычных видеоиграх, как я понимаю в почете GOAP - Goal oriented planning, также используются деревья решений (decision tree), конечные автоматы (FSM, finite-state-machine), конечные автоматы конечных автоматов (вложенные). Некие реализации можно глянуть для годота
https://github.com/RodZill4/godot-goap
https://github.com/godot-addons/godot-behavior-tree-plugin
Слышал есть еще что-то вроде координатора, не помню как называется, идея в том что он раздает приказы юнитам, такое вроде было в старике и в халфе для команд солдат, т.к. если каждый будет думать индивидуально возможны конфликты, а координатор может выдать команды двое налево, двое направо, один прикрывает.
Есть еще такая вещь, как Steering behavior -это типа рулевого, как если бы искуственный интеллект отдал команду переместиться в точку x,y, а steering behavior отвечает за то, как плавно изменить скорость, повернуть на курс и т.д. это касается и движения персонажей, не только техники.
Дальше уже идут нейронные сети, там я еще хуже разбираюсь, но в /pr мне сказали что оно пока не готово. По причине хрен отладишь. Тут примерно то же пишут https://www.quora.com/Are-there-any-video-games-that-use-neural-networks-for-their-AI Идея, думается, такая - на вход нейронке подается то, что она видит - позиции врагов, хитпоинты юнитов, на выходе она выдает аналог нажатий на кнопочки - пойти влево, прожать атаку, в результате это все оценивается функцией оценки, и выигрышное поведение закрепляется, все это проворачивается на десятках тысяч игр самой с собой.
Аноним 07/05/20 Чтв 17:05:04 #332 №666812 
stairs.png
>>666031
>Поскольку то что ты нарисовал невозможно (нельзя одновременно идти по полу и при этом спускаться вниз по лестнице)
Чего блять?
>>666050
>при подходе к развилке появляется подсказка
"Чтобы пройти по лестнице вверх, поднесите левую руку к клавиатуре, поместите средний палец на клавишу W, а затем небольшим усилием надавите на неё до упора."
>>666010
Я тоже думал в таком направлении. Но в конструкции пикрилейтед (а они предполагаются повсеместно) начинается жопа. Потому что неизбежно при спуске происходит area_exited верхней лестницы.
Короче, надо ещё учитывать, на какой именно лестнице стоит персонаж. Так что, видимо, не обойтись простым onStairs, придётся передавать self в параметрах, а при выходе сравнивать.
Аноним 07/05/20 Чтв 17:12:12 #333 №666823 
>>666789
Воу, спасибо, исчерпывающе! За это время в ньюфаготреде я получил ответов: 0. Вопрос >>666733 пока пускай повисит, если вдруг кто посоветует книгу, где вся эта инфа хоть сколько-нибудь систематизирована, ну или мб кому просто есть что добавить по теме
Аноним 07/05/20 Чтв 17:33:39 #334 №666853 
>>666823
Я просто иногда ленюсь чекать ньюфаго тред, там 1000 постов
Аноним 07/05/20 Чтв 18:38:24 #335 №666898 
>>666812
Кажется, я нашёл изящное решение лестниц.
Смотрим коллизии. Если среди них есть объект из слоя stairs, то коллизия с лестницами включается; если нет - выключается. Также коллизия с лестницами включена при нажатой клавише "вверх" при одновременном is_on_floor. В верхней части каждой лестницы есть небольшой участок со слоями коллизии world и stairs, а весь остальной пролёт имеет только слой stairs.
И никаких дополнительных зон с дополнительными событиями. При такой системе, пожалуй, только спуск вниз с ровного пола может быть немного сложнее, но не сильно. И от прыжков на лестницах придётся отказаться, иначе придётся кучу условий нагромождать. Хотя, если опрашивать коллизии только при is_on_floor, то не придётся, зато можно будет перепрыгивать с одной лестницы на другую.
Аноним 07/05/20 Чтв 21:16:14 #336 №666968 
>>666898
Я так полагаю, что при падении, кагда !is_on_floor коллизия тоже включена, чтобы падая, персонаж приземлился на первую попавшуюся лестницу, а не пролетел сквозь неё?
Аноним 07/05/20 Чтв 22:27:54 #337 №666990 
>>666968
Кстати да, хорошая идея - автоматом включать коллизию с лестницами, когда !is_on_floor.
Аноним 07/05/20 Чтв 22:48:25 #338 №666997 
>>666898
>Смотрим коллизии. Если среди них есть объект из слоя stairs, то коллизия с лестницами включается
Ты, наверное, имеешь в виду не коллизии, а просто intersects? Потому что если у тебя не включена коллизия с лестницами, как ты ее поймаешь?
Аноним 07/05/20 Чтв 23:31:24 #339 №667013 
>>666997
Перечитай внимательно и целиком, ответ во втором и третьем предложениях.
Аноним 08/05/20 Птн 11:45:14 #340 №667157 
>>666997
> имеешь в виду не коллизии, а просто intersects?
Сначала происходит collision, затем, если хотя бы одно тело не solid, происходит intersect. В Godot для этого используется Area.
Аноним 08/05/20 Птн 11:52:57 #341 №667158 
https://godotengine.org/article/dev-snapshot-godot-3-2-2-beta-2
Не, ну вы видели? Видели?
Аноним 08/05/20 Птн 12:03:46 #342 №667163 
>>667158
>The new 2D batching is only implemented for the GLES2 renderer
>GLES3 renderer is being deprecated by Vulkan in Godot 4.0
Правильно я решил делать игоры на глес2, невзирая на скудный шейдерпайплайн.
Аноним 08/05/20 Птн 14:03:39 #343 №667223 
>>667157
Перечитай мой вопрос. Если "коллизия с лестницами включается" "если средих них есть объект из слоя stairs", то коллизии со слоем stairs были отключены. Если коллизии со слоем stairs были отключены, откуда коллизия со stairs возьмется в "Смотрим коллизии"?
Аноним 08/05/20 Птн 14:06:42 #344 №667227 
>>667158
Пока сыровата, в анимированной модельке какие-то нераскрашенные части начали торчать, при импорте ассетов редактор падал через раз. Правда я из мастера 3.2 собирал, но это вроде то же самое должно быть.
Аноним 08/05/20 Птн 14:10:18 #345 №667230 
>>667227
> это вроде то же самое должно быть
Ни в коем случае не то же самое. Мастер максимально нестабилен. А по ссылкам в статье - более менее стабильные релизы.
Аноним 08/05/20 Птн 14:13:51 #346 №667232 
>>667230
Мастер 3.2 тега. Как раз вчера собирал, вряд ли там сильно разошлось. Ну могу и бету попробовать конечно.
Аноним OP 08/05/20 Птн 15:05:45 #347 №667247 
>>667232
Если я правильно понял гит вообще и гитхаб в частности (поправьте меня, если ошибаюсь), это система для синхронизации сорцов для программистов. Вот, допустим я программист (хаха, вот это был бы прекол!) и мне требуется работать над проектом в главном офисе, дома, в дополнительном офисе, который в производственном моногородке, куда я езжу с командировками. Конечно, можно возить с собой внешний хдд и не париться, но все программисты делятся на две категории: 1) кто не парится и возит хдд, 2) потерявший кучу исходников, просравший сроки, контракты, обанкротившийся.

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

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

Так вот! Качать мастер чтобы заценить движок это ну такое себе, потому что работоспособность пилящегося ПРЯМО ЩАС проекта гарантировать сложно. Из какой ветви мастер не возьми - это будет нестабильная, модифицируемая наживо версия. Неважно какой ты там тег выбрал.
Аноним 08/05/20 Птн 15:30:10 #348 №667255 
>>667223
Первоначальная коллизия со слоем stairs возьмётся из:
а) Нажатия кнопки
б) Коллизии с телом, которое находится в слое stairs и ещё каком-нибудь. Самая-самая верхняя ступенька - это статик_боди со слоями stairs и world, а весь остальной лестничный пролёт - только world.
Аноним 08/05/20 Птн 16:05:03 #349 №667270 
>>667247
Читай может неправильно выразился, повторюсь я собирал из текущей ветки с тегом 3.2. Не из мастера 4.0. Собирал вчера, и новость про бету вчера, расхождение не больше одного дня. Отдельной ветки для беты мне не поадалось, поэтому я предполагаю, что у меня версия очень близкая к бете.
Аноним 08/05/20 Птн 16:30:02 #350 №667278 
>>667255
Видосик бы на эту тему, чтобы визуально заценить красоту идеи.
Аноним 08/05/20 Птн 18:06:31 #351 №667367 
>>667255
> и ещё каком-нибудь
Да, так пожалуй понятно.
Аноним 08/05/20 Птн 18:53:26 #352 №667445 
14861449657150.jpg
Посоны, что за глюки с AnimationPlayer? Я увел альфа канал спрайта в ноль, но спрайт почему то появляется на мгновение и мигает по ходу дальнейшей анимации. В чем же дело?
Аноним 08/05/20 Птн 19:03:36 #353 №667458 
>>667445
Становишься в начало анимации, создаёшь ключ с желаемым значением прозрачности. Становишься в конец анимации. Дублируешь первый ключ.
После этого добавляешь в середину анимации сколько хочешь ключей и значений.
Аноним 08/05/20 Птн 19:11:58 #354 №667466 
>>667458
Спасибо, заработало теперь нормально. Но почему оно именно так работает?
Аноним 08/05/20 Птн 19:29:10 #355 №667481 
>>667255
>а весь остальной лестничный пролёт - только world
вщи, перепутал, правильно так:
>>а весь остальной лестничный пролёт - только stairs
Аноним 08/05/20 Птн 20:52:25 #356 №667531 
>>667466
Потому что интерполяция. Издержки алгоритма. Алгоритм интерполирует везде, между ключами, которые ты проставил, а там, где ты их не поставил, обычно от начала и/или от конца, там он пытается предугадать, интерполируя между последним ключом и первым ключом.
Аноним OP 09/05/20 Суб 00:07:35 #357 №667604 
Поддержка райдера завезена https://www.youtube.com/watch?v=N4M5eV982n0
Аноним 09/05/20 Суб 13:46:03 #358 №667761 
https://github.com/godotengine/godot-demo-projects/tree/master/audio/generator
Херассе, в годоте теоретически можно написать полноценный звуковой синтезтор. Правда, как пишут, гдскрипт работает слишком медленно, чтобы сделать что-то более-менее сложное практически. Жаль, у меня есть в загашнике идея, чтобы абсолютно все звуки в игре синтезировались "на лету", без записанных семплов.
Аноним 09/05/20 Суб 15:07:23 #359 №667805 
>>667761
Возьми бинды в сишарп любого понравившегося тебе звукового синтезатора и зделой себе класс-адаптер по паттерну адаптера, разумеется, затем остальные скрепты можешь продолжать писать на гдскрипте, просто релиз у тебя будет с дополнительной либой.
Ах да, на иосе соснешь с шарпом, ну, надо подождать.
Аноним 09/05/20 Суб 15:17:26 #360 №667809 
>>667761
Сомневаюсь что скорость гдскрипта в синтезаторе на что то повлияет, ведь всю работу делают микшеры на плюсах и железо.
Аноним 09/05/20 Суб 16:50:35 #361 №667832 
>>667761
>>667805
>>667809
Риалтайм-синтез реалистичных звуков (не примитивных пищалок) вроде оружия, двигателей, погодных явлений и т. д. всё ещё слишком тяжёл для современных процессоров. Хотя частично кое-где применяется. Например, в ГТА5 звуки движков машин синтезируются на лету.
Аноним 09/05/20 Суб 19:55:22 #362 №667985 
>>667832
https://docs.godotengine.org/en/stable/classes/class_audiostreamgenerator.html
Аноним 10/05/20 Вск 00:38:12 #363 №668055 
1589060291468.png
1589060291685.png
Просто оставлю это здесь. Вдруг кому пригодится?
Аноним 10/05/20 Вск 00:41:16 #364 №668056 
>>668055
Прикольно, вроде и очевидно, но никогда не сталкивался.
Аноним 10/05/20 Вск 00:54:09 #365 №668060 
Как можно сделать, чтобы за мешем оставался след, где он прошёл?
Аноним 10/05/20 Вск 00:58:35 #366 №668061 
g2Uik.png
>>668060
Можно лепить спрайты/партикли/декали
Можно деформить террейн
Можно блендить текстуры террейна
Можно рисовать polyboard (не знаю как называется, смотри пик)
Аноним 10/05/20 Вск 11:43:38 #367 №668099 
1589100218068.png
1589100218196.png
>>668055
Сорян, заснул вчера. Вот следующий пост, если кто-то ждал.
Аноним 10/05/20 Вск 11:56:36 #368 №668102 
>>668099
Жалко, что шаблоны не могут содержать выражения, а то можно бы сделать ещё короче.
И в шарпе, кстати даже так не получится сделать. Там жёстко требует константы в кейсах свича.
12 строка не нужна. Это из другого теста.
Аноним 10/05/20 Вск 13:27:45 #369 №668112 
>>667985
Ну так я говорю о реалистичных звуках, а не просто о синусоиде.
Аноним 10/05/20 Вск 15:00:29 #370 №668134 
>>667832
>Риалтайм-синтез реалистичных звуков всё ещё слишком тяжёл для современных процессоров.
Что ты блять несёшь?
1. Уже лет 20 как не слишком тяжёл. А основные алгоритмы так вообще полвека известны.
2. Для создания реалистичных звуков он не предназначен, так что полного реализма добиться нельзя.
Основная причина, почему обычно используются предзаписанные семплы вместо синтеза: это проще и дешевле. Синтез нужен для того, чтобы создавать не существовавшие ранее звуки, которые невозможно издать никаким естественным источником, потому что, если бы такой источник существовал, проще записать его на микрофон и не ебать мозги сложными алгоритмами.
Сравни с анимацией. Её можно делать вручную (синтез) или мокапом (заись). В обоих случаях понадобятся определённые затраты, и мокап тоже придётся потом руками редактировать. Для мультяшности лучше подходит ручная анимация, а для реализма мокап. Можно наборот, но только если это действительно необходимо.
Что касается моторов в GTA5 и, скажем, фортепианного синтезатора Pianoteq, то это исключения ввиду изначальной постановки задачи. В обоих случаях имеет место пересечение двух проблем:
1. Нужно много семплов. Каждый автомобиль имеет несколько передач, свои звуки старта и остановки, автомобилей в игре много. Клавиш у пианины 88 штук, на разных громкостях характер звука меняется.
2. Взаимное влияние и вариативность. Разгон и торможение, смена передач - всё это не так просто между собой соединить. Фортепиано резонирует сложным образом, высокие струны при нажатой клавише улавливают колебания более низких.
В результате получается выбор между двумя стульями: пожертвовать производительностью и получить более гибкую систему или пожертвовать гибкостью и получить более дешёвую систему. И всё это имеет к вопросу "синтез или семплы" мало отношения, потому что в большинстве случаев ответ на него примерно совпадает с "сфотографировать или нарисовать".
Аноним 10/05/20 Вск 15:13:15 #371 №668136 
>>668134
Я очень рад, что у нас в треде есть такие грамотные аноны.
мимо
Аноним 10/05/20 Вск 15:17:18 #372 №668139 
>>668134
Ты абсолютно не разбираешься в том, о чём пишешь.
sageАноним 10/05/20 Вск 15:39:47 #373 №668142 
>>668139
Он разбирается, ты - нет.
Аноним 10/05/20 Вск 17:42:43 #374 №668170 
Пасаны, кто юзал накаму? https://github.com/heroiclabs/nakama-godot
Годный ассет?
Аноним 10/05/20 Вск 17:45:03 #375 №668172 
>>668099
А чем тебе не угодил elif? Я пока вижу в нём одни плюсы против твоей инструкции:
1. Меньше отступов
2. Можно использовать выражения сразу в шаблонах, без промежуточных переменных
Аноним 10/05/20 Вск 17:54:18 #376 №668174 
>>668170
Думаю тут таких богов пока нет. А как ты кстати решаешь вопросы с GDPR и ПД, если у тебя по соцсети логинятся?
Аноним 10/05/20 Вск 18:03:59 #377 №668178 
>>668174
Адвокат мой решает эти вопросики, кабанчиком на созвоне.
Аноним 11/05/20 Пнд 08:36:18 #378 №668311 
>>667247
>мастер ветка является текущей работой этого программиста (или команды их). В этой текущей работе могут быть недоделки, уровня "пойду выпью кофе и допишу, но пока синхронизирую". А если программист хочет опубликовать свою работу, то в момент,
Никогда, слышишь, НИКОГДА, блядь, так не делай. Master не для этого.
Аноним 11/05/20 Пнд 08:40:46 #379 №668313 
>>666812
>Я тоже думал в таком направлении. Но в конструкции пикрилейтед (а они предполагаются повсеместно) начинается жопа. Потому что неизбежно при спуске происходит area_exited верхней лестницы.
>Короче, надо ещё учитывать, на какой именно лестнице стоит персонаж. Так что, видимо, не обойтись простым onStairs, придётся передавать self в параметрах, а при выходе сравнивать.
Два варианта тебе на выбор:
1) Свойство onStairs делай тогда не флагом, а счетчиком. И каждый заход в зону лестницы плюс 1, каждый выход минус 1. Если 0 то чел на лестнице, если больше нуля, то на какой-либо лестнице.
2) Делаешь для правых и левых лестниц разные флаги (onLeftStair и onRightStair) и соответсвенно разные стейты для них в стейт-машине игрока. Да, это ведет к дублированию кода, но может оказаться проще в реализации.
Аноним 11/05/20 Пнд 08:41:34 #380 №668314 
>>668313
>сли 0 то чел на лестнице, если больше нуля, то на какой-либо лестнице.
быстрофикс.
Если 0, то чел НЕ на лестнице...
Аноним 11/05/20 Пнд 12:46:43 #381 №668338 
>>668311
Я так не делаю! Но 90% блядь софта который я качал с гитхаба сорцами с мастера и пытался собрать - был неработоспособен! А работоспособны обычно сорцы, выложенные в релизах.
Аноним 11/05/20 Пнд 12:50:47 #382 №668340 
>>668313
>>668314
Удвачиваю.
Я так делал. Правда у меня были модульно-приставные лестницы, а не маршевые, как у анона.
Аноним 11/05/20 Пнд 12:54:37 #383 №668341 
Долбаные риджиды так и норовят проснуться.
Сделал сцену, в которой к RigidBody2D добавляются всякие полезные мелочи типа звука удара, таймера самоуничтожения и прочие.
Расставил по сцене кучу таких вот тел, проставил им всем галки "sleeping". Но эти гады всё равно просыпаются сами по себе. Ударил по одному ящику, а проснулся другой; иногда они сами по себе дёргаются, если ударить какой-то посторонний предмет. Я очень подозреваю, что виноваты общие ресурсы, не захотевшие сделаться local_to_scene. Поискал, нашёл соответствующую галку для скрипта. Не помогло. Коллизиям проставил галки, тоже не помогло. Я подозреваю, что где-то в самом риджидбоди надо искать. Но хз где, глазами по двадцать раз каждый пиксель просмотрел. Чего я не знаю? Где мог не посмотреть? Где-то скрыта какая-то не вполне очевидная опция?
Аноним 11/05/20 Пнд 13:07:34 #384 №668345 
>>668341
Судя по посту, у тебя какие-то неудачные решения в архитектуре проекта были предприняты. Подозреваю, у тебя очень большая вложенность ресурсов друг в друга с неконтролируемыми тобой взаимопересечениями, при которых, скажем, у одного куба оказывается коллайдер второго куба, например.

Что с этим делать? Возьми карандаш и бумагу и нарисуй схему своей сцены так, как ты это видишь. Затем открывай субсцены в редакторе и сверяй со своим листком на соответствие.
Аноним 11/05/20 Пнд 13:22:56 #385 №668353 
>>668313
Зачем это всё? Нашлось же простое работающее решение: >>666898
Аноним 11/05/20 Пнд 13:30:56 #386 №668355 
>>668353
На каждое простое решение может найтись ещё более простое.
Аноним 11/05/20 Пнд 13:35:03 #387 №668357 
>>668355
Не вижу более простого, вижу костыли.
Аноним 11/05/20 Пнд 14:14:37 #388 №668364 
>>668353
>Зачем это всё? Нашлось же простое работающее решение:
>>666898

Может быть. Но вот это:
>Смотрим коллизии. Если среди них есть объект из слоя stairs

мне кажется не сильно продуктивным. Если я правильно понял, то тебе придется дрочить проверку коллизий с лестницами каждый игровой цикл, чтобы понимать где игрок находится. В случае с area, твой игрок просто получает сообщения в момент выхода/входа в зону лестницы, а дальше ты уже работаешь с полями своего объекта-игрока.
Аноним 11/05/20 Пнд 15:02:31 #389 №668372 
>>658384 (OP)
Анончики. Можно ли как нибудь в проекте получить доступ к значению дата/время когда был сделан билд проекта?
Аноним 11/05/20 Пнд 15:31:32 #390 №668374 
>>668372
Никогда не интересовался. Но скорре всего ты можешь просто получить доступ к файлу PCK и узнать время его создания, если в АПИ не найдётся функционала. Но вообще тебе зачем? Моды? Сетевая синхронизация версий клиентов и сервера?
Аноним 11/05/20 Пнд 15:33:55 #391 №668376 
>>668374
> просто получить доступ к файлу PCK и узнать время его создания
Вот что нашлось
http://docs.godotengine.org/en/3.2/classes/class_file.html#class-file-method-get-modified-time
Аноним 11/05/20 Пнд 15:55:58 #392 №668382 
>>668372
В крайнем случае ты можешь сам писать в какие-то ресурсы дату и считывать ее.
Аноним 11/05/20 Пнд 16:26:22 #393 №668393 
>>662679
Ёптумать, его ещё не пофиксили?
Аноним 11/05/20 Пнд 17:57:59 #394 №668429 
Всё работало нормально, как вдруг...
Корень сцены AnimatedSprite по имени Door, в нём StaticBody2D по имени Body.Не наоборот, чтобы без редактирования потомков можно было легко поменять текстуру двери. В скрипте к спрайту в разных местах есть обращение к $Body. И почему-то он его не хочет видеть, говорит, что нет такого:
var B = $Body
print(B)
#выводит: null
При этом Body я не вручную писал, а выковырял из всплывающей подсказки, которая возникла после написания $. Через get_node тоже не видит. Скрипт точно прикреплён к Door, Door точно корень.
Штобля? Как это вообще? Почему в других нодах нормально работает? Где вообще тут можно накосячить?
Аноним 12/05/20 Втр 05:20:53 #395 №668536 
>>668374
>Но вообще тебе зачем? Моды? Сетевая синхронизация версий клиентов и сервера?
Помечать билды для тестеров.
Сейчас я просто на экран вывожу label в который руками прописываю версию и дату создания билда.
Хотелось бы, чтобы либо эта дата сама где-то фиксировалась при экспорте проекта, либо можно было как нибудь получить доступ к хэшу текущего коммита в репозитории проекта.
Аноним 12/05/20 Втр 07:07:28 #396 №668543 
2.gif
>>668372
>>668374
>>668382
Вобщем, сделал пока так
создал батник stamp.bat в корне который пишет в файл res://data/stamp.txt, дату, время и инфу из репа по hg id (батник и текстовик записал в игнор в проекте)
В проекте кинул на канвас label в которой в _Ready() прописал простой скрипт, который во время запуска при наличии в ресурсах stamp.txt помещает инфу из него в label.text.
Теперь перед экспортом проекта просто запускаю батник и у меня в билде выводится нужная инфа.
Пример на пике.
В будущем когда в годоте починят экспорт проекта из командной строки, можно будет все одним нажатием делать.
Аноним 12/05/20 Втр 13:07:14 #397 №668596 
>>668543
А чем не устраивает делать то же самое из кода в проекте?
Просто нравится батники вызывать?
> кинул на канвас label в которой в _Ready() прописал простой скрипт, который во время запуска при наличии в ресурсах stamp.txt помещает инфу из него в label.text
Можно ведь сделать проще:
> кинул на канвас label в которой в _Ready() прописал простой скрипт, который во время запуска помещает инфу из репа по hg id в label.text
Аноним 12/05/20 Втр 13:32:09 #398 №668603 
>>668596
>во время запуска помещает инфу из репа по hg id в label.text
1) Запускать из игры какие-то сторонние приложения - это крайне плохо. За такое по лицу бьют. Плюс, подозреваю, половина антивирусов будет матом орать на подобные телодвижения.
Может быть это можно сделать в виде плагина к редактору, который бы перед экспортом получал информацию, но я пока не нашел как такое сделать.
2) У тестеров нету репозитория, откуда тогда игра будет инфу брать, когда она построена. А даже если и есть, то реп может быть совсем на другой ветке открыт и т.д.
Аноним 12/05/20 Втр 13:42:35 #399 №668605 
>>668603
Причём тут сторонние приложения? Получить инфу из репа - это обычный веб-запрос. За такое только брандмауер разрешение на сеть запросит.
Аноним 12/05/20 Втр 13:43:28 #400 №668606 
>>668605
Учитывая современные системы защиты от ператов типа денувы, игроки не удивятся запросу на сеть.
Аноним 12/05/20 Втр 14:30:59 #401 №668616 
>>668605
>Причём тут сторонние приложения? Получить инфу из репа - это обычный веб-запрос. За такое только брандмауер разрешение на сеть запросит.
1) Реп закрыт о тех кто будет запускать приложение.
2) Даже если есть доступ, откуда приложение будет знать из какой ветки репозитория я его собирал.
3) Нахер мне еще своему приложению доступ в сеть давать если он ему объективно не нужен.
>>668606
>Учитывая современные системы защиты от ператов типа денувы, игроки не удивятся запросу на сеть.
Игроки играющие в игры с активной денувой и анальному зонду в своей заднице не удивятся.
Аноним 12/05/20 Втр 14:40:57 #402 №668618 
>>668616
> Игроки играющие в игры с активной денувой
Очень странно слышать пиратско-воровские с примесью шапочки из фольги речи от сторонника опенсорца. Стапэ. А с чего это я решил, что он сторонник опенсорца?
Аноним 12/05/20 Втр 14:44:06 #403 №668619 
>>668525
Вполне норм. Простой, удобный двиг, дающий знания обо всех современных фишках и тенденциях геймдева. Даже если захочешь уйти - время, потраченное на изучение не пройдёт впустую, ибо в Годо не используется ни единого вендорлока, все данные ты сможешь использовать в открытом виде и при желании забрать их с собой на другие платформы.
Аноним 12/05/20 Втр 14:51:54 #404 №668620 
>>668615
Репорт.
Аноним 12/05/20 Втр 15:26:05 #405 №668625 
>>668618
>Очень странно слышать пиратско-воровские с примесью шапочки из фольги речи от сторонника опенсорца. Стапэ.
Ничего воровского. Денува (и прочие подобные защиты, вроде старфорса) такая срань, что ну его нахуй. Я принципиально не покупаю и даже не пирачу игры с такими защитами, идут они лесом.

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

Аноним 12/05/20 Втр 15:35:59 #406 №668628 
Кто-нибудь делал что-нибудь типа гауссова размытия годотскими шейдерами? Всё, что я нагуглил, не работает в актуальной версии.
Аноним 12/05/20 Втр 16:06:50 #407 №668638 
>>668628
> Всё, что я нагуглил, не работает в актуальной версии.
Там вроде уже есть встроенный? Не?
Аноним 12/05/20 Втр 16:21:58 #408 №668642 
1589289717754.png
>>668628
> Всё, что я нагуглил, не работает в актуальной версии.
Плохо гуглил.
1. https://www.google.com/search?q=godot+gaussian+shader
2. https://godotforums.org/discussion/20506/a-good-blur-shader
3. https://github.com/godotengine/godot-demo-projects/blob/master/2d/screen_space_shaders/shaders/blur.shader
Аноним 12/05/20 Втр 17:18:12 #409 №668660 
>>668642
>textureLod(SCREEN_TEXTURE, SCREEN_UV, amount)
Не работает на версиях новее 3.0.
Аноним 12/05/20 Втр 17:22:11 #410 №668664 
>>668660
Ты что-то путаешь.
Аноним 12/05/20 Втр 17:24:49 #411 №668666 
>>668664
Сам попробуй.
Аноним 12/05/20 Втр 17:55:53 #412 №668678 
1443983127386.png
>>668666
Попробовал, оф. демо, все работает в GLES3. Исходя из того что пишут, в GLES2 да, не будет работать, потому что там не строят автоматом мипмапы, поэтому при чтении через textureLod возвращается только фулл разрешение.
Аноним 12/05/20 Втр 18:31:04 #413 №668684 
>>668678
Ну вот. В любом случае, данный метод немного читерский.
Аноним 12/05/20 Втр 19:22:48 #414 №668689 
>>668684
Для глес2 открывай википедию, бери формулу и ебошь программный блюр. Медленный и велосипедный.
Зачем тебе блюр в глес2? Глес2 не для красивостей выбирают, а для ублажения нищенок со встройкой вместо видеокарты
Аноним 13/05/20 Срд 23:48:49 #415 №669152 
Годаны, а слышно что-нибудь по вопросу разделения окна редактора на два? Хотелось бы редактор шейдера держать на одном мониторе, а вьюпорт с итоговым результатом видеть на другом.
Аноним 14/05/20 Чтв 22:59:12 #416 №669527 
Здарова, бандиты.
Я же правильно понимаю, что для того, чтобы хуйнуть в свой проект модуль для андройда мне этот самый модуль нужно сначала в апкашку скомпилить? И для этого придется наебнуть все, что написано в доках https://docs.godotengine.org/en/stable/development/compiling/compiling_for_android.html ?
Есть более халявные варианты, вообще нет желания ебаться с окружением и настройкой десятка пекедж билдеров и прочей хуйни
Аноним 14/05/20 Чтв 23:15:58 #417 №669540 
внешний редактор для годот скрипт
Аноним 14/05/20 Чтв 23:20:20 #418 №669543 
>>669540
Для райдера недавно сделали. Купи райдер. Поддержи отечественного производителя.
>>669527
В четвёрке вроде сделают попроще это всё. А в 3.2 придётся поебаться, да.
Аноним 14/05/20 Чтв 23:24:02 #419 №669545 
>>669543
>райдер
это шарп
Аноним 14/05/20 Чтв 23:30:20 #420 №669547 
>>669545
Нет, не шарп, я тебе повторяю, плагин годота завозит в райдер гдскрипт с полной поддержкой подсветки, плюс запуск проекта прямо из райдера в годоте, используя годот, как интерпретатор.
Аноним 15/05/20 Птн 00:16:48 #421 №669562 
>>669540
В vs code есть плагин, про качество хз не пользовался.
Аноним 15/05/20 Птн 00:19:00 #422 №669564 
>>669543
В 3.2.2 уже в бете есть. Но там все равно же плагин кому то собирать придется.
Аноним 15/05/20 Птн 00:27:56 #423 №669565 
>>669527
Там ничего особо сложного нет, я недавно винду переставлял и за пол дня все вернул. По памяти там всего-то надо: python (самый свежий сойдет), scons (pip install scons), java (кошерная с AdoptOpenJDK.net), android sdk и ndk (далее-далее-готово), плюсовый компилятор вроде в ndk идет. Потом берешь за основу этот батник https://gist.github.com/Calinou/44edbd5d9c4a2ac0dbc8f165b8b7f0ce есть такой же под линь, меняешь пути, дописываешь флаги из твоей ссылки если надо и все.
Аноним 15/05/20 Птн 00:54:37 #424 №669571 
>>669152
Пока такого нет, в 4.0 вроде уже сделано. В 3.х я слышал можно открыть просто два годота рядом, но увы картинка будет обновляться только есть жать сохранить, и альт-табаться. Можно конечно это автоматизировать хоть через autoit, но такое себе.
Аноним 16/05/20 Суб 13:24:38 #425 №669959 
>>668429
Продолжаю ковыряться.
Теперь Sprite. Пытаюсь к спрайту прикрепить скрипт с какими-то действиями. Пишу $что-нибудь и получаю ошибку: метод get_node() не объявлен в этом классе.
Походу, в этом проблема. Спрайты (и их анимированные наследники) по какой-то причине не могут иметь здоровое потомство. Придётся городить огород из системы Node2D/Sprite
Аноним 16/05/20 Суб 13:33:54 #426 №669961 
>>669959
> получаю ошибку: метод get_node() не объявлен в этом классе
Что у тебя написано в первой строке файла после слова extends?
Аноним 16/05/20 Суб 13:35:52 #427 №669962 
>>669959
> Спрайты (и их анимированные наследники) по какой-то причине не могут иметь здоровое потомство.
Почему-то у меня могут. А что с тобой не так?
Аноним 16/05/20 Суб 14:00:18 #428 №669977 
>>669961
>Что у тебя написано в первой строке файла после слова extends?
У меня такая вот конструкция:

foo.gd:
extends Sprite
class_name foo

bar.gd:
extends foo

И вот как раз bar уже не имеет метода get_node()
Сделал всё то же самое, но не от спрайта, а от Node2D - полёт нормальный.
Аноним 16/05/20 Суб 17:20:17 #429 №670066 
Неожиданная проблема и решение.
foo.gd:
var My_Array: PoolIntArray
...
var.gd:
foo.My_Array.append(12345)

В массив ничего не добавляется. Я хз почему и куда пишутся эти данные, ошибки никакой не выдаёт. Решение:
foo.gd:
var My_Array: PoolIntArray
func My_Append(value: int):
My_Array.append(value)
...
var.gd:
foo.My_Append(12345)

Теперь массив заполняется корректно.
В принципе, наверное, так всё равно лучше и типобезопаснее.
Кто понимает матчасть, разъясните, почему оно именно так работает.
Аноним 16/05/20 Суб 22:05:28 #430 №670178 
>>670066
Массивы передаются по значению в гдскрипте. поэтому да, при обращении к массиву через класс, класс выдаёт копию массива, в которую ты что-то добавляешь, после чего эта копия исчезает в недрах оперативки.
Аноним 16/05/20 Суб 22:07:18 #431 №670179 
1589656037578.png
1589656037710.png
1589656037742.png
1589656037752.png
>>669977
Перепроверяй свой код. Ты что-то напортачил, ибо наследование работает, как ожидалось:
Аноним 16/05/20 Суб 23:18:31 #432 №670203 
1589660310766.png
>>670178
Вроде в доках написано массивы по ссылке.
Аноним 17/05/20 Вск 03:55:00 #433 №670233 
2020-05-17 035407-Godot.png
Нахуй он мне показывает cnd с информацией, доступной в консольке самого годота?
Аноним 17/05/20 Вск 04:10:54 #434 №670235 
>>670233
Для дебага в случае чего.
Аноним 17/05/20 Вск 04:17:13 #435 №670237 
>>670233
Это для взрослых, не лезь.
Аноним 17/05/20 Вск 04:25:45 #436 №670239 
>>670237
Это для девелоперов, а не пользователей и нахуй не нужно в релизе включенное по дефолту
Аноним 17/05/20 Вск 04:29:10 #437 №670241 
>>670239
А с чего ты взял что это есть в релизном?
Аноним 17/05/20 Вск 04:50:54 #438 №670248 
>>670241
А единственная версия на страницы скачивания - не релиз, хах?
Аноним 17/05/20 Вск 04:54:13 #439 №670249 
>>670248
Это редактор, ту ту ру. Релиз - в темплейтах экспорта.
Аноним 17/05/20 Вск 04:55:47 #440 №670250 
med1490453308image.jpg
>>670249
Аноним 17/05/20 Вск 15:18:22 #441 №670332 
>>668642
Я юзаю вот такой для глес2, но он медленный как сука. Мобилочки не вывозят. https://pastebin.com/uXjK1pca

Если тебе это нужно для окна паузы, где никаких визуальных изменений не будет происходить и шейдер тебе не нужен в риалтайме, то можешь его запускать таким костылём всего на пару фреймов:
Здесь на сцене тупо друг над другом стоят ColorRect (на котором и запущен шейдер) и пустой TextureRect, которые друг друга заменяют.

func show_menu():
self.visible=true #Показать меню
yield(get_tree(), "idle_frame")
yield(get_tree(), "idle_frame")
var pic = get_viewport().get_texture().get_data()
pic.flip_y() #Нужно т.к. вьюпорт возвращается перевёрнутым
var img = ImageTexture.new()
img.create_from_image(pic)
$TextureRect.texture=img
$TextureRect.visible=true
$ColorRect.visible=false

Мб кто-то мне подскажет, как это сделать лучше, а не этим костылём. Буду благодарен
Аноним 17/05/20 Вск 15:19:49 #442 №670334 
>>670332
Быстрофикс: \t = таб. Забыл, что двачи не способны в табы
Аноним 17/05/20 Вск 16:34:18 #443 №670352 
>>670332
> но он медленный как сука
> как это сделать лучше
Чисто с дивана предполагаю, что циклы можно попробовать заменить индусским кодом (копипащенными строчками с магическими числами), там всего по 8 раз нужно все направления вокруг пиксела обработать. ЕМНИП, циклы в ЖЛШЛ тормозные.
Аноним 17/05/20 Вск 17:10:15 #444 №670364 
А есть какое-то движковое решение для тороидных поверхностей? В смысле, вот хочу я, чтобы объекты, уходящие за левый край экрана, появлялись справа, пишу им:
position.x = wrapf(position.x, 0, 1000)
и получаю на границах перехода лютые мерцания объектов на границе плюс глючащую физику, которая не знает, что ей надо детектить коллизии с другого конца игрового мира.
Есть какая-то более-менее простая опция, которая бы решала эти проблемы и другие, связанные с тороидным миром, о которых я ещё не знаю? Или надо писать свои костыли?
Аноним 17/05/20 Вск 18:21:54 #445 №670388 
>>670364
> Есть какая-то более-менее простая опция
Есть. Зацикливание перемещения физических объектов делается обращением к их физическому состоянию в колбэке _integrate_forces() и вообще обращения к физике лучше делать там. Тогда всё будет фрейм к фрейму, без мерцаний и подёргиваний.
Аноним 17/05/20 Вск 18:27:19 #446 №670392 
>>670388
Чего блять? Ты вообще понял, о чём речь?
Аноним 17/05/20 Вск 18:53:42 #447 №670411 
>>670392
Походу не понял. Обесни ещё раз?
Аноним 17/05/20 Вск 22:06:04 #448 №670477 
toroid.png
cylinder.png
>>670411
Пик 1. Что будет, если a>b? Круг докатится до правого края экрана, телепортируется на левый край, обнаружит себя глубоко погружённым в квадрат, вытолкнется за левый край, телепортируется снова в правую часть. Время, вектор и точка столкновения будут совсем не такими, какими они были бы на бесшовном цилиндре. Плюс отрисовка: круг на один кадр мигнёт слева и снова окажется справа.
Пик 2. Квадрат и зелёный круг сильно тяжелее серого. И вот зелёный утолкал серого настолько, что стало b<a. Серый круг каждый кадр телепортируется через границу экрана и проникает в коллизию то с квадратом, то с зелёным кругом. Полноценно передать импульс от двух столкновений он не может, потому что эти два столкновения никогда не происходят одновременно. На бесшовном цилиндре серый круг бы в какой-то момент получил две коллизии одновременно и напрямую передал импульс от квадрата в зелёный круг.
Аноним 17/05/20 Вск 22:58:30 #449 №670487 
>>670364
Можно использовать три камеры с углом обзора в 120 градусов по горизонтали и сшивать их в одно изображение. Не знаю, может ли годот в такое.
Аноним 17/05/20 Вск 23:20:03 #450 №670490 
>>670477
Для этого нужно писать свой собственный интегратор физических сил. Гугли custom integrator.
Алсо, оффтоп, почему такие пространства называются торроидными? Тор это же просто бублик. А описываемое тобой пространство сферическое вроде?
Аноним 17/05/20 Вск 23:52:22 #451 №670505 
>>670487
То есть надо не писать собственную физику. А просто засунуть игровой мир в обычный тор в обычном пространстве и спроецировать изображение с камер(ы) на плоскость.
Аноним 18/05/20 Пнд 00:06:54 #452 №670514 
1585940637773.jpg
>>670490
> почему такие пространства называются торроидными?
Если представить себе карту мира как в первой Циве, то она не натягивается на сферу, но натягивается на тор (это когда закольцованы и верх с низом, и лево с право). У сферы верх и низ должны схлопываться в одну точку. мимо
Аноним 18/05/20 Пнд 00:17:46 #453 №670518 
>>670490
Если сшито по одной координате, то цилиндр. Если по двум - тор. Принципиальная разница в том, что на сфере параллельные прямые могут пересекаться (меридианы на полюсах, например), а на торе нет. Сферическую поверхность в 2д я вообще хз как симулировать. Хотя было б круто.
Гугли какого-нибудь Савватеева про топологию, он понятно объясняет. И ещё физики в лекциях про устройство вселенной любят эту тему рассказывать.
>свой собственный интегратор физических сил
Сложна. Погуглю, но чёт кажется, что такая задача мне не по зубам. Придётся от цилиндра отказаться.

>>670505
Боюсь, что такую конструкцию из костылей даже бубном 80лвла не выстроить.
Аноним 18/05/20 Пнд 00:45:58 #454 №670525 
>>670477
Есть одна идея, не факт что тебе подойдет. Использовалась в Portal. Заключается в том, что сбоку карта продолжается на какое-то расстояние, и там размещаются "копии" объектов. Но да, думаю все равно придется возиться с integrate force. Потому что копия не имеет самостоятельной физики.
Аноним 18/05/20 Пнд 04:01:51 #455 №670537 
>>670525
Собсно да. Вот какое найдено решение в гугле: https://steemit.com/utopian-io/@sp33dy/tutorial-godot-engine-v3-gdscript-generic-screen-wrapping-sprite
С физикой всё будет осложняться необходимостью копировать объекты. А учитывая, что они могут быть интерактивные, могут взаимодействовать между собой и даже соединяться пружинами... В общем, раз нету нативного решения, придётся забить, дабы не строить костыльных замков.
Хотя я тут подумал, что можно было бы попозже поиграться в 3Д с порталами, как в первом Prey. В ситуации, когда не нужно продвинутое взаимодействие между предметами, можно даже и немножко копировать их на входе в портал. А обстановку позади порталов рисовать шейдерами.
Аноним 18/05/20 Пнд 14:32:25 #456 №670647 
>>670537
> раз нету нативного решения
Как будто где-то есть.
Аноним 18/05/20 Пнд 15:16:18 #457 №670670 
>>670518
Ну так с физикой ещё большие костыли. Не знаю, есть ли такое в годоте, но вот в Панда 3д я такое делал с помощью класса NonlinearImager, который склеивает изображения с разных камер. Можно отобразить на плоскости сферическую проекцию, полусферическую, цилиндрическую. И шейдер сверху, чтобы корректировать искажения.
Аноним 18/05/20 Пнд 21:44:39 #458 №670942 
>>670670
С отображением проекций и в годоте проблемы нет. Но анону нужна именно корректно работающая физика. По факту - портальная, где порталы это края экрана. А на углах экрана вообще должен корректно работать двойной портал, считывающий коллизии и горизонтально и вертикально. Вот это задачка так задачка!
Аноним 18/05/20 Пнд 22:08:06 #459 №670948 
>>670942
ИЧСХ у старых игр с таким поведением никаких особых проблем нет. практически вся аркадная классика выстроена на цилиндрических мирах. Сразу приходит на ум Mario Bros, например, который ещё не Super.
Аноним 18/05/20 Пнд 22:12:01 #460 №670950 
>>670942
Так при склеивании проекций с трёх камер объект с правого края экрана автоматически появляется на левом, и наоборот. Правда, немного размазывается у нулевых координат, но этом можно просто отсечь. Не был бы ты анонимом с двача, продемонстрировал бы.
Аноним 18/05/20 Пнд 23:11:10 #461 №670959 
>>670948
> у старых игр с таким поведением никаких особых проблем нет
Так там, справедливости ради, и физики полноценной не было.
>>670950
> Не был бы ты анонимом с двача, продемонстрировал бы.
Лол, таки да. Щито поделать.
Аноним 18/05/20 Пнд 23:21:47 #462 №670960 
>>670950
> продемонстрировал бы
Зачем велосипедить то, что уже продемонстрировано на ютубе? Вот, с 13 минуты смотри: https://www.youtube.com/watch?v=Eu5sBPqE6Ag
Аноним 19/05/20 Втр 00:18:47 #463 №670969 
Как это вообще возможно?
1. var foo = $RayCast2D
2. if foo != null:
3. _ if foo.is_colliding():
4. _ _ var collider = foo.get_collider()
5. _ _ if collider.has_method("bar"):
А дальше не важно, потому что дальше мы вываливаемся с ошибкой, что, дескать, у коллайдера нету метода has_method(), потому что коллайдер у нас null. Как так? Как вообще можно оказаться на 5 строчке, если мы прошли через 3, и там точно-точно is_colliding, то есть коллайдер точно-точно не null, а вполне себе Object, а значит и has_method() у него обязан быть.
Где можно было накосячить так, чтобы данная ситуация вообще сложилась? И как это исправить?
Аноним 19/05/20 Втр 01:03:42 #464 №670973 
>>670969
> И как это исправить?
onready var foo = $RayCast2D
Аноним 19/05/20 Втр 01:49:59 #465 №670981 
>>670973
Мы находимся в теле функции, так что всё давно уже реди. Вне тела редактор не даст запустить без onready в таком объявлении. И вообще, данная строчка чисто для твоего понимания, что речь идёт про рейкаст.
И да, строка 2. Если foo не инициализировался, то дальше программа не пойдёт. А даже если и пойдёт, то упадёт на строке 3, скажет, мол, нет такого метода id_colliding().
Аноним 19/05/20 Втр 02:36:07 #466 №670986 
>>670981
У тебя там реально фу/бар или нормальные имена? Потому что вдруго у тебя там ещё где то в проекте такие же имена и они конфликтуют на локальном и глобальном уровне?

Чисто предположение с дивана.

Алсо, в любом случае нужно больше деталей, больше кода. Совершенно непонятно, что там у тебя творится. Воспроизводится ли проблема на пустом проекте?
Аноним 19/05/20 Втр 03:49:44 #467 №670992 
>>670986
Нормальные имена. Всё, кроме первой строки, переписано из проекта с заменой имён. Вкидывать в тред весь проект не буду, он довольно объёмный.
Одинаковые имена я даю в двух случаях:
1. Это константа, которую по какой-то причине я не хочу переносить в синглтон, поэтому добавляю её в каждый скрипт. Например, потому что этого синглтона нет.
2. Это имя скопипащено из соседнего скрипта вместе со всем, что оно делает.
Оба варианта не про здесь, потому что такой вот лучик у меня только в одной сцене. Имена уникальные. Но инстансов может быть много.
В пустом проекте оно не воспроизводится. Оно и в наполненном-то случается далеко не всегда, только когда инстансов много. Все скрипты у них local_to_scene, есичо.
Да и вообще. В том как раз и состоит мой вопрос. Что надо сделать, чтобы такое вообще произошло? Как воспроизвести это в пустом проекте?
Аноним 19/05/20 Втр 06:10:03 #468 №670999 
>>670969
>а вполне себе Object, а значит и has_method() у него обязан быть.
А почему ты уверен, что он коллайдится именно с тем у объектом у которого есть этот метод, а не с каким-нибудь другим.
После 4. _ _ var collider = foo.get_collider() сделай вывод в консоль collider и посмотри, что там.
Аноним 19/05/20 Втр 11:31:27 #469 №671020 
>>670969
Да, это очень странно.
Аноним 19/05/20 Втр 15:58:45 #470 №671121 
>>670969
Я бы проверил что твой $RayCast:
1. enabled
2. Настроен на нужные фильтры (collide with bodies, collide with areas)
3. Включена маска на физ слои, в которых находятся интересующие тебя объекты
4. Настроен ли в нем вообще вектор cast_to
5. По описанию вроде это не требуется при таком использовании, но попробуй перенести код в physics_process
6. По описанию, можно и не проверять на is colliding если баг в ней - get collision вернет null при отсутствиии коллизий.
Аноним 19/05/20 Втр 16:15:47 #471 №671128 
>>670999
Потому что
а) метод has_method() есть у всех объектов. Вообще у всех. В этом смысл его применения. https://docs.godotengine.org/en/stable/classes/class_object.html#class-object-method-has-method
б) Вываливается с ошибкой Attempt to call function "has_method"in base "null instance"on a null instance.
Принт в данной ситуации, кстати, не поможет, потому что будет говорить, мол, "вы слишком много выводите, мне столько не съесть", и похерит часть текста.

Кстати, я уже придумал, как исправить ошибку конкретно в этом месте.
1. var foo = $RayCast2D
2. if foo != null:
3. _ var collider = foo.get_collider()
4. _ if collider != null:
5. _ _ if collider.has_method("bar"):
Но это не избавляет проблемы более крупной, которая происходит где-то в памяти, ведь изменение коллайдера происходило явно не тут. И действительно, теперь код падает молча, не выдавая никаких ошибок, чёрт знает в какой момент, просто когда объектов много; может упасть при 1000, а может при 50, тут как повезёт.
Аноним 19/05/20 Втр 17:28:18 #472 №671147 
https://www.youtube.com/watch?v=NzCXVrBymLA
Аноним 21/05/20 Чтв 07:00:02 #473 №671536 
colliders godot.png
2.gif
>>670969
>>671128
Попробовал впихнуть твою конструкцию в свой проект - вроде работает. На первом пике код (все лишнее вырезал), на втором результат.
Проверка HasMethod действует и с object и c area.
На сцене чуть более 120 объектов.
Версия Godot 3.2.2 beta 2
Аноним 21/05/20 Чтв 11:43:02 #474 №671558 
>>671536
> Эти дополнительные area над лестницами.
Хоспаде, пошто я такой тупой? Такое простое и элегантное решение, а я не додумался.
Аноним 21/05/20 Чтв 12:14:05 #475 №671561 
>>671558
>Хоспаде, пошто я такой тупой? Такое простое и элегантное решение, а я не додумался.
Для справки красные платформы, на самом верху лестниц, находятся на отдельном слое коллизий. Когда игрок переходит в STATE_CLIMB, то коллизии с этим слоем отключаются, все остальное время они включены. Это позволяет без геморроя пролезать через платформы при CLIMB вверх-вниз по лестнице, и спокойно IDLE, WALK, JUMP на них.
Аноним 21/05/20 Чтв 14:29:33 #476 №671580 
>>671536
>Попробовал впихнуть твою конструкцию в свой проект - вроде работает
Конечно работает. Никто и не сомневался, что она работать будет. Она и должна работать. Ты доказал, что работающая конструкция работает. И я вообще не понимаю, что надо сделать в проекте, чтобы она не работала. Однако факт: я таки сделал это случайно. Какими-то другими действиями сломал эту работающую конструкцию. Соответственно, ни в пустом проекте, ни в твоём, ни в каком-либо ещё она не будет сломана, если повторить только её, но не повторить эти ломающие действия. А что именно её сломало? Что вообще могло её сломать?
Аноним 21/05/20 Чтв 16:02:13 #477 №671608 
>>671561
А у меня всё проще было организовано: У контроллера персонажа два режима движения: ходьба и полёт. При ходьбе работает гравитация и есть прыжки, при полёте гравитации нет, вместо прыжков полное перемещение по 2м осям. На лестницы накидываю area2d которая при появлении в нем игрока в общем случае посылает ему команду перейти в режим полёта. И всё. Несмотря на некоторую костыльность, как мне кажется, работает всё достаточно гладко. Кроме ебучих верхушек лестниц. Как я с ними ни мучился! А оказывается всё так просто было. Делаешь дополнительную area2d которая выталкивает вверх.
> то коллизии с этим слоем отключаются
Я бы так не стал делать ибо есть односторонняя коллизия.
Аноним 21/05/20 Чтв 22:16:10 #478 №671729 
Псст, пацан. Ищешь базу данных для своего проекта?
https://www.youtube.com/watch?v=TdWWiVd1IxQ
Аноним 22/05/20 Птн 00:31:51 #479 №671755 
Щас очередной эпик словил:
if foo <= 1:
Остановился с ошибкой: Invalid operands 'Array' and 'Int' in operator '=='
Смотрю стек. Нахожу там foo, вижу значение: 3. В смысле да, не Array (size 4), а просто 3.
Я в ступоре нахуй. Как так-то? Как переменная может быть числом и массивом одновременно?
Аноним 22/05/20 Птн 05:08:02 #480 №671778 
>>671608
>Делаешь дополнительную area2d которая выталкивает вверх.
У меня ничего никуда не выталкивается. Область над лестницей просто служит ограничителем и устанавливает свой флаг onLadderTop, видя который контролер просто либо не дает ползти дальше вверх, либо позволяет ползти вниз (если игрок до этого стоит на верхней платформе и нажимает вниз)
>Я бы так не стал делать ибо есть односторонняя коллизия.
А как ты будешь слезать вниз когда ты на верхней платформе? Коллизию все равно как-то отключать придется.

>>671608
>А у меня всё проще было организовано: У контроллера персонажа два режима движения: ходьба и полёт.
Слишком просто для моего случая. У меня во время только прыжка может быть три стейта JUMP, FALL и ROLL. На лестницах тоже несколько возможных CLIMB, CLIMB_IDLE, CLIMB_WALK. Плюс еще всяких вроде IDLE, WALK, SWIM и т.д.
Аноним 22/05/20 Птн 05:34:28 #481 №671782 
>>671755
>Я в ступоре нахуй. Как так-то? Как переменная может быть числом и массивом одновременно?
Х.з. но с этой их динамической типизацей все возможно. Насколько я понимаю в GDScripte любая переменная может свой тип в любой момент поменять. Собсно это одна из многих причин (помимо производительности, форматирования отступами и других) почему я его дропнул в пользу C#.
Аноним 22/05/20 Птн 05:44:49 #482 №671783 
>>671580
>А что именно её сломало? Что вообще могло её сломать?
Ну ты же понимаешь, что однозначно это сказать можно только увидев твой проект полностью.
Попробуй как я уже писал после var collider = foo.get_collider() хоть какой-нибудь вывод сделать и посмотреть, что конкретно у тебя попадает в collider. Хотя бы ID объекта получить или его тип. Может туда нихрена не object попадает, а что-то другое. Если же попадает то, что надо, возможно придется открывать issue с багом.
Аноним 22/05/20 Птн 11:17:10 #483 №671819 
>>658384 (OP)
Блин, а есть какой-нибудь ПОЛНЫЙ туториал по созданию контроллера персонажа в 3D со всеми нюансами типа захода на бордюры и перемещения по лестницам? Движение в одной плоскости - это легко, но лестницы уже кажутся чем-то принципиально непреодолимым, но ведь как-то их делают. Я месяц бился со своим контроллером, пока не забил на игрострой из-за всех этих дурацких проблем, и сейчас не хочу снова с этим биться чтобы снова проиграть. Готовые контроллеры не подходят, т.к. там быдлокот какой-то и вообще есть фатальный недостаток, короч никакой возможности модификации.
Аноним 22/05/20 Птн 11:20:44 #484 №671820 
>>671819
https://en.wikipedia.org/wiki/Inverse_kinematics
Аноним 22/05/20 Птн 12:00:20 #485 №671826 
>>671820
>Inverse_kinematics
Да при чём тут вообще инверсная кинематика? Я до этапа анимирования ещё не дополз вообще. Мне бы хотя бы кубик заставить по лестницам "шагать"... Нет, хотя бы чтобы он перестал подпрыгивать на маленьком бордюре так, будто врезается в почти вертикальный трамплин.

Вообще думаю нафиг 3D-модели, сделаю персонажей 2D-спрайтами с подменой на правильный ракурс при повороте камеры (хочу попробовать что-то типа GTA 2, только с видом сверху-сбоку, а не чисто сверху). Потому что в 3D всё равно хрень колючая получается, в 2D можно хотя бы сказать "это стиль такой". Но для этого мне сначала нужно реализовать правильное движение, а это ад какой-то, постоянно какие-то глюки, неужели так трудно было внедрить готовый контроллер прямо в движок?
Аноним 22/05/20 Птн 12:55:53 #486 №671840 
>>671755
Сделал print(foo) непосредственно перед сравнением. Выдаёт 3, как и следовало ожидать.
print(foo <= 1) выдаёт false. Но if после этого всё равно вываливается за несоответствие типов.
var bar: bool = (foo <= 1)
if bar:
ТО ЖЕ САМОЕ!!!!
И тут я нашёл проблему.
Кароч. На самом деле текст был такой:
1. func my_func() -> bool:
2. _ if foo <= 1: return true
3. _ if bar == 0: return true
4. _ return false
Вооот. Вываливалось всё на второй строке. Но со второй строкой на самом деле не было никаких проблем, и она работала корректно. Ошибка была на третьей строке, так как bar это на самом деле массив. У меня всё равно остался вопрос, какого чёрта дебаггер ругался не на то место, но уже понятно, что это действительно мой косяк.
Вывод: иногда дебаггер неверно указывает строку.
>>671783
Обсосали и обсудили же, что там null.
Аноним 22/05/20 Птн 12:59:10 #487 №671841 
>>671826
>кубик
Попробуй CapsuleShape.
Аноним 22/05/20 Птн 13:57:22 #488 №671853 
>>671841
>Попробуй CapsuleShape.
Изначально капсулу и пробовал. Но с лестниц капсула сползает/подпрыгивает...
Аноним 22/05/20 Птн 14:08:35 #489 №671855 
>>671853
Тебе анон не просто дал статью на инверсную кинематику. Да, ты, блять не дошёл ещё до анимаций. Но когда дойдёшь, у тебя уже будет шагающий невидимыми ногами по лестницам контроллер.
>>671819
Так что, вариантов не остаётся. Ты либо сразу делаешь контроллер на инверсной кинематике, либо проигрываешь снова, потому что контроллер на простой капсуле/кубе это прошлый век геймдева. И очень верно, что ты подметил то, что все туториалы, опирающиеся на это обладают быдлокодом. Потому что пилит эти туториалы либо быдло, либо инфоцыгане. В первом случае просто бесполезный кривой туториал, во втором случае замануха для платных курсов, причём инфоцыганен может быть одновременно быдлокодером и заплатив ему ты получишь ещё один кривой туториал, но уже за деньги.

Нет туториалов. Никто в здравом уме не будет бесплатно раздавать такое. Ты либо читаешь фундаментальные статьи, типа той, что дал анон и по ссылкам из неё на источники. Либо продолжаешь раз за разом делать то же самое говно по кривым туториалам. Кстати, я уже рассказывал тебе, что такое - безумие?
Аноним 22/05/20 Птн 14:17:47 #490 №671857 
>>671855
>контроллер на инверсной кинематике
Разве в играх инверсная кинематика используется для чего-то кроме анимации? Это ведь когда движение ступни корректно сдвигает коленный сустав, или движение кисти руки сдвигает локтевой сустав...

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

Вот только как это может помочь в движении по неровной местности, если инверсная кинематика никоим образом не связана со взаимодействием с поверхностями? Ну да, суставы можно согнуть, т.о. нога, визуально стоящая на кочке, будет правдоподобно сгибаться - но ведь по факту это только 3D-модель, реальная модель персонажа стоит на определённой высоте и представляет из себя точку.

Алсо, ну вот какой мне смысл симулировать смещения коленных суставов, если у меня вместо визуальной модельки будет плоский спрайт? Ведь, по факту, у меня не будет НИКАКИХ суставов...

Так, кажется, я понял. Нужно сделать вращающиеся ступни, а всё остальное тело заменить кубиком...
Аноним 22/05/20 Птн 14:23:21 #491 №671858 
>>671857
> Разве в играх инверсная кинематика используется для чего-то кроме анимации?
Не хочется тебе давать вредных советов. Осторожно напомню, что кинематика - это раздел физики. Следовательно, инверсная кинематика помимо анимации используется в физических движках. НАВЕРНОЕ. Чтобы естественным образом идти по лестнице, должно быть некоторое основное тело и два контрольных тела-ступни, которые инверсным образом вычисляются лежащими на поверхностях ступенек. Всё, больше ничего не скажу, чтобы не нести хуйню. Я сам в этом вопросе плаваю.
Аноним 22/05/20 Птн 14:36:24 #492 №671859 
>>671858
>Чтобы естественным образом идти по лестнице
>естественным образом
Так мне не нужно "естественным образом". Мне нужно, чтобы не было бесконечного сползания вниз и прыжков вверх.

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

Собственно хочется что-нибудь простое, типа капсулы, потому что у простых решений не бывает внезапных глюков. Но в готовых движках такое невозможно, наверное...
Аноним 22/05/20 Птн 14:44:43 #493 №671862 
>>671859
>Мне нужно, чтобы не было бесконечного сползания вниз и прыжков вверх.
Используй вектора, Люк.
(рейкасты, нормали, снапы... вот это вот все...)
Аноним 22/05/20 Птн 14:52:27 #494 №671867 
>>671862
>рейкасты, нормали, снапы
>Я месяц бился со своим контроллером
Ты думаешь, я этого не пробовал? Фигня какая-то получается.
Аноним 22/05/20 Птн 23:03:21 #495 №672014 
>>671867
> Фигня какая-то получается.
Ну шо тут сказати? Плохо пробовал, потому что у меня получалось ещё на 3.0 по видеотуториалу (англоязычному разумеется, может в этом твоя проблема, кстати) настраивал контроллер в триде, с капсулем, не скатывающийся на наклонных поверхностях, причём угол наклона можно было регулировать. Лестницы в таком случае делаются как пандусы, без ступенек. Ступеньки просто меши, а коллижншейп = пандус. Всё как мы любили в конце девяностых начале нулевых.
Аноним 23/05/20 Суб 00:26:46 #496 №672057 
Сделал основу AI. Это был долгий квест.
Сколько-то времени назад я писал здесь, что собираюсь сделать AI на основе генетического алгоритма. И тогда я не очень понимал, как вообще это надо делать. По такому случаю сделал проект попроще, чтобы обкатать алгоритм.
Это была искусственная жизнь, ничего особенного. Но из этого проекта я извлёк два важных вывода:
1. Генетическому алгоритму нужно выстраивать баланс из условий
2. Иерархическая структура
По второму пункту поподробнее. На самом деле это почти то, что я уже давно хотел сделать с искусственной жизнью. Генотип срабатывает один раз при создании клетки, он регулирует создание органелл и их наполнение. Каждая органелла это нода, дочерняя клетке, имеет свою собственную программу - то самое наполнение. Органеллы имеют разные типы: ядро, митохондрия, хлоропласт и т.д. У каждого типа своя функция, ничего другого он выполнять не может. Например: ядро умеет только размножать, хлоропласт только питаться светом и т.д. И есть особая органелла рибосома, которая умеет выполнять умную программу: запоминать что-нибудь и сравнивать ещё что-нибудь с памятью, в зависимости от результата сравнения изменять порядок выполнения органелл. Раз в цикл действует только одна органелла, на которую указывает указатель. В норме они все опрашиваются по очереди, если только рибосома не переместит указатель.
До конца этот проект я так и не довёл. Понял, что закапываюсь и ухожу слишком далеко от главного, пришлось оставить до лучших времён. Так и не смог пофиксить джоинты, вызывавшие молчаливый краш и вообще не работавшие корректно. Не нашёл баланса, чтобы оказались полезны рибосомы. Не нашёл баланса, чтобы оказалось полезно не только уменьшение размера, но и увеличение. Доделаю демку основного проекта - допилю жизнь и обязательно поделюсь с анонами, занимательно получилось.
Но это я всё к чему. Иерархическая структура. Я понял, что применить генетический алгоритм на мобах не получится, по крайней мере, в том виде, в каком понимал тогда. Зато нашёл удобный способ организации для AI.
1. Одна нода AI управляет одним юнитом. В ней распределяются общие состояния: патрулировать или нападать, например. Каждое состояние представляет собой набор задач, каждая из которых является отдельной нодой, дочерней к основной. Всегда выполняется только самая первая задача; если их нет, включается перепроверка всего состояния и добавление списка задач заново.
2. Задание работает аналогично, только распределяет уже примитивные действия. Например: пройти до координаты. Или: стрелять. У задания есть определённые условия, при которых оно самоуничтожится и уступит место следующему заданию. Задание это такое промежуточное звено между общей задачей и последовательностью нажатий на кнопки. Действия точно так же являются нодами и добавляются как дочерние объекты, точно так же выполняется всегда самое первое действие.
3. Действия уже не могут иметь потомков, потому что они сами примитивнее некуда. Но у них есть условия самоуничтожения. Например, для стрельбы таким условием может быть пустая обойма.
Вооот. Это всё я за вчера-сегодня запилил. Теперь предстоит прописать довольно большое количество таких вот AI-нод. К ним по желанию можно добавлять всякие там рейкасты, если надо, например, оценить присутствие врага в поле зрения. Совсем-совсем простой уровень уже реализовал, болванчики ходят туда-сюда, при виде игрока стреляют.
Если кто прочитал эту стену текста, любые соображения велкам.
Аноним 23/05/20 Суб 00:33:31 #497 №672062 
>>672057
Бля, анон, утром прочитаю, засыпаю уже. Чисто мысль перед сном: не зря ИИ пилят на питоне. Видать синтаксис питона способствует. А раз гдскрипт потянул синтаксис, то чем чёрт не шутит, может и самые интеллектуальные боты будут у нас? А? (Будет обломно, если ты тот анон, который пилит на шарпе, мда)
Аноним 23/05/20 Суб 01:01:58 #498 №672071 
Обнаружен баг! Предупреждены - значит вооружены:
https://www.youtube.com/watch?v=uuP3dOH2y6w
Краткое содержание:
Если массив объявлен, как экспортируемый, он начинает передаваться по ссылке. Если при объявлении нескольких таких массивов их проинициализировать одинаковой конструкцией [] то из-за чудес оптимизации всем им выдастся ссылка на один массив, что неочевидно и нигде не описано. Автор видоса побежал ишью пилить. А я из видоса вынес для себя, что существует возможность объявить передаваемый по ссылке массив, что может быть полезно в ряде случаев, ибо в нормальном (не экспортируемом) состоянии простые массивы передаются в гдскрипте по значению.
Аноним 23/05/20 Суб 01:19:26 #499 №672074 
1458162078347.png
>>672071
Баг воспроизвелся, да.
> ибо в нормальном (не экспортируемом) состоянии простые массивы передаются в гдскрипте по значению.
Тут ты не прав, я тебе уже отвечал. Массивы вседа по ссылке, так написано в доках.>>670203
Аноним 23/05/20 Суб 11:35:53 #500 №672107 
>>672074
> Тут ты не прав, я тебе уже отвечал.
Точно. Забыл совсем.

Аноним OP 23/05/20 Суб 11:38:28 #501 №672109 
1590223106647.png
ПЕРЕ >>672108 (OP) >>672108 (OP) >>672108 (OP) КОТ
comments powered by Disqus

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