Шапка: https://hipolink.me/godothread
Предыдущий: >>931045 (OP)
Архивный: >>926070 (OP)
Сап годотеры, собрался с духом и решил вкатиться
Ппроблема в том что работаю на планшете в 3й версии годота.
И я тупо не перевариваю, гд скрипт, хотел установить c# но во первых компилятор визуал код под андроид нужен, я устанавливал пиратку, но она неработает. И во вторых сам редактор при выборе внешнего редактора почему то не видит, мой внешний компилятор. Вообще возможно на мобильном андроиде обманываться c#?
Не обманывай себя, для полноценного девелопа нужна перканя. Если ты совсем нищий, возьми старый пень на авито. Рублей за 12.
Значит нет. Ладно буду работать в скрипте.
У меня есть пекарня, просто на дно работе в обеденное время пила всякое, вот купил мощный планшет и решил вместо работы на консоли или пердолинга в xamarin.android попробовать пилить на нормальном движке, тем более несколько лет назад я уже пробовал годо.
Ты чет взял и превратил один из самых легких и беспроблемных движков в какой-то бег с препятствиями. И планшет, и андроид, и сисярп, и пиратская вижуал студия. А чтобы под андроид релиз собрать тебе еще андроид сдк и джава понадобится. Да у тебя талант к веселой жизни.
Двач, я ем суп с ножа.тхт
Я тоже на андроиде играюсь с годотом, но с gdscript. И почему у тебя 3 версия, если 4.2 уже есть?
https://github.com/godotengine/godot/pull/87360
Плюс глоу/блум завезли в рендерер совместимости. Четверка все вкуснее и вкуснее, перейду на нее в один прекрасный день.
>но как понимаю их можно делать на yield
Некрасиво, неудобно, негибко.
Приведу пример, который я уже частично реализовал.
Вот у меня загрузчик. Он показывает лоадскрин с полосой прогресса, а сам в это время делает дело. Загрузчик один, но способен выполнять разные задачи:
а) Начинать новую игру, загружая произвольный уровень
б) Переходить с уровня на уровень
в) Загружать сейв
Работает он (в общих чертах, опуская подробности) так:
var scenario: Array[Callable]
var stage: int
func _process(delta):
var time = Time.get_ticks_msec()
while Time.get_ticks_msec() - time < VREMYA:
scenario[stage].call()
И для новой игры, допустим, сценарий такой:
[load_level, instantiate_level, update_level_data, add_player]
Для смены уровня такой:
[save_player, unload_level, load_level, instantiate_level, update_level_data, restore_player]
А для загрузки сейва какой-то такой:
[load_save_file, unload_level, load_level, instantiate_level, add_player, update_data_from_save]
Выходит, что многие функции повторяются, к тому же в процессе разработки могут дорабатываться, меняться. При этом сам загрузчик остаётся в целом такой же. Если надо добавить/удалить функцию - просто правим сценарий. А сами функции могут вообще где угодно находиться.
>накладные расходы
Да ну надо ж понимать, это инструмент для своих задач. Но вообще, учитывая, что callable это по сути указатель на функцию, а массив это по сути указатель на область данных, то я вообще хз, где тут могут быть какие-то расходы. Больше расход просто от факта переключения контекста.
>но как понимаю их можно делать на yield
Некрасиво, неудобно, негибко.
Приведу пример, который я уже частично реализовал.
Вот у меня загрузчик. Он показывает лоадскрин с полосой прогресса, а сам в это время делает дело. Загрузчик один, но способен выполнять разные задачи:
а) Начинать новую игру, загружая произвольный уровень
б) Переходить с уровня на уровень
в) Загружать сейв
Работает он (в общих чертах, опуская подробности) так:
var scenario: Array[Callable]
var stage: int
func _process(delta):
var time = Time.get_ticks_msec()
while Time.get_ticks_msec() - time < VREMYA:
scenario[stage].call()
И для новой игры, допустим, сценарий такой:
[load_level, instantiate_level, update_level_data, add_player]
Для смены уровня такой:
[save_player, unload_level, load_level, instantiate_level, update_level_data, restore_player]
А для загрузки сейва какой-то такой:
[load_save_file, unload_level, load_level, instantiate_level, add_player, update_data_from_save]
Выходит, что многие функции повторяются, к тому же в процессе разработки могут дорабатываться, меняться. При этом сам загрузчик остаётся в целом такой же. Если надо добавить/удалить функцию - просто правим сценарий. А сами функции могут вообще где угодно находиться.
>накладные расходы
Да ну надо ж понимать, это инструмент для своих задач. Но вообще, учитывая, что callable это по сути указатель на функцию, а массив это по сути указатель на область данных, то я вообще хз, где тут могут быть какие-то расходы. Больше расход просто от факта переключения контекста.
И соответственно после инкремента стоит проверка на выход за границу массива, которая символизирует конец загрузки.
А ты внимательнее посмотри. У него загрузчик хитро балансирует нагрузку, не прибегая к многопоточности. Если цепочка вызовов затянулась дольше, чем VREMYA, то цикл останавливается и возобновляется в следующем фрейме. Предложи вариант, как ты это сделаешь ещё элегантнее?
load_level работает дольше кадра. Твои действия? Где ты там приостановление увидел? Я хз. Тут происходит какой то троллинг?
Всем чмоки в етом чятике.
мимотвайнодебил
> Где ты там приостановление увидел?
Ох блять... Ну почему даунинг-крюгеры такие? И ведь сам таким был. Аж вспоминать стыдно.
Ты сам себя затроллил своим невежеством. Матчасть учи.
Да судя по ответу ты им и остался.
https://www.rawrlab.com/godot_nintendo_switch_free_port.html
Кто хочет, ищет возможности, кто не хочет - найдет миллион оправданий.
Это для меня и таких как я. Уже продумываю как к своей игре добавить управление свища.
Спасибо-спасибо. 00)))0
>Полагаю
Типа того. И там ещё много-много другого скрыто за
>(в общих чертах, опуская подробности)
В частности, сценарная функция должна возвращать интовый код ошибки. Если код == ERR_FILE_EOF, то stage += 1; если код == OK, то просто продолжаем молотить цикл; если код == ERR_BUSY, то прерываем цикл, ждём следующий фрейм; во всех остальных случаях совсем прекращаем загрузку и пишем код ошибки; для красоты оборачиваем его функцией error_code, чтобы не циферьку писало, а текстовое описание.
И да, проверка прогресса и перерисовка полоски осуществляется отдельно, вне цикла.
>>38615
>load_level работает дольше кадра. Твои действия?
https://docs.godotengine.org/en/stable/tutorials/io/background_loading.html
Жаль, выпилили однопоточный вариант ресурслоадера, который работал как раз по схеме, описанной мной выше, с циклом и проверкой времени выполнения. Точнее, эту схему я познал из обучающей статьи по ресурслоадеру из 3.5:
https://docs.godotengine.org/en/3.5/tutorials/io/background_loading.html
>>38611
>Хз, не вижу причин тут городить такое вместо просто вызова функций.
Всё зависит от масштаба. Для три вряд на ЯИ нет никаких причин что-то городить. Для road to vostok без городьбы не обойтись.
У меня вот комплексные тяжёлые уровни, которым после загрузки ещё и ресурсы апдейтить надо. У кого-то вообще процедурная генерация. В прошлой игре уровни были простые, я не городил, просто показывал статичный экран с названием уровня, он висел секунду, пока левел грузился, было норм.
>free
Не фри. Это именно то, что нытики не поняли, когда W4Games выкатили свои версии портов. Нужны девелоперские ключи-лицензии от Сони/МС/Нинтендо. В W4Games ты бы это делал через прокси-Хуана, а тут ты сам должен Нинтенде забашлять бабла за девелоперские ключи.
То есть, по сути, у этого порта такая ниша: если ты УЖЕ оплатил все нинтенде, и не хочешь платить второй раз W4Games - тебе это подойдет.
Чел, ты... Открой доки любого другого движка - там все начинается с реги в нинтендо. Ты какой то сверх наивный. Речь и идет о бесплатности порта, ты бы еще удивился что на айфон надо в эппле платно регаться.
Речь идет о бесплатности порта, а не бесплатности издания на свитч.
Для любителей свободы уже 5 лет есть версия для джейлбрейка https://github.com/fhidalgosola/godot-switch
Нет, это ты недооцениваешь уровень наивности среднего желающего портануть свой 2д пиксель-арт платформер. Хватало нытиков, ожидавших что раз движок свободный, то им не придется платить никому и ничего. И которым пришлось долго объяснять что именно включено в цену портов от W4Games.
>ты бы еще удивился что на айфон надо в эппле платно регаться.
Я бы нет. Теперь ты удивись тому, что это происходит регулярно. Даже в наших тредах. Типичная картина: приходит челик, желающий выложиться в гугл-плей, узнает что там 25 баксов и санкции-хуянкции, и с лицом грустной лягушки идет в яндекс игры. Хотя сама возможность сделать билд под андроид - бесплатная, да.
Поэтому всегда надо уточнять, что именно фри, а что нет.
По уму инфа про платные и сложные для резидента реги должна быть в шапке ньюфаго треда. А не всякие ссылки на несуществующие треды давно заброшенных игр.
Ну да. Но шапку все равно никто не читает.
>сложные для резидента реги
Для резидента они сейчас все сложные, так и живем теперь. Мне предыдущую работу вообще через крипту пришлось доделывать.
В 3-м нет для 2д, только в 4-ке добавили.
Но, собственно, куча способов сделать нужное и без них.
Как трудно жить было. Может подскажешь тогда? Я хочу сверху всего наложить текстуру-фильтр, которая должна накладываться на все спрайты кроме одного. При этом я не могу изменить порядок спрайтов. Нашел способ через light2d и light mask, а еще что-нибудь есть?
Помести этот один в другом слое.
Короче челы подскажите, хочу перекатиться с юнити на годот. Делаю игру 2Д рпг, есть карта с тайлами, всякие интерфейсы персонажей, сражение примитивное, и заебался что в юньке слишком геморно это делать.
На годоте будет проще реализовать вот это вот всё? Мне никаких заморочек не нужно, буквально примитив как на том же ренпи или почти любом движке для новелл. А на юньке такое ощущение что есть 100500 функций которые мне тупо не нужны и мешают.
> На годоте будет проще реализовать вот это вот всё?
Тонкий вопрос. У тебя с движком, как это нынче говорится, должна химия возникнуть. Если возникнет - будет легко и быстро.
Понимаю, как сделать это для каждого параметра
func minimum_par():
if Global.Power > 25:
Global.Power -= 1
Global.FreePoints += 1
Но как сделать так, чтобы вставлять напрямую в функцию Power, Intellegent, Magic? То есть одна функция для всех вместо кучи функций на каждой кнопке?
Да. Тоже делаю 2д рпг, можешь скинуть телегу, я тебе выкачу список туторов от самого низа до тонких мелочей.
https://play.google.com/store/apps/details?id=org.godotengine.editor.v4&hl=ru
Можешь просто скинуть проект на мобилу и запустить через мобильный эдитор
он веб версию запустит или андроид?
Глобал обжект оче всратый паттерн
var stamina : int :
get:
return _stamina
set(value):
_stamina = int(value)
player.IncreaseStat(value, statType)
switch(statType)
case "stamina":
stamina+=value
break;
statchanged.emit(statType, value)
> Но как сделать так, чтобы вставлять напрямую в функцию Power, Intellegent, Magic?
Индексами.
Все свои параметры занеси в энум.
> enum Stats { Power, Intellegent, Magic }
Индексы энума должны точно соответствовать порядку хранения параметров в базе данных (твой Global например). Далее навесь на все кнопки вызов сигнала с параметром:
> buttonMagic.pressed.connect(my_pressed_callback, [Stats.Magic])
и далее в коллбэке тебе ничего уже не надо свитчить. Тебе уже в коллбэк параметром прилетает индекс стата, который тебе надо менять:
> func my_pressed_callback(stat_idx: Stats):
> > Global.StatsDataArray[stat_idx] += 1
Оке
Заводишь переменную внутреннюю, допустим _stamina, вот это дело не трогаешь больше
Заводишь внешнюю, stamina с геттером и сеттером
И так для всех статов, вдруг логика какая будет в сеттере
Делаешь функцию увеличения стата, где параметрами является тип чего увеличиваешь и насколько, внутрь кладешь свитч с типами статов, где уже присваиваешь суешь или добавляешь во внешнюю stamina нужное значение
Опционально эмитишь сигнал changed либо в сеттере, либо после свича, если где-то должно отслеживаться изменение статов, допустим для пересчёта макс за или чего-то такого
> БРАТАН СПАСИБО ТЕБЕ ОГРОМНОЕ!
Обращайтес.
И ещё, раз у тебя есть глобальный объект, то и вышеуказанный энум объявляй в нём. Чтобы видели его все, кому надо.
Так и сделал!
Я не вопрошавший, но спасибо большое. Ты сейчас мне показал, как я могу сделать лучше функции апдейта стат персонажей(но в другом двиге).
У меня там $npcs[id].statname, я как-то совсем забыл,что могу написать $npcs[id]['statname'].
Ну, так-то по сути мой совет - это классика из нулевых, я тогда жил в глухой деревне без интернетов, душа просила кодинга, а из средств кодинга я нашёл на мамкиной пекарне только мс офис и пилил программы в ворде/экселе (как эта ваша деревотян). Там прямо формочку можно сделать с кнопками и текстбоксами, которую можно вызвать из документа. И вот эти кнопочки на формах VBA были искаропки с индексами. И первое что приходило в голову как использовать те индексы, это навесить на все кнопки из какой-либо группы на один обработчик.
Много лет спустя, когда я перешел сначала на дельфи, потом на шарп, оказалось, что так же можно сделать и там, правда индексов искаропки уже не было, но прикрутить их несложно.
Звучит как синдром Даунинг-Крюгера. Без обид, я тоже в молодости пилил ООП-тетрис, в котором каждый блок - это класс, а каждая фигура это класс из экземпляров класса-блока, а игровое поле - это класс из экземпляров-экземпляров, а потом я охуел, хуле ничего не работает?
Конечно, какие могут быть обиды на нюфань, которые не знают как пишется Даннинг? А потом эмулируют ООП через массив с enum
Я же сказал, на нюфань не обижаюсь.
Ну и славно, успехов тебе, анон
Если можно было сделать все через _get_drag_data, _can_drop_data и _drop_data.... Че блять, многодневную работу переписывать?
> Че блять, многодневную работу переписывать?
Сохрони в отдельном архиве, на случай если понадобится. Это опыт. Ты его получил.
Ну да, параметры по умолчанию. Может тебе проще объект в параметр передавать, или словарь?
Вот у меня нода2Д (точнее, Marker2D). Я хочу, чтобы она выполняла кое-какое действие (для начала хотя бы принт в консоль) каждый раз, когда я её в редакторе мышкой передвигаю. Как это сделать?
func _draw(): print("не работает")
Пробовал присоединять сигналы draw и item_rect_changed - тоже не сработало. Пробовал также выставлять set_notify_transform(true) - не помогло.
Как?
В _process сравнивать с предыдущим положением?
>set_notify_transform
Вроде как надо определить функцию _notification чтобы их ловить
Ну тут какая то инфа есть
https://www.reddit.com/r/godot/comments/9y74r6/how_to_detect_when_node2d_is_moveddragged_in_the/
Сам не пробовал.
>каждый раз, когда я её в редакторе мышкой передвигаю
А что если добавить в нее контрол-ноду с сигналом on mouse pressed, и печатать по этому сигналу? Хз сработает ли в с tool.
Вроде бы нет, там надо что-то с EditorPlugin как по ссылке делать и forward_canvas_gui_input
Подумол и понял, что объединять нет смысла потому что то от чего хочу избпвиться вернётся неминуемо.
ну или не плагин а где то отдельно на сайте
есть что то бесплатное и с открытым доступом?
посмотрел отрывок с презентации гугловского гемини с ваганеткой, терайном и тд...пиздец.
Сцену перезагрузил?
Да, у меня тоже.
Там в схеме, похоже, участвуют какие-то 2 прокси (Алсо это значит, что какой то васян может собирать инфу какие видосы ты смотришь).
Может быть они упали, может быть им нужен впн. Хз.
В общем, как ни прискорбно, придётся держать маркет.браузер под рукой для инглиша.
Попробуй просто чатгопоту. Не знаю дообучили ли ее уже до годота 4, для годота 3 в принципе пишет. Гемини не щупал, не знаю как там.
хз, олткрыл сейчас рандомное видео и всё работает, скинь своё, которое у тебя не пашет
Нет, полно бесплатных.
ГПТ 3.5 бесплатный, гугловский гемини/бард тоже. Не-рфшный прокси только нужен. Другими я не пользовался.
С проксями ебаться ещё. Буду по старинке смотреть. В яндухе. Идея конечно была неплоха, но увы.
Ну а так ебаться с виртуалками и песочницами где его запускать.
Я как бы в курсе, где я живу, но всё равно, если есть возможность не ебаться предпочитаю не ебаться. Но в уме держу, что есть вот такая и вот эдакая возможность.
>лавочку, обсуждавшуюся нами в прошлом треде
для отсутсвующих, и ленивых чтобы перечитывать, вы о чем вообще?
лень объяснять.
Насколько помню они переводят англоязычные туториалы с ютуба с помощью яндекс-браузера.
Есть какие то аддоны, но скорее всего они устарели и вот они возможно обращаются к API нейронок, а это вроде платно, в отличии от чатов.
Наверное можно самому как то наколхозить.
>переводят англоязычные туториалы с ютуба с помощью яндекс-браузера
Нахуя для встроенного переводчика в ябравузер ебаться в проксями, виртуалками и песочницами о чем анон выше упоминает
Возможно мы никогда не узнаем ответ на этот загадочный вопрос, анон. Но игры нам это делает не помешает, верно?
Типа яндекс зашквар, скам-браузер, распространявшийся с bloatware. Поэтому до сих пор у олдов пригорает с одного его названия.
Не поэтому. А потому что зачем нужен лишний зонд фсб с доступом ко всему диску, если от браузера нужна только функция перевода конкретного видео?
Зачем ты купил планшет, если мог купить ноутбук?
Я использую просто спрайт персонажа, никакой скелетки. Сверху - понятно, персонаж будет "падать" (звучит, как плохое решение), а подъем? Нашел решение с помощью tween (но пока ничего не понял, т.к. слышу об этом впервые) https://gamedev.stackexchange.com/questions/183919/how-should-i-implement-stair-climbing
Какие еще есть варианты?
Просто сделать наклонную поверхность - не подойдет, будет коряво смотреться
> Какие еще есть варианты?
Ебани персонажу под ноги на джойнт невидимое кинематикбоди с шейпом в виде крестовины, и при обнаружении лестницы крути в направлении инпута. Базарю, натурал экспириенс будет!
>Просто сделать наклонную поверхность - не подойдет, будет коряво смотреться
В старых играх, если внимательно на них посмотреть, физическое представление лестниц часто было именно наклонной поверхностью. А "лестницы" были визуальной моделькой. Рекомендую учиться у дидов.
Там используется Raycast, допустим, в сторону, один на уровне стопы, второй на уровне коленки (сразу над ступенькой), соотетственно если игрок идет в сторону, если он уперся в стену, то оба рейкаста попадут в стену, а если он стоит перед ступенькой, то верхний покажет пусто, и значит можно перемещать игрока на ступеньку. дальше у них там еще какие то условия, например еще raycast вверх, чтобы не подниматься на ступеньку, если ты уперся в потолок
Ну а перемещение можешь делать любым способом.
В ответе чел добавляет еще один Raycast, сверху вниз, чтобы определить точку на ступеньке в которую пойдем.
Tween просто предназначен для плавного движения, сглаживания. yield ставит выполнение функции на паузу, пока анимация tween не закончится.
Первая анимация поднимает его вертикально на месте, до высоты ступеньки (и еще на -2 пикселя выше). Вторая анимация уже двигает его горизонтально, до точки куда изначально рейкаст пересекся с полом ступеньки.
Можешь хоть просто x++ делать. Или нарисовать Path2D и по нему проводить. Или сделать анимацию, но тогда надо чтобы ступеньки на уровне потом ей соответствовали.
Я уже встал. Уже иду. Обнял. На созвоне.
как пистолет в первом думе. выстрелил в противника и он мгновенно получает урон, независимо от расстояния
Наоборот для второй камеры нужны только тени и plane на которую эти тени отбрасывают невидимые объекты (но невидимые они только для второй камеры)
Полиция! Убивают!
Емнип, продублировать объекты, сделать их shadow only. По возможности (смотря какой эффект делаешь) при этом у основного объекта убрать тень. Тогда получится, отрисовка всех объектов без тени + отрисовка всех теней без объектов, плюс какой-то небольшой оверхед на дубликаты нод + оверхед на вьюпорт. В общем, если сделаешь, можешь поделиться замерами производительности.
Можно рассчитать. Пуля из калаша/м16 летит ~1000м/сек.
При 30 фпс это ~30м/кадр, при 60 фпс ~15м/кадр
Так что надо понять, есть ли на карте зона длиной больше 15-30м.
Для сравнения 5м это парковочное место (легковушка + место для выезда). Итого 3-6 машин в длину
Для примера возьмем CS dust2, для нее легко нашелся пик с измерениями, и в ней хороший микс коротких/средних дистанций
100 юнитов = 100 дюймов = 2,54м (+-на игровые условности типа огромных дверей)
Видим несколько коридоров 2000-3000 юнитов = 50-75м, это больше 15-30м, физическая не-хитскан пуля летела бы 2-5 кадров.
Это если не брать большие дистанции, в играх с открытой местностью, может быть и 300-500-800м, конечно там перекрывают леса и здания, но вот например на пик2 в таркове посередине дороги 400м стоит. А еще пуля в воздухе замедляется, на которких расстояних неважно, на 500м уже процентов на 30
Это, конечно, если упарываться в реализм. А если упарываться в фан, то это может быть в обе стороны. Не только в сторону хитскана, но и наоборот, в сторону медленно летящих ракет, от которых можно увернуться.
Разумеется речь про снайперские игры на открытой местности, где сидишь в подлеске со слонобойкой, измеряешь ветер, закладываешь поправку в оптику, прицеливаешься, выходит цель из бункера, задерживаешь дыхание. БАХ!
Мимо.
По твоей позиции летят какахи.
854x480, 0:16
Жесть чел прям в модули фигачит. Вроде логика несложная,
https://www.reddit.com/r/godot/comments/124fapg/implemented_motion_warping_into_my_animation/
https://github.com/EIRTeam/godot/blob/swansong/modules/game/animation_system/epas_animation.cpp
Это чтобы быстрее работал цикл трансформаций всех костей, что ли?
Панцушот!
А если серьёзно, наличие мелких деталей отличает годноту от проходняка на ассетах. Но и в мелких деталях тонуть нельзя, а то будешь выверять каждое микродвижение годами, а игры тонет. Или вот как аноны выше угорели по теням. За каким-то хуем пытаются сделать идеальные тени. Хотя игроки на это в последнюю очередь обращают внимание. Когда в игре скучно - начинаются доёбки к графону. Когда в игре весело - набигут моддеры и наделают модов на рейтрейс-тени и вообще, все баги сами пофиксят.
Ой, блять, я случайно секрет успеха Скайрима спалил. Срочно удолите пост!
> рабочий прототип с дефолтыми ассетами
Там кстати есть челик, Kenney, нахуячил горы ассетов на любой случай. Опенсорц! Двадэ и тридэ! Налетай, годаны!
По опыту геймджемов, еще надо сразу audiobus и базовые звуки прикрутить.
Да не только он. Он просто давно это начал делать. Еще есть: Zsky2000, KayKit, Keith @ FertileSoil, quaternius, Everything Library (тут вообще попахивает templeOs)
https://itch.io/game-assets/free/tag-low-poly
https://zsky2000.itch.io/
https://davidoreilly.itch.io/
Спасибо, братишка!
Но зачем, а главное нахуя?
Но ок, вот что я предлагаю.
1. Физически лестница - это наклонная поверхность. Тушка-капсула движется по ней.
2. Нюанс - процедурная анимация. На ступеньках маркеры, и персонаж должен наступать только на них. Это никак не влияет на движение тушки, только на анимацию ног.
В принципе, на скелетах в четвёрке это реально сделать. Но лично я не вижу смысла. Куча возни, куча потенциальных мест для бага, а заметно всё равно не будет.
А, забыл про
>Я использую просто спрайт персонажа, никакой скелетки.
Ну тогда просто синхронизировать анимацию со ступеньками, чтобы кадр с шагом приходился обязательно на ступень.
>Физически лестница - это наклонная поверхность.
Разве персонаж не будет тогда часто висеть в воздухе?
Как нарисуешь, так и будет.
Годаны, подскажите одну вещь. Я пытаюсь отловить инпут через _unhandled_input (потому что хочу его захандлить другой нодой). Но по пути кто-то третий его хандлит. Как понять, кто именно?
И вообще. Может ли вообще нода без какой-либо поверхности получать мышиные события через унхандлед? Или их гарантированно сожрёт окружение?
В дебаггере есть вкладка misc, в ней показывается на кого ты кликнул. Получать может, да - проверил на пустой Node, это та, что белая, без ничего.
Например так.
https://github.com/Yogoda/ZoneLoadingSystem
Или самом разбить на квадратные чанки.
Террейн можно делать плагинами
Но придется повозиться в таком случае со стыками, как рисовать один большой террейн. Хотя может новые плагины в 4-ке уже умеют, не смотрел.
https://www.youtube.com/results?search_query=godot+seamless+world
https://www.google.com/search?q=godot+seamless+world
https://yandex.ru/search/?text=godot+seamless+world
https://duckduckgo.com/?q=%D1%83%D1%80%D0%BE%D0%BA%D0%B8+%D0%B0%D0%BD%D0%B3%D0%BB%D0%B8%D0%B9%D1%81%D0%BA%D0%BE%D0%B3%D0%BE+%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0+%D1%81+%D0%BD%D1%83%D0%BB%D1%8F
640x360, 0:08
А ты точно не движкосрачер, выкатившийся из своего загона движкосрачерского?
А что тебя не устроило собственно? Тебе дружелюбно подсказали термин. Дружелюбно != написать игру за тебя.
>>39463
Я не годотер местный, но поддержу: никто не подвязывался писать готовое решение, дали направление, куда копать, если что-то ещё неясно -- надо конкретизировать вопрос и просить подробнее обьяснить, но если решил на указанный вектор, говорить "это самое дружелюбное коммьюнити годот?", то может не стоит заходить к злым годотерам, которые тебя бедного обижают? Или ты мазохист?
И ещё раз: я не годотер, а интересующийся, потому им предъвлять за мой пост не надо.
Режь зелёный провод.
Почему жирухи? Разве годот не лайтовый движок?
> Почему жирухи?
Потому что пицца-доставка, кока-кола, картошка-фри и крылышки.
> Разве годот не лайтовый движок?
Годот?
Почему что? Любые люди могут взять бесплатный опенсорс движок и провести геймджем?
А, понял, официальный канал. Да, помню ее обсуждали, что у нее скилл выбивать гранты и донаты. Ну вроде пока с этим все хорошо.
>>38504
>для полноценного девелопа нужна перканя
Несколько лет назад работал в нём, хочу в мобильное 2д на нём. Юнька меня сильно беспокоит в последнее время, да и 2д там какое-то хреновое.
>>38518
Самасунг Галаху? Не?
>>38523
>Ты чет взял и превратил один из самых легких и беспроблемных движков в какой-то бег с препятствиями.
Вот сейчас в голос, он не лёгкий, он другой, хоть сам редактор действительно простой. Но со своими подводными в виде кодинга, который очень требователен к разрабу, ну и конечно эти уёбищные отступы, табы блядь, я даже вспомнил почему меня так бесят эти питоновские отрыжки. И почему я сразу пересел на родной шарп.
>>38526
И почему у тебя 3 версия, если 4.2 уже есть
Она легче, меньше потребляет ресурсов, там есть все технологии которые мне нужны для 2д, сцены легко и быстро билдятся и я сразу вижу как игра будет выглядеть на планшете.
4.2 его я установил первым в надежде что там будет искоробки поддержка шарпа, но так как такого не оказалось, да и билдилось всё подолгу, решил попробовать старую версию.
Не ну и чего тутор со скрипом и матом, тыкая в милиписечные конки я почти выполнил, единственно не совсем понял какой нод отвечает за отображение кнопок на эране планшета, вроде это должен быть UI узел, судя по другим примерам, но его я не обнаружил.
Ясно.
Всё настроил по гайдам: указал галочку импорта blend-файла в настройках проекта, и указал папку блендера в настройках самого редактора. Пробовал буквально хотя бы куб закинуть, но не хочет нормально импортить и всё. ВТФ?
> и указал папку блендера
Насколько я помню, там надо указывать приложение блендера, а не папку.
Нет. Именно путь к директории нужен. К тому же Годот сам его нашёл. При попытке указать именно exe-шник, в настройке всё равно остаётся только путь к директории блендера.
Мдауш, перепутал, сорян. Ну, у меня всё работает. Может версия блендера не подходит? Может файл испорчен? Может диск с ошибками?
Не может быть связано с версией блендера? В другом треде каком то видел упоминание
Канешн, места будет жрать много, зато на вот такой случай вы будете приятно удивлены тем, что ничего дополнительно качать не надо.
И джижок и блендер самые свежие. Блендер сам работает как надо. Пытался буквально создать новый файл с одним кубом. Его тоже не может экспортнуть.
Блять. Заработало. Спасибо!
Делаю, к сожалению. Но ничего, потом с новым опытом вернусь на годот, это однозначно.
И сейчас я понимаю что подобных мест в моем коде много. Как быть?
Используй паттерн MVP (Model-View-Presener) и тогда сможешь легко переносить свою модель игры с движка на движок. Главное, чтобы модель ничего не знала о движке. Дивжок (презентер) чтобы ничего не знал о модели. И только вью будет специальным адаптером, знающим обо всех и движок будет знать о нём.
Как бы хотелось взять и обернуть все такие места в один большой try:catch
> Как быть?
Думать над архитектурой. Вот эти одноразовые таймеры - это игрушка дьявола. Они нужны только для узкоспецифичных задач. А ты их напихал повсюду. Избавляйся от них.
Что тебе нужно? 15 миллисекунд подождать? Накинь в класс переменную и аккумулируй в неё дельту, пока 0.15 не накапает.
Натыкал короче if not is_instance_valid: abort, return
Быстрее чем архитектуру перебирать. Нет, не завалюсь. Но в следующем проекте учту.
is_instance_valid()
Арт напоминает те спамные рекламы фейковых мобильных дрочилень, аля спаси принцессу над котлом.
Я чувствую незакрытый гештальт: как будто бы существует способ научить геймдеву даже таких анонов, которые чувствуют себя тупыми, но способ этот найти не могу.
Если тебе интересно, то больше всего проблем у меня сейчас с интерфейсом и звуками. Че как рисовать, делать ума не приложу. А ведь еще с кодом разбираться надо. Ну и пиздец. Залетел в геймдев с двух ног без нихуя.
# Build editor binary
scons p=windows target=editor module_mono_enabled=yes
# Build export templates
scons p=windows target=template_debug module_mono_enabled=yes
scons p=windows target=template_release module_mono_enabled=yes
# Generate glue sources
bin/godot.windows.editor.x86_64.mono --headless --generate-mono-glue modules/mono/glue
# Build .NET assemblies
./modules/mono/build_scripts/build_assemblies.py --godot-output-dir=./bin --godot-platform=windows
Dev snapshot: Godot 4.3 dev 4
https://godotengine.org/article/dev-snapshot-godot-4-3-dev-4/
Какие туториалы смотрел? Что из просмотренного пытался повторить? Что из повторённого не получилось?
> Что она вообще даёт?
Она даёт темплейты экспорта.
> должен ли я делать # Build export templates часть?
Если твой билд ничем не отличается от релизов, то не должен. Но тогда непонятно, зачем ты конпелируешь? Значит, твой билд чем-то отличается. Вот ты собрал редактор, что-то поделал в нём, а потом начинаешь экспортировать проект. Но темплейты-то ты где возьмёшь? Если движок подтянет официальные темплейты, в них не будет твоих фич, которые ты вконпелировал в редактор. Таким образом, конпелируя свой билд, ты должен конпелировать и темплейты под него.
Ок, с релизом понятно, сейчас уже собирается. Но вот это для чего тогда? scons p=windows target=template_debug module_mono_enabled=yes
> p=windows
Для венды.
> target=template_debug
Для дебаг темплейта под венду.
> module_mono_enabled=yes
Для дебаг темплейта с включённым шарпом под венду.
>Для дебаг темплейта под венду.
Так что за дебаг темплейт? Игру же в редакторе проверить можно
При экспорте есть галочка, делать релиз или дебаг версию. Видимо, это для тех, кто хочет отладить именно билд игры, а не запущенную из под редактора версию, мало ли какая то разница может всплыть, если редактор не все чистит при инициализации
Я не нашел туториалов по отрисовке ui, только о том как настроить узлы с готовыми ассетами. Про создание звуков даже не гуглил, такого нет кмк.
Где то по этим путям есть папка с шаблонами экспорта, она называется по названию версии годота.
Да вроде если ты начнешь делать экспорт, тебе напишут какой путь до них.
https://docs.godotengine.org/en/stable/tutorials/export/exporting_projects.html
Я лучше нахуй пойду, чем к юнити прикоснусь после уебанских изменений жадных пидоров.
> про это нигде не написано и никто про это не говорит
Там в окне настройки экспорта всё прекрасно написано. Как Хуан мог предвидеть, что ты не умеешь в... ой, ладно. Разобрались и ладушки! Удачной тебе сборки.
Не ходи нахуй, оставайся у нас! Хоть мы и будем посылать тебя периодически, но ты держись и не уходи. И тогда сделаешь свою игру!
Я и так делаю свою игру, нахуй вы мне сдались?
Я кстати не годотер, а интересующийся из другого треда.
И я собираюсь в определённый момент получать бабло с этого, как пойму что мне не стыдно постить свои поделия, потому юнити даже не рассматриваю.
> если по путям распихать нихуя работать не будет.
Будет конечно, так и делал, была папка 3.x.dev Или как то так.
У меня литералли в плане есть: на паузе до выхода 4.3 . Там есть метод чтобы на навмеше можно было случайную точку находить
>в определённый момент получать бабло с этого
Ты резидент? Готовься прокачивать хитрожопость и/или связи, чтобы санкции обходить.
Но я читал, что в крайних версиях iOS (12+? 14+?) депрекейтит OpenGL. Что это означает?
Значит, на iOS Godot 3 (GLES2/3) вообще не заработает, и будет просто черный экран? Как будет работать 4.3? Я сейчас прочитал что там вообще что-то в 4.3.dev3 не заработало и надо проверить свежайшую 4.3.dev4 https://github.com/godotengine/godot/issues/88964
Там предлагается какая нибудь прослойка в MetalANGLE или что то подобное? Или там WebGL 2.0?
Дело в браузере Сафари? Ситуация может как то улучишиться, вроде бы эппл сейчас в ЕС и, возможно РФ подводят к установке сторонних браузеров?
Здесь вообще указано https://docs.godotengine.org/en/latest/tutorials/export/exporting_for_web.html
Что "Godot 4's HTML5 exports currently cannot run on macOS and iOS due to upstream bugs with SharedArrayBuffer and WebGL 2.0", ну насколько мы поняли SharedArrayBuffers уже исправлены, а про проблемы WebGL 2.0 я еще не нарыл.
Кто-то тестил со свежего айфона? Например на итче или ЯИ, игру на какой нибудь версии 3.5.х или 4.3.х?
Какие вообще варианты? Сделать игру на 3 и забить на iOS в вебе? Делать на 4-ке, но заработает ли? В принципе я читал что на я.играх процент игроков с мобилок может быть и низким.
Эпл вообще для богатых. И для богатых пользователей и для богатых разрабов. Если у тебя нет денег на эпл, чтобы лично девелопить на живом железе, то ты там не желателен, тебя не звали, тебе не рады, уйди оттуда и не приходи, пока не станешь богат.
Когда ты игру сделаешь? И ваще.
та погоди ты, дай лестницу в платформере доделаю
Делаю меню выбора персонажей, хочу чтобы сигнал pressed() от кнопки передавал в корневой нод или сразу в кнопку Play - как лучше? название этой кнопки.
Вот типа есть 2 кнопки: SelectSlavik с надписью SLAVIK, и SelectBatya с надписью BATYA. При нажатии на любую из кнопок она посылает pressed(self.text) (либо кастомный сигнал, если с помощью pressed нельзя ничего передавать, ещё не разобрался), а в принимающем скрипте стоит одна функция
func _on_YOBA_button_pressed(characterName):
// selected_character = characterName # соответственно SLAVIK либо BATYA
которая ловит текст кнопки и сохраняет его, чтобы при нажатии кнопки Play началась игра выбранным персонажем
>Может ли узел принимать сигналы от нескольких кнопок одним методом?
Конечно. В твой дальнейший текст не вчитывался, ты главное соедини сигналы правильно.
$SelectSlavik.connect("pressed", self, "onPressed", [$SelectSlavik])
$SelectBatya.connect("pressed", self, "onPressed", [$SelectBatya])
func onPressed(button):
print(button.text)
Не помню как в4-ке коннект пишется.
Вроде, $SelectSlavik.pressed.connect( и так далее
Сигнал в четвёрке превратился в объект первого класса! Не знаю, что это значит, но пишется так:
> Slavique,pressed.connect(self, on_pressed, [Slavique]
ху-е-та. Нейронка не умеет в 2д пиксель арт, а сидеть перерисовывать за ней еще геморней чем самому рисовать. Хотя.. Запалю годноту анонам, для асеприте, платную конечно, но тот кто сможет ее себе позволить нихуя не пожалеет, pixellab.ai кличат, эх были бы у меня лишние деньги и возможность оплачивать..
>pixellab.ai
Посмотрел их. Впечатляет. Особенно фича с consistent style. И в анимацию умеет. Но все равно анимирование занимает по 20 минут, а это, по моему мнению, слишком много для такого унылого занятия. Подожду когда анимацию сделают в 1 кнопку, а пока продолжу свое простенькое 3д.
лольнул
> pixellab.ai
Годно.
Но я так понимаю она только генерирует пиксельарт на основе уже имеющегося стиля + описание?
Есть ли что-то подобное или может какой пайплайн, чтобы генерировать пиксель-арт(фоны\элементы интерьера и персонажей) по одному только описанию?
Все никак не могу найти 2д художника для мобилки, поэтому думаю перекатиться в пиксельную графику и нейронки.
>Все никак не могу найти 2д художника для мобилки, поэтому думаю перекатиться в пиксельную графику и нейронки.
Так попробуй сначала просто нейронки для 2д, не пиксель.
Готовлюсь.
Что-нибудь раньше делал из игр? На любом движке.
> у годот проблемы с большими играми
Проблемы с большими играми не у движка, а у Кирилла, блять, сколько можно вам повторять? Напридумываете себе, что можно скайрим в одно ебало сделать, а потом жалуетесь, что движок виноват.
При виде сверху - нет, я уже писал, бери аддон Zone loading, или сделай свои квадратные чанки, при виде сверху нет тех проблем что есть у игр типа геншина или гта, где ты можешь залезть на вершину горы и тебе надо видеть вообще все, и гору и несколько городов с разными домиками и разные локации с лавой, водой и так далее. У тебя только то, что есть в кадре плюс минус.
Второй твой бро это Multimesh Instance тоже как вариант через плагин Scatter. Потому что на уровнях часто много повторяющихся вещей, типа поручней-столбиков.
Третий бро это пулы объектов, для пулек и всего такого.
Еще желательно сделать загрузку многопоточной и включить прекомпиляцию шейдеров.
В принципе за неделю-две можешь сделать прототип, скачав прям готовых моделек которые в этом треде даже кидали, и узнать подходит или нет.
Так что вряд ли большой мир внесет какие-то дополнительные проблемы против просто одной 3д сцены (производительность которой ты тоже можешь оценить на всяких демках)
Собрать что ли самому вомпирсурвайлайк по быстрому...
Забавно, в киберпанке с точностью наоборот, движок отражает всё, кроме персонажа.
Нет ты!
Тоже сначала упоролся, но увы это практически не получится использовать. Ну только если у тебя не что-то вроде казуалки где эти картинки просто как фишки будут двигаться.
А еще, есть такая проблема, которая становится понятна после очень долгого использования далле. Это видно по твоим крайним пикам - нейронка попадает в некий пузырь стиля, и поэтому результат будет слишком узнаваться, потому что и другие игроделы будут пользоваться ей же. Ну это не считая мелочи, что надо сначала как то привести это к пиксельной сетке (тут такую штуку кинули, но я пока не пробовал https://github.com/Astropulse/pixeldetector )
*В годот
Она и так и так генерит. Можешь и голое описание совать, можешь и референсы скармливать.
Скачай любой из десятков шейдеров и посмотри как там сделано
Свойствами в инспекторе.
Забавная история, в общем "так исторически сложилось", с точки зрения программирования, Quad определяется как 4 точки по углам, а Plane как точка в пространстве и угол. Причем про Plane в 3-ке долго висело предупреждение что он deprecated из за глюков, но выяснилось что это не глюки, а математика так работает, и надо просто его сабдивить на большее кол-во кусочков. В общем в результате по опросам так и не смогли определиться какой из них нужнее, квады для частиц и постпроцесса по умолчанию поперек экрана, а плейны горизонтально для самодельных террейнов.
https://github.com/godotengine/godot-proposals/issues/4516
Фига подробности. Вроде понял. Плейн значит сабдивайдим на под-плейны, в результате получаем террейн, а квад он квад и есть. И если нужно простое ровное полотно, то используем квад.
Это потому, что многие паттерны пришли совсем из другой индустрии - корпоративные, тяжелые приложения и сайты, и решают другие задачи, в частности взаимозаменяемость работников.
Паттерны - это не магия, это просто повторяющаяся закономерность в коде, которой дали имя. А использовать или не использовать надо смотреть индивидуально. В частности с точки зрения оверхеда, на который в корпоратах покласть, клиенты подождут.
Об архитектуре надо думать, в любой игре больше чем на недельный геймджем. Когда думаешь, как расположить ноды в сцене, разделить ли визуал и коллайдеры на отдельные ветки, как сделать всплывающие окошки, как сделать сцену, чтобы ее можно было переиспользовать на другом уровне или кастомизировать врага, будешь ли использовать сцену или json - вот уже и архитектура.
Поигрался, прикольно, но пока нет.
Продолжу дальше пилить логику проекта и прототип доделывать, визуал потом. Думаю это верный путь.
То, что ты перечислил, приходит с опытом и делается практически автоматом. Думаю чел на скрине говорит про вот эти бесконечные переписывания кусков кода, чтобы удовлетворить своего внутреннего архитектора-окрщика, хотя в целом и так ок, и переписывания можно было избежать добавив десятку ифов. Этим заниматься можно долго и масштабно, а игра тем временем не делается.
Плюс как заметили в том треде, корпоративные сайты и приложения поддерживаются долго, их постоянно надо дорабатывать и актуализировать. Игры это "релизнул и забыл".
>Игры это "релизнул и забыл".
Зависит от игры, планов на расширение/дополнения, сингл/мульти направленности особенно.
Например, делаю игру с несколькими механиками и уровнями, если заходит, захочу добавить новые главы, новые механики, чтобы их просто добавлять без переписывания всего.
Играю в одну ммо которая тянет уже больше 15 лет. И там постоянно у них боль и страдание, очередная обнова привела к - крашам от звука нового пета, крашам от выхода в меню, тормозам если выйти в другую локацию, народ бугуртит и массово отказывается от подписок. Конечно мои игры 15 лет не проживут, но и одноразовыми делать не хочется.
>захочу добавить новые главы
Если популярность имеется, то почему бы тогда не сделать вторую часть игры? Кэша больше, видимость выше. К примеру есть франшиза, Swords and Sandals, автор - соло-идюк, последние версии как раз на годоте пилит.
>в одну ммо которая тянет уже больше 15 лет
Во что гоняешь?
Compositor это я так понял задел на будущее на эффекты типа планарных отражений https://github.com/godotengine/godot-proposals/issues/7916
А по аттрибутам, там теперь (авто)выдержка + на выбор DOF или фокусное расстояние. Это вынесли из WorldEnvironment что ли?
А у меня не время дня и ночи, а обычный омнилайт у персонажа в руках, но я уже заебался.
Ну кстати не уливлюсь если омнилайт настроить сложнее чем дирекшонал
Пиздец нахуй блять. Каким же надо говноделом быть для такого. Я вот открываю те части проекта, которые писал месяц назад, и
а) легко их читаю и понимаю, как этим пользоваться,
б) не хочу ничего поменять, всё уже хорошо выстроено,
в) оно прекрасно расширяется под нужды растущего проекта,
И вдобавок
г) я могу скопипастить части из прошлых проектов с минимальными изменениями.
И это охуенно ускоряет разработку. Просто, блять, СРАЗУ писать хорошо. Приучиться не делать говна изначально - и разработка попрёт реально быстро. И дизигн паттерны как раз для этого и нужны.
А вот если открыть мой сааамый первый проект, то там говно - движущая сила. И именно поэтому наступил момент, когда я не смог его дальше писать, потому что оно было непонятное, не расширяемое и просто кривое.
Не бугурти, а учи паттерны.
А покажи плиз образцы своего кода. Насладиться красотой.
Как делать настройки.
1. Создаём класс, описывающий опцию. В нём должны быть поля: type, default, value, description. Опционально (очень желательно) в сеттерах проверять типы default и value через typeof. Опционально описываем _init(dict: Dictionary), чтобы легко создавать экземпляры из словарей.
2. Также внутри этого класса есть сигнал value_changed(new_value), который вызывается прямо в сеттере value. Вот в нём-то вся мякотка.
3. Сами экземпляры класса храним в словаре. Опционально описываем функции-интерфейсы get_option и set_option, чтобы работать со строгой типизацией.
4. При описании ноды, на которую влияет та или иная настройка, делаем так: в _реади чекаем опции и коннектим сигнал value_changed к себе в функцию, где соответственно обрабатываем.
Таким образом, не нужно перегружать настроечный скрипт - в нём ТОЛЬКО настройки. А всё их действие описывается там, где ему и место. И можно наделать неограниченное количество нод, на которых влияет та или иная опция. И вообще, такой скрипт без напряга пишется за часочек, а использовать можно где угодно.
Бонусом. Описывать сами настройки в каком-нибудь json-е или csv, и тогда скрипт будет вообще элементарно переносимый из проекта в проект.
>не хочу ничего поменять, всё уже хорошо выстроено
Пиздишь, антош.
Если тебе ничего не хочется переписать - тебе просто похуй на то что ты написал.
Есть еще вариант: он за это время никак не развился.
Но мы, безыгорники, можем цепляться к нему как угодно, он-то знает, что у него игры есть, а у тебя нету.
Вообщет он не писал что у него есть игры. Он писал что у него есть проекты.
Не могу делать игры на текущем релизе. Надо подождать 4.3.
> он за это время никак не развился.
Все так.
Я пока тоже безыгорный, но у меня есть реально работающие проекты использующие мой код. И из этого опыта могу сказать, что процесс улучшения бесконечен. Конечно, это не отменяет того, что сразу надо страться делать как минимум "нормально".
Ну, можешь каким нибудь upx,ом зажать, если без стороннего пакеджа.
Пиши код максимально говнисто, чтобы прям ничего не было понятно. Пили огромные картинки, чтобы заебывало их просматривать. Музло тоже делай такое чтобы не возможно было слушать, скрип там или еще чего добавляй. И норм.
Этот вариант работает. Но x/y/z у меня тоже строки. То есть, я бы хотел получить именно финальное значение по строке.
Либо циклом через парсинг, либо см. Исходники AnimationPlayer, он так умеет
Может быть есть какой то готовый метод, я не искал
Ок, спасибо. Уже нашел другой способ решить свою проблему, без получения свойств, но на будущее надо будет разобраться.
Так же как в трёшке (с несколько другими именами, например origin вместо translation). Так же как тебе предлагали выше: >>40672
>>40673
> Но x/y/z у меня тоже строки.
Хоть строки, хоть, були. Функция get() возвращает тебе значение свойства. Если значением является объект со свойствами-строками, ты должен вызвать у него функцию get(). Парсинг путей вида "super.sub.sub.property" в движок не закладывался.
> То есть, я бы хотел получить именно финальное значение по строке.
То есть, тебе надо самому велосипедить свою рекурсивную функцию получения свойства вложенных объектов по строке-пути.
Условно смешно.
И кроме того, трансформ в экосистеме годота не является объектом, является базовым типом, и не содержит функции get() которая есть только у объектов.
Поэтому, если писать рекурсивную функцию, в неё придётся заложить длиннющий паттернматчинг для всех базовых составных типов, типа трансформов и векторов. К объектам применять гет, к типам применять вложенные матчи.
Вот примерно так. Только придётся расписать ещё кучу паттернов в матчи. Ради мнимого удобства.
...
Лишь бы игры не делать.
1) Много ли съедают fps ноды Area3d, которые подключены к скрипту через сигналы "area/body entered/exited"? Если да, то что можно с ними сделать кроме удаления и упрощения ИИ?
2) Много ли съедают fps ноды типа CSG?
3) Много ли съедают fps сигналы от кнопок типа "sex_button_just_pressed()"? Если да, то как перестроить управление? Есть ли смысл все кнопки засовывать в функцию _input(event) или это не даёт никакого результата?
4) Может ли экспорт повлиять на fps на разных android устройствах? Я пробовал устанавливать sdk под более старые смартфоны (lollipop 4.1), но результата это не дало.
5) Много ли жрут fps операции с Vector3 и обращением к нему? Есть ли какие-то способы его немного оптимизировать?
6) Есть ли смысл создавать отдельные ноды (белые) для крупных участков кода вроде логики передвижения в 3д пространстве или всё можно хранить в одном скрипте и просто обращаться к функциям внутри единого скрипта без потери производительности?
7) Таймеры — годнота? Что можно использовать для периодичного запуска функций с проверками без таймеров (я слышал, что они ненадёжные и могут сильно влиять на фпс, ведь они просчитывают постоянно сколько прошло времени и проверяют достигли ли они конца)?
7) Какие есть другие способы повышения производительности кроме растаскивания всех операций по разным функциям, которые находятся вне _process(delta) и _physics_process(delta) без постоянного обращения не необходимых в каждый момент времени проверок?
1) Много ли съедают fps ноды Area3d, которые подключены к скрипту через сигналы "area/body entered/exited"? Если да, то что можно с ними сделать кроме удаления и упрощения ИИ?
2) Много ли съедают fps ноды типа CSG?
3) Много ли съедают fps сигналы от кнопок типа "sex_button_just_pressed()"? Если да, то как перестроить управление? Есть ли смысл все кнопки засовывать в функцию _input(event) или это не даёт никакого результата?
4) Может ли экспорт повлиять на fps на разных android устройствах? Я пробовал устанавливать sdk под более старые смартфоны (lollipop 4.1), но результата это не дало.
5) Много ли жрут fps операции с Vector3 и обращением к нему? Есть ли какие-то способы его немного оптимизировать?
6) Есть ли смысл создавать отдельные ноды (белые) для крупных участков кода вроде логики передвижения в 3д пространстве или всё можно хранить в одном скрипте и просто обращаться к функциям внутри единого скрипта без потери производительности?
7) Таймеры — годнота? Что можно использовать для периодичного запуска функций с проверками без таймеров (я слышал, что они ненадёжные и могут сильно влиять на фпс, ведь они просчитывают постоянно сколько прошло времени и проверяют достигли ли они конца)?
7) Какие есть другие способы повышения производительности кроме растаскивания всех операций по разным функциям, которые находятся вне _process(delta) и _physics_process(delta) без постоянного обращения не необходимых в каждый момент времени проверок?
Да, детка, я такой. По ссылке в описании можешь сделать донат.
P.S. На моём старом андроиде логика 3д мира работает, я могу взаимодействовать с ним, скрипты работают, но сами объекты не показываются, плюс я использую две камеры — от первого и от третьего лица, которые переключаются через .set_current(), где я сначала отключаю одну камеру, затем включаю другую.
Но по оптимизации есть что-нибудь? Пост касается не только андроидов, но и в целом затрату ресурсов от разных функций и нод годота
Спасибо за ответ
Я думаю у людей нет идеи для игры, которую они хотели бы реализовать. У меня тоже всегда было желание сидеть в движке копаться, но пока не придумал сам себе игру, не мог ни с чего начать. Сейчас вот сижу, пилю потихоничку, вот уже месяц как, и даже не планирую заканчивать, каждый день только больше solution'ов придумываю
Со старыми андроидами все неоднозначно. Там цирк с конями, разброд и шатание от чипа к чипу.
Мои наблюдения таковы. Снижай разрешение - часто дает наибольший прирост фпс. Динамический свет не используй. Меши - чем проще, тем лучше. CSG - нахуй. Гридмап - нахуй. Пройдись по настройкам проекта, выключи лишнее, снизь качество. GLES2 на старых андроидах шустрее и стабильнее чем GLES3.
Спасибо за ответ!!!
>GLES2 и GLES3
А можно ли через какую-то функцию менять рендер? Допустим, сделал я настройки графики, а чтобы применить надо было бы перезапускать игру. Такое возможно?
Вау, спасибо огроменнейшее! Я запомню тебя
При изначальном создании тоже, увы.
>Creating CSG nodes has a significant CPU cost compared to creating a MeshInstance3D with a PrimitiveMesh.
И "запечь" их, вроде, никак нельзя.
Имхо на андроиде это делается несколько по другому, ты делаешь две разных APK с глес2 и глес3, а потом когда выкладываешь в гуглплей, указываешь каким мобильникам какие давать скачивать. Но, я теоретизирую. не говоря о том, что APK официально уже ВСЕ, и надо собирать ABB И где ты узнаешь список мобильников тоже вопрос. А еще там можно блеклистить слабые модели, чтобы им вообще не давать скачать игру, так даже геншин делает.
Запечь их можно простым аддоном который конвертит их в .obj.
Ну насчет изначального создания, это можно скрыть загрузкой уровня, остается спавн, его тоже можно заспавнить и просто передвигать в нужное место. Наверное.
Помню ГТА 5 проходил на "нормальных". Ну это минимальные так у них назывались. Без отражений и теней.
Представитель Sweet Baby Inc, залогинься.
Покажите видос как реализовать rope в 3 D, на примере каната или верёвки
Спасибо
Что делать?
>закидываю пнг файл
Посмотри что ты его поставил в целочисленных координатах x, y.
Поставь в проекте галочку gpu pixel snap (в 4 по другому называется)
Дальше кури мануал https://docs.godotengine.org/en/stable/tutorials/rendering/jitter_stutter.html
Сложно сказать, господин анонс. Зависит от версии движка и от стиля, который ты хочешь. Тру™ пиксель игра делается через stretch mode viewport, низкое нативное разрешение (желательно соответствовать х2, х4 от нативного разрешения) и советы анона выше. Это советы для тройки.
Фейковая пиксель игра, когда пиксели не строго по внутри-игровой пиксельной сетке, - через мод 2д, на разрешение уже похуй.
>низкое нативное разрешение (желательно соответствовать х2, х4 от нативного разрешения)
Отвлекся и коряво написал. Низкое нативное разрешение, и тест разрешение х2 выше нативного.
Как сделать спаун врагов внутри этих коллизий, чтобы избежать ручного набора координат? Типа если передвину/поменяю размер, не менять код.
Я бы брал центр ареа2д, добавлял к нему рандомные отступы по х и у, потом бы проверял находится ли эта потенциальная спавн-точка внутри коллизий. Если нет - повторить генерацию точки.
Если у него прямоугольные неповернутые коллизии, то x = от левой до правой, y = от верхней до нижней гарантрованно внутри коллизии.
Правильный подход. А у меня в похожем случае вообще полигон2д был, и я не придумал ничего лучше чем перебирать примерные значения. Ну и норм работало.
С полигонами сложнее, можно попробовать их триангулировать и потом генерить внутри одного из треугольников (может быть можно даже по формуле), но вот вроде как не любой произвольный полигон триангулируется. (Искал как то либу для отрисовки генеренных SVG, а там прямым текстом пишут что она может зависнуть, такая то печаль).
А если брать рандом, то при неудачной форме может долго искать подходящую точку, хотя скорее всего это несуществуенно. Но вдруг не уложится за кадр.
Мож отдельной переменной для проверки серануть?
Не, area у меня в отдельной функции. Игрок в неё входит, она срабатывает и должна выключиться.
Сигнал body_entered надо обрабатывать.
Делаеш ей disabled или queue free
В сцене хочу озвучить звук шагов, однако столкнулся с проблемой, что при
if Input.is_action_pressed("down"):
звук проигрывается только раз, причем после отжатия кнопки, а при
if Input.is_action_just_pressed("down"):
Вообще не проигрывается.
Цель вижу в том, что нажимается кнопка, идет звук шагов. Отпускаю, должен стихнуть.
Мне отдельно звук покурить или что?
Проверь свойства повтора на файле в импорте, и на самом плеере. По крайней мере в тройке с этим хаос был.
>if Input.is_action_pressed("down"):
>проигрывается после отжатия кнопки
Рассмотри такую возможность. Твое условие работает постоянно, пока ты держишь кнопку, и следовательно постоянно у тебя делается audioplayer.start(). То есть аудиоплеер проигрывает первую миллисекунду, потом ты его снова стартуешь, и он снова проигрывает первую миллисекунду, и так по кругу. Как результат ты слышишь ничего. А когда кнопку ты наконец отпускаешь, у плеера появляется возможность проиграть весь файл, потому что ты ему мозг стартом не ебешь.
> повтора на файле в импорте, и на самом плеере. По крайней мере в тройке с этим хаос был.
Блин, он мне не дает залупить файл, говорит этот файл был импортирован, поэтому не может быть редактирован. Втф?
>Твое условие работает постоянно.
Да, соррян, ступил.
И реимпорт внизу нажать не забудь.
Я же говорю, он просто не дает это сделать, выдает:
"этотресурс был импортирован, поэтому он не редактируем, измените его настройки в панели импорта, а затем реимпортируйте"
Я прожимаю все настройки, реимпортирую, но это просто не работает
Это странно. Можешь сделать скрин окошка как выше?
Озарений хватает, сил/времени реализовать их не хватает.
Кидай. Я не против.
Кидай. Я за.
В 4-ке velocity это не переменная, а уже поле физикс чарактер боди. Ну вообще да, логичней сначала селать dir и потом умножить на скорость.
ну встроенное свойство, которое уже используется внутри физ движка для движения.
А не объявленная тобой переменная var velocity.
https://docs.godotengine.org/en/stable/classes/class_characterbody3d.html#class-characterbody3d-property-velocity
>1. Проект переведён на физический движок Jolt.
И чо как? В веб он умеет? В андроид? Какие подводные заметил?
Проект делаю для пк, поэтому про веб и андроид сказать не могу. Перешёл на Jolt, потому что когда делал контроллер персонажа, его трясло.
Персонаж-двачер. Но да. В 4 дефолтный физон сырой.
А нахуя? Перемещать по вектору - это тупо сложение. А из скорости и направления это ж надо тригонометрию считать.
Ну понадобится тебе угол направления - сделаешь Vector2.angle(). Но он обычно не нужен.
> Почему во всяких гайдах, в той же книге, направление игрока записывают в переменную velocity? Почему не direction условный, velocity это же скорость.
velocity - это direction умноженная на speed
Это только первый шаг, на одном рейкасте, а дальше придется уже и A-star прикручивать чтобы найти путь звука огибающего углы.
Средний. Для того кол-ва фич, что есть, очень даже. Я использую 3-ю версию для лоуполи 3д. В противном случае мне бы пришлось ковыряться в threejs довольно низкоуровнево. Перформанс, надо срезать многие фичи, многое упрощать и оптимизировать. Для 2д, ну наверное можно взять что то чисто js. А так, возьми и попробуй, сделать прототип и померять нетрудно. В конце концов потом прототип перенести на тот же threejs. Как минимум у тебя остается удобный редактор.
Хз, все свои игры выложил и под веб тоже. По стилям совсем разное. Пиксели, 2д, 3д. Никаких проблем. Я чет думаю ты читаешь каких-то ноудевов, которым лишь бы причину найти ничего не делать.
Есть у меня global скрипт, а в нем заяц, в зайце — утка, в утке — яйцо некий словарь items = {} с другими словарями внутри. И вот в одном из скриптов я делаю так:
var item = global_list_of_items.items[item_name]
item["i_amount"] = 33
Только вот при изменении item["i_amount"] меняется значение ключа "i_amount" в исходном словаре items = {} - становится равно 33
Просто duplicate не сработал:
var items_copy = global_list_of_items.items.duplicate()
var item = items_copy[item_name]
item["i_amount"] = 33
А вот duplicate для каждого ключа по отдельности сработал:
var copy_items = {}
var original_items = global_list_of_items.items
for key in original_items.keys():
copy_items[key] = original_items[key].duplicate()
var item = new_items[item_name]
item["i_amount"] = 33
Но получается какая-то хрень, т.к. мне много где надо будет обращаться к списку предметов. В принципе я могу эту функцию засунуть в глобальный скрипт с предметами, чтобы сократить запись:
func duplicate_items():
var copy_items = {}
for key in items.keys():
copy_items[key] = items[key].duplicate()
return(copy_items)
В других скриптаз будет:
var copy_items = global_list_of_items.duplicate_items()
var item = copy_items[item_name]
Либо сделать сеттер в глобальном скрипте, который бы менял значение словаря items на исходное при любом изменении, хммм
Есть у меня global скрипт, а в нем заяц, в зайце — утка, в утке — яйцо некий словарь items = {} с другими словарями внутри. И вот в одном из скриптов я делаю так:
var item = global_list_of_items.items[item_name]
item["i_amount"] = 33
Только вот при изменении item["i_amount"] меняется значение ключа "i_amount" в исходном словаре items = {} - становится равно 33
Просто duplicate не сработал:
var items_copy = global_list_of_items.items.duplicate()
var item = items_copy[item_name]
item["i_amount"] = 33
А вот duplicate для каждого ключа по отдельности сработал:
var copy_items = {}
var original_items = global_list_of_items.items
for key in original_items.keys():
copy_items[key] = original_items[key].duplicate()
var item = new_items[item_name]
item["i_amount"] = 33
Но получается какая-то хрень, т.к. мне много где надо будет обращаться к списку предметов. В принципе я могу эту функцию засунуть в глобальный скрипт с предметами, чтобы сократить запись:
func duplicate_items():
var copy_items = {}
for key in items.keys():
copy_items[key] = items[key].duplicate()
return(copy_items)
В других скриптаз будет:
var copy_items = global_list_of_items.duplicate_items()
var item = copy_items[item_name]
Либо сделать сеттер в глобальном скрипте, который бы менял значение словаря items на исходное при любом изменении, хммм
Ну видимо чувак в словари добавляет внутриигровые предметы и по мере прогресса добавляет в словарь новые.
Но из его поста выходит, что у него int 33 передаётся из словаря по ссылке. Нонсенс.
>>41366
> И вот в одном из скриптов я делаю так:
> var item = global_list_of_items.items[item_name]
> item["i_amount"] = 33
> Только вот при изменении item["i_amount"] меняется значение ключа "i_amount" в исходном словаре items = {} - становится равно 33
Словари и массивы (и, вроде бы, теперь Callable) в гдскрипте передаются по ссылке а не по значению. А если понадобиться передать 33 по ссылке, то можно обернуть его в массив или объект
По итогам могу сказать что хоть для популярности крейзигеймс 3/5, но для качества игры - 5/5. Их команда мочераторов дала мне именно тот фидбек, которого я не мог добиться от обычных юзеров. Тогда как юзеры, в ответ на мои вопросы, выдавливали "эээ пук кек ну вот тут чет непонятно, ну хуй знает", то эти мочухи все четко сформулировали и навалили советов как исправить.
У меня все.
О чем игра то?
Тогда встаёт вопрос, как добиться такого же внимания от чмодераторов, чтобы также помогали, а не игнорили, как других?
Хуй их знает. Моя игра не супер-популярна по меркам крейзигеймс, но внимание мочухов я получил. Ничего особенного не делал. Игра висела на рассмотрении дня 3, потом ответ "исправьте a, b, c". Через пару месяцев отправлю им еще одну старую свою игру, отпишусь по результатам.
Еще они предлагают рекламу встроить в саму игру через их апи. Я отказался. Без встроенной рекламы ты получаешь процент от той рекламы, которая у них на страницах показывается. За пару дней мне пара евро набежала. Вывод через палку.
Обрати внимание на такой аддон
https://godotengine.org/asset-library/asset/2153
Правда там идет один большой js на все платформы. По уму надо взять другую их js-core репу и там собрать отдельно под каждый стор.
>Absolute Games
Падажжи, это те которые аг.ру? Хрена эти деды перепрофилировались.
Спасибо. Просто не хочется рекламу в игру пихать. По крайней мере не в эти две, они для души. Для них я ставлю pay what you want когда платформа позволяет, либо отдаю бесплатно. Рекламу может потом, для бездушной мобильной дрочильни.
Попробовал через scale.x , но если работает физика, скейл сбрасывается и объект смотрит в ту же сторону.
Хочу просто рагдолл тело спавнить после смерти нпс
> следовательно избавился от необходимости в sharedbufferarray,
А в чем проблема? Говдод не может в sb что ли?
ЕМНИП scale.x=-1 у физических тел не работает потому что это будет nonuniform scale. там надо сами коллайдеры подвигать. Ну если у тебя простой вариант ты можешь просто спавнить один из вариантов, левый или правый.
Ну да, я там как-то сложно не делал. Спасибо
Дауж, хуевая жизнь с такими издателями.
Так понимаю это всё из-за того что утечки между играми возможны, потому что один и тот же домен?
>Анон, с которым я разговаривал в прошлом треде, говорил что они отказывают молча - без объяснения причин.
Как я читал где-то в тележных чатиках: они отказывают молча, если им игра "не подходит". Хуй знает, какие там критерии подхожести, но у меня вот так вышло, причём даже другой билд залить и снова отправить на рассмотрение нельзя.
Очень рад за тебя, анонче. Завидую, но по-товарищески. Не хочешь ли теперь на ЯИ сунуться? Пройдя одну мочерацию, с другими должно быть полегче. Говорят, с разных платформ разная статистика, кому-то с яндекса даже больше капает.
Я понимаю так. SharedBuffer имеет много подводных камней безопасности, от спектра/мелтдауна, до утечек. Поэтому его включают вместе с CORS: same-origin, который изолирует каждый процесс и для сервера, и для клиента. Изоляция на клиенте затрудняет работу скриптам с третьего домена на странице с игрой. А именно через эти скрипты обычно и показывается реклама. И не все рекламодатели успели научиться это решать. Так что банально проблема в бабле.
Нет, тем более, большая часть изменений у меня в логике игры, а не визуально заметные. Вот, я сегодня изменил логику хранения ассетов неписей, чтобы мог их наборы масштабировать, прикрутил фичу к взаимодействию с неписями, пофиксил пару багов и сделал ещё ассеты, некототорые ассеты переделал.
Что я тут мог бы показать кроме кода? Ассеты, но там ничего интересного.
А ты понимаешь, что второй скриншот выглядит ХУЖЕ первого, несмотря на тени? Потому что "затемнить дохуя, пережечь и влепить лампочки" не равно "выстроить освещение сцены"
Ебать. А ведь это серьёзней чем я думал. Т.е. sb полностью блокируют нахуй любую рекламу и решить это практически невозможно, если не использовать рекламу которая будет встраиваться в домен, что звучит невозможно нахуй. А там ещё всякие говновсплывающие окна а авторизацией не работают. Охуеть просто.
Ебаные аутисты и пидорасы опять откатили прогресс в прошлое. Как же заебало.
Как связать одно с другим? Мне не хочется вручную прописывать миллион одинаковых сигналов для каждого объекта, а как сделать более лаконично и по умному я не знаю.
Не совсем понятно, как и где у тебя планируют располагаться кнопочки, но можешь сделать один сигнал, а в нем передавать разные параметры в зависимости от кнопочки
кнопки будут распоагаться в отдельном скроллбаре, и какой что нужно прописать в сигнале, чтобы к конкретному экзмепляру другой сцены передать данные?
> а как сделать более лаконично и по умному
Через экспорты.
У объекта "вася" в скрипте ты должен сделать
@export var GUIButton
И привязать к ней все сигналы один раз. Далее, сколько бы ты вась не поставил на сцену, вручную или скриптом, ты должен загрузить в GUIButton валидный экземпляр. В редакторе ты через инспектор выберешь существующую ноду. Если надо кодом, то
> var v = load("vasya").instantiate()
> var g = load("gui").instantiate()
> GUI.add_child(g)
> v.GUIButton = g
> Mobs.add_child(v)
Ну, как-то так. НО! Без чёткого понимания архитектуры твоего проекта, давать советы бессмысленно, уверен, ты нихуя не понел из моего поста.
Спасибо анон что пояснил, а я даже не думал о таком, вся синхронизация через SAB была. Ебать вот это открытие-то нахуй. Чем дольше вникаю тем глубже кроличья нора. Нужно обязательно модифицировать код и добавить варианты работы и синхроанизации каких-то данных между потоками.
Жозенько конечно, хорошо что наткнулся на это, иначе бы обосрался и пришлось в продакшене пытаться переписывать свой движок.
В целом идея такая - иметь несколько воркеров, синхронихировать время через RAF, синхронизировать данные через postmessage с transferable объектами. Будут полностью независимые потоки, но с передачей данных между потоками. Впринципе должно работать. Но синхронизация такая слишком сложная. Но у меня работать будет. Вероятно годот и хуан с этим не справится никак вообще, слишком сложно.
> годот и хуан с этим не справится никак вообще
Вообще-то справляется. Речь о том, что не справляются хостеры игор, не справляются с многопоточными играми.
> у меня работать будет
Скажешь "гоп" как выскочишь.
> Вообще-то справляется.
Нет, не справляется и не справится, слишком сложная реализация. Отдельные подсистемы нужно на разные ядра раскидывать и синхронизацию вводить для них. Либо одни и те же системы с сложной синхронизацией. Короче не айс.
> Речь о том, что не справляются хостеры игор, не справляются с многопоточными играми.
Нет, просто обоссаный хром обоссался, создал дыру и не смог нормально изолировать сайты. Хз когда исправят, годиков через пять, наверное, не меньше. До той поры у годода нет шансов.
Там суть в том что рекламу не сможешь встроить в страницу, потому что реклама может из разных источников быть и эти источники могут уже с твоего сайта воровать данные из-за этой самой дыры.
> Скажешь "гоп" как выскочишь.
Оно уже работает через наивный подход, но наивный не самый производительный и красивый. Дальше попишу немношк, покумекаю как сделать лучше и красивее.
На дизельном топливе, керосине, бензине, электричестве от картошки, фотосинтезе, ветряках. Че как маленький.
Когда молекулы заработали, робот перестал зависеть от дневного света, смог оторваться от ранее выращенных волокон и углубился дальше в лес, затем по руслу реки, к небольшому городу N, где и спрятался под большим автомобильным мостом.
Так выпьем же за теорию торсионного поля!
Украл для сюжета своей игры, ждите меня миллиардером.
Господа анонсы делающие пиксельарт игры, как вы боретесь с тряской линкрелейтед? Впринципи в ексклюзив фуллскрин она практически незаметна, но это на фуллхд монике, как будет на 2к и 4к хуй его поймешь. За оконный режим вообще молчу, там тряска на уровне шиза из движкосрача, укачать может. Пиксель перфект я не преследую, нахуй не нужон, за пиксельснап трансформа знаю, но эта хуйня может вызвать только приступ эпилепсии.
Настройки проекта если нужны: размер вьюпорта 480х270, мод канвас айтем, скейл мод целочисленый, юзаю четверку. Из за чего собсно происходит эта тряска я понимаю, но не понимаю нахуя это было сделано так криво.
Вообще на текущей стадии проекта меня это волновать не должно, но сука, не могу успокоиться зная о такой проблеме.
Тут много моментов. Проблема в основном вылезает когда у тебя внутригровые пиксели располагаются не по пикксельной сетке. Отчасти это чинится фиксированным разрешением и запретом его менять. Второй момент - плавная субпиксельная камера (x:22.222, y:33.3333), заставляющая весь вьюпорт съезжать с пиксельной сетки. Можешь использовать вью мод 2д вместо вьюпорта. Можешь скалировать спрайты на побольше, тогда проблема менее заметна. Можешь двигать камеру только по целочисленным значениям. Еще такое видел, но не тестил: https://godotshaders.com/shader/sub-pixel-accurate-pixel-sprite-filtering/
После двух своих тру-пиксель-перфект игр перешел на лоуполи 3д и рад пиздец. И моделить проще, и использовать.
Есть еще вариант сабпиксельной камеры через шейдер.
https://www.youtube.com/watch?v=zxVQsi9wnw8
https://github.com/RPicster/Godot-Collected-Thingies/tree/master/Godot-Tutorial-SmoothCamera
>Можешь использовать вью мод 2д вместо вьюпорта
В четвёрке это и есть канвас айтем. А вот за шейдер спасибо, сейчас потесчу.
>После двух своих тру-пиксель-перфект игр перешел на лоуполи 3д и рад пиздец.
Да я если честно уже пожалел что в 2д полез, столько мозгоебли что проще в 3д уйти и начать моделировать.
>>41696
>за пиксельснап трансформа знаю, но эта хуйня может вызвать только приступ эпилепсии.
Это слышу звон, да не знаю где он, называется. Ссылка на документацию отношение к проблеме вообще никакого не имеет.
>>41697
Это не то, да и в четверке не работает.
А, я то пиксель на 3-й делаю. Как раз потому что он там доведен до ума. Конечно нету вкусных тайлмапов, ну чтож.
Я щас мельком тройку потестил, тряска тоже есть, но только у спрайта на котором камера висит, надо будет попозже сделать полную копию сцен из 4 и посмотреть как оно, мб все таки придется пожертвовать фичами 4 и сесть на 3.
>пожалел что в 2д полез
2д оно такое, да. Это все тот ебучий миф, что типа пиксель арт - просто. Типа навалил пикселей и поехал. Хуй там. Самый сложный стиль и для рисования и для работы с. При этом в годоте с ним еще норм работается, в отличии от некоторых других движков.
> у спрайта на котором камера висит
Там еще разные факторы есть, например у камеры есть свое сглаживание, у физического движения тоже.
На фейзере я в ахуе как люди что-то делают, там даже редактора нет, просто в голове отыгрываешь и на каждый пук ищешь костыли, фиксы, хуиксы. Остальные маленькие движки для веба тоже супер перегружены какой-то парашей которая лично меня отпугивает
Маладца. После первой релизнутой поделки ты стал опытней, дальше легче. Куда выложил?
Странная штука. Во первых, нужон ли там GDExtension? Во-вторых, нет поддержки мобилок в рантайме.
Пик 1: по замыслу жизни кончаются, эмитится died(), вызывается рестарт из автолоадера, меняющий сцену. Но все зависает в момент эмита died. Пути к сценам прописаны правильно, ошибок нет. Если привязать рестарт к любому другому сигналу, будь тот таймер или кнопка, то все работает!
И самый сюр в том, что died тоже работает и не виснет, но только если он прямо не вызывает рестарт!
Костыль с пика 2 работает. А если через таймер отсрочить рестарт в коде самого on_player_died, то опять зависон. Но в чем разница? КАК ЭТО ПОНЯТЬ???
died один раз эмитится или начинает спамить?
>все зависает
Прозреваю циклические вызовы. Типа, ты эмитишь died, он вызывает смену уровня, а смена уровня снова вызывает функцию. эмитящую died. Например, перепроверяет хп.
Поставь брейкпоинт и чекай.
> На фейзере я в ахуе как люди что-то делают
Программировать надо, да? Не то что годот, тут даже программировать не нужно!
Заметил что 4-ка с первого раза вообще плагины плохо подхватывает, надо хотя бы редактор перезапускать.
Да там какой-то лютый пиздец наступил с проектом. Зря я в существующий проект его подключил. Хорошо, что проект был двачетредный помогательный, и его в целом не жалко.
Скорее всего никакой мистики не будет, если ты нарисуешь схемку-диаграмму что в каком порядке вызывается.
У меня в начале знакомства тоже была похожая история. Так там дело оказалось в том, что я передвигал игрока в точку спавна, но был кадр, в котором срабатывал process, когда игрок все еще находился внутри триггера.
Наверное по простому это можно решить, внутри restart() вызвав какую нибудь disablegame() которая отключает все триггеры или реакции на них.
визуальное программирование всегда казалось мне какой-то нубтрапой, иллюзией простоты
точнее в gdscript*
Я нашёл что можно сделать autoload ноду со скриптом с собственными параметрами, но это явно нестандартный путь. Делать пустую ноду со скриптом и привязывать её в сцене? Или ещё как-то?
НО на сцене-карте мне недоступны экспорт-переменные ноды-спавнера. Они же внутри постройки сидят. Я конечно могу кликнуть по сцене-постройке, включить "редактируемые дети", и добраться до ноды-спавнера. Но это все дерево в кашу превращает. Хотелось бы, типа, указать "вот эту ноду подтягивай наверх и показывай как свою родную".
Тебе нужно ноду не по дереву адресовать? Используй группы
https://docs.godotengine.org/en/stable/tutorials/scripting/groups.html
Ты, видимо про это
https://docs.godotengine.org/en/stable/tutorials/best_practices/node_alternatives.html
В общем, кроме Node2D/3D, а также просто Node (которая не имеет позиции и прочего, но может быть добавлена в дерево)
Существует базовый просто Object, также для некоторых случаев подходит Resource.
Кроме того, ты можешь объявлять свои классы. Есть два способа
Первый, это любой скрипт (который наследуется через extend от чего то), ему можно задать class_name
https://docs.godotengine.org/en/stable/contributing/development/core_and_modules/inheritance_class_tree.html
Второй способ, это в любом месте завести вложенный класс
https://docs.godotengine.org/en/stable/contributing/development/core_and_modules/inheritance_class_tree.html
Так что ты можешь делать массив не из условных, а из вполне себе своих объектов.
https://www.youtube.com/watch?v=eBEMFcUjGno
Мне надо подобное реализовать
Казалось, что видел такой аддон, но что-то не нашел сейчас.
Но вроде бы руками сделать несложно.
Первый - буквально вручную проксируй. Вот у кого то пример нашел. Думаю тут все понятно, в сцене-карте завести такие же свойства, в их сеттере пробежать циклом по всем нужным чайлдам и выставить там.
Второй, сейчас узнал что есть такая штука как inspector plugins.
https://docs.godotengine.org/en/3.2/tutorials/plugins/editor/inspector_plugins.html
Есть какой то аддон на тему, Extendable Inspector возможно он упростит создание
Хотя, я его час поковырял, и не получилось быстро сделать то что ты хочешь.
Это надо еще копать. Но технически это возможно, потому что редактор годота это просто сцены из контролов. Просто надо разобраться как там категории добавлять, undo redo.
Из коробки такого нет. Сам такую хотел сделать, пока руки не дошли, где-то был гайд, там что то с рейкастами. Кажется этот https://www.youtube.com/watch?v=KlfFnchkDwQ
Т.е. общая идея что ты обнаруживаешь угол, на котором поворачивает веревка, и в этой точке его прилепляешь. Между этой и предыдущей точкой провешиваешь его немного, чтобы он свисал. От новой точки тянешь дальше.
Спасибо огромное, это именно та сторона, куда мне надо было искать <3
Появилась ещё одна проблема, попытался сделать сохранение данных через ResourceSaver вроде описанного тут https://gdscript.com/solutions/how-to-save-and-load-godot-game-data/, при этом сохраняется объект Resource с массивом объектов внутри. Но при сохранении элементы массива не сохраняются. Если вместо объектов в массиве будут стандартные переменные - всё сохраняет. У этого есть решение, чтобы при этом оставить сохранение как ресурса?
Нашёл в теории сохранять построчно https://forum.godotengine.org/t/read-and-save-arrays-solved/17852 , либо, возможно, JSON, но это выглядит будто бы не так удобно и более громоздко
Смотря что у тебя в массиве, посмотри в эту сторону
ResourceSaver.save(savepath, resource, ResourceSaver.FLAG_BUNDLE_RESOURCES)
If you don't use the flag "FLAG_BUNDLE_RESOURCES" the resources inside the array are instead saved as references to the resource class, this means that when loading the resources back they will just load the default resource with no aditional data.
Но может у тебя что то другое. Я не пробовал.
Спасибо, анон. Пока я решил в сцене-карте, в каждое здание, вручную добавлять ноду-спавнер. Тогда она доступна прямо на карте и позволяет выбирать все, что нужно. Геморно, но не так кашево как включать редактирование детей.
А ты принес хорошую штуку. Потыкаю ее.
https://godotengine.org/article/dev-snapshot-godot-4-3-dev-5/
Когда там релиз уже?
В массиве вот подобные объекты, чисто для примера пока что
С флагом вместо моего объекта с массивом возвращается объект типа Resource, я чето устал пока что завтра посмотрю
Полистал список изменений, вроде ничего важного (кроме того интерактивного аудио с странным редактором).
Хотя пару серьезных багов исправили, например BoneAttachment, неполное запекание LightMap, или вот такой суровый https://github.com/godotengine/godot/pull/88946
Виндо дефендер почему то сагрился на свежий файл.
Всё решил
- поменял extends Object на Resource (было логично, как только комп вчера выключил, сразу об этом подумал)
- забыл поставить для переменной oparam "@extends"
ух
Не хуярит ли это по производительности?
inb4 хуярь нужную подсцену отдельным файлом
Да, то что надо. Спасиба :3
Из твиттера Хуана.
А ты чем занят анон? Делись.
>Будет симулятор рыбалки?
Не, из ближайшего похожего стардювали, но до этого ближайшего как от москвы до камчатки пешком. А так это домики будущей деревни рыбаков.
>А я дизайню сумоиста в подгузниках.
Показывай
>>42023
Я если честно хуй забил на диздок, сначала тож хотел сесть написать, но хуй к носу прикинул, в тетрадку накидал мысли и идеи да и пошел рисовать.
Пишу взрывы: как они распространяются, как рейкастят и дамажат, если луч не встретил препятствий. Ещё надо будет какие-то партикли им нарисовать, наверное.
Точно, четвёрка же!
Тут-то какой смысл притворяться тянучкой, тут ни у кого на них не стоит. Стоит только на игори и годот.
Во, молодец. Давай там, удачи тебе. Верим, ждём.
В тройке точно есть.
Importantly, you will notice the development pace slow a little bit as many of the core developers are away for the week and taking a much needed vacation the following week.
So maintenance releases for 4.1 and 4.2 users fell through the cracks temporarily, but we’re getting back on track with a new set of release candidates for both 4.1.4 and 4.2.2.
We will have a booth on the expo floor, and would love to welcome you there! You can play games (more about those below), chat with our sponsors, meet contributors to the engine and ask your burning questions to the Foundation members staffing the place. There might even be pins to snatch up 👀