Вобщем, снес нахуй юнити. Посидел повтыкал пару деньков в годо, почитал документацию, посмотрел видосики, и сделал вывод что юнити хоть и в большинстве случаев получше будет, но годо движок с душой, а это важнее. Думал сначала с шарпом перекатываться ибо впадлу было на гдс пересаживаться, но хуй к носу прикинул и решил все же пересесть. Прощай рабство, привет годо! >>930620 →
>>931052 Добро пожаловать! А ГДСкрипт настолько охуенен, что я жду, когда найдется среди годанов скилловый гик, который на LLVM запилит GDLang чтобы прям консольные утилиты и оконные приложения на нём пилить. Сам я, увы, не потяну.
>>931043 → Поправил, заработало, спасибо. Под вечер мозг плохо соображает - не заметил. Но я все равно не понимаю, зачем это нужно. Только для того, чтобы не возиться с editable children? >>931044 → Обычно так и делаю
>>931062 > чтобы не возиться с editable children? В том числе да. Подумай перед сном, какие возможности тебе дали бы выполняющиеся в редакторе тулскрипты?
Как вы делаете инвентари в игре? Я блять какие-то ресурсы хуячу, пытаюсь связать сцену предмета с ресурсом для инвентаря. Вроде всё работает, но на протяжении всего времени меня не покидает чувство, что делаю какую-то хуйню.
>>931081 > Как вы делаете инвентари в игре? Ебашишь массив и в него вхуячиваешь предметы. Что тут сложного-то? > Я блять какие-то ресурсы хуячу Ресурсы (как класс) нужны для удобства управления ресурсами (как файлами). > пытаюсь связать сцену предмета с ресурсом для инвентаря Тебе не сцена предмета нужна, тебе в первую очередь класс предмета нужен. А сцена, это вообще-то говоря, ресурс, это файл, в который сериализирован инстанс определенного класса. Пока ты не поймёшь эту фундаментальную разницу, ты не продвинешься вперед. > меня не покидает чувство, что делаю какую-то хуйню Подтверждаю. Ты делаешь хуйню. Даже не глядя в твой код. Чисто по тексту видно непонимание смысла.
> Как вы делаете инвентари в игре? Инвентарь это база данных, таблица, у которой есть набор строк (записей) и столбцов (полей). У инвентаря есть методы: Create - создать запись о новом предмете, Read - прочитать запись с предметом, Update - обновить запись с предметом (стакнуть в стак, например), Delete - удалить запись с предметом. Это всё. Этого достаточно для любого инвентаря любой сложности.
Но ведь твой вопрос не об инвентаре, а об его внедрении в геймплей. А вот в геймплее уже есть дохуя дел, которые придётся сделать. Как выкидывать предметы? Как сортировать предметы? Как вставлять предметы в слоты? И т.д. и т.п. Тут целую книгу можно написать, весь тред исписать длиннопостами до бамплимита.
>>931081 Нахуя? Тебе Хуан дал массивы, пользуйся. Если у тебя простенькая игрушка, то просто хватит добавление индекса предмета, если нет, то можешь сделать предметы объектами, да и инвентарь тоже сделать отдельным классом.
>>931081 Вот, кстати, периодически вспоминаю такую штуку и советую всем: Во многих играх есть консоль. Квейки, думы, халф-лайфы, тесы. Так вот, ящитаю, годная практика для новичка - это сделать такую консоль, которая принимает на вход текстовые команды и совершает действия в игре. Что-то типа: > player.inventory.add iron_greatsword 10 > player.equip steel_armor Продумать, что должна сделать игра при получении команд? И реализовать. И когда реализуешь, многие вопросы сами собой отпадут.
Пишу на шарпе, был выбор писать самому или спиздить готовенький ассет. Выбор пал на inventory-system на гдскрипте. Спиздил и перекатил на шарпы, сейчас допиливаю и перекрываю говнокод автора своим
Такой вопросик, сейчас разбираюсь с машиной состояний анимаций, и вот чет не пойму почему в дереве смешивания анимации начинаются не с того же кадра, а начинают проигрываться заново, где та волшебная кнопочка лежит которая мне поможет?
>>931111 Вобщем так и не понял в чем проблема, все перетыкал но ниче не помогло, а нагуглить нормально не получается, как проснусь буду дальше разбираться.
Аноны. какие лучшие практики по загрузке и переключению сцен? Есть главное меню игры, откуда после нажатия на кнопку, происходит переход к самому игровому процессу, при помощи change_scene_to_file. И вроде все ок, но игра жалуется на циклические импорты т.к. в главном меню игры грузится сцена с игрой, а в сцене с игрой есть переход в главное меню игры. Как фиксать? Что-то не так делаю?
>>931090 >Инвентарь это база данных, таблица, у которой есть набор строк (записей) и столбцов (полей). >У инвентаря есть методы: Create - создать запись о новом предмете, Read - прочитать запись с предметом, Update - обновить запись с предметом (стакнуть в стак, например), Delete - удалить запись с предметом. Это всё. Этого достаточно для любого инвентаря любой сложности. Ну это я и хотел увидеть. У меня есть класс инвентаря, в массив которого и записываются предметы, которые сами наследуют класс предмета. Чисто по тексту видно, что в первой половине поста ты пытаешься продать мне какую-то хуйню.
>Но ведь твой вопрос не об инвентаре, а об его внедрении в геймплей. А вот в геймплее уже есть дохуя дел, которые придётся сделать. >Как выкидывать предметы? >Как сортировать предметы? >Как вставлять предметы в слоты? Про это я не спрашивал, с этим у меня ни вопросов, ни проблем нет.
>>931094 Я думаю, что консоль должна от обратного делаться. Нужно добавлять команды к существующим функциям/методам. А добавлять функционал исходя из требований консоли это что-то странное. Да и не нужна она зачастую индюшатине
>>931101 Если ты про ассет от expressobits, то мне кажется, что у него версия на шарпе где-нибудь на гитхабе. А вообще я смотрел его, понял, что делаю примерно тоже самое и не стал менять свой велосипед на чужой
>>931081 У меня на C# ECS пока инвентарь на базовом уровне, в виде двух вкладок: список всех предметов кроме надетых, и вкладка с снаряжением, где слева надетое, справа сответственно не надетое. При поднятии я удаляю со сцены спрайт и компонент позиции в пространстве и добавляю "В инвентаре", при открытии инвентаря я опрашиваю все предметы "В инвентаре" у которых владелец игрок, и ими заполняю список, аналогичным образом со снаряжением. Когда выбрасываю удаляю "В инвентаре" и рисую спрайт и добавляю компонент позиции.
насколько по вашему годот будет хорош для 3д более менее среднего уровня графики? в 4.3 добавляют новое ГО где убрали протечки света. Да и в самом годоте куча фич типа динамичных лодов, запекание света, PBR материалы, серверы для прямого сообщения с движком, кароче тема. Вот я считаю что да, хотя движок изначально и не для этого.
>>931133 Только юнит-тесты(почему тесты-юнита, что то меняется от перестановки?) и они зачастую ломаются без поломки в самой игре, и добвляют головной боли. Консоль же -- это немного другое. По нужной команде она либо сама чёто напишет в консоли, либо покажет прям от лица камеры. И писать команды для консоли можно прям в скрипте объекта который нужно менять через них.
>>931139 и в чём смысл? показать что в разработке что то меняется? для этого можно просто в логе выписывать ошибку на неправильный вызов функции или несовпадение форматов, для последнего даже писать ничего не нужно.
>>931141 Не все вызовы всегда происходят (был случай когда разраб забыл потестировать движение назад - он всегда шел только вперед), несоотвтетствие форматов может пройти тихо.
>>931064 >Подумай перед сном, какие возможности тебе дали бы выполняющиеся в редакторе тулскрипты? Доброе утро. Могу без запуска сцены сразу смотреть поведение нод? И это в свою очередь упростит сборку уровня, например
>>931118 >И вроде все ок, но игра жалуется на циклические импорты Это "желтая" ошибка? Я на них обычно не обращаю внимание. У самого в проекте после меню используется "главная сцена" с игроком, ui и прочим, и в нее уже загружаются уровни через add_child
>>931133 > Ты почти что Test-Driven Development описал. Потому что я всю осень про это книжку читал. >>931096 И молодец. >>931122 > это что-то странное Это опыт и знания.
>>931225 Удваиваю хороший аргумент. Также Форт Боярд. Сам говорю/пишу и Годот, и Годо, в зависимости от контекста.
Олсо, пытался посмотреть "В ожидании Годо" в постановке театра Вахтангова. Не осилил больше часа. Возможно, бродвейская постановка с Иэном Маккеленом и Патриком Стюартом была бы поинтереснее, но её в интернетах нету целиком (она хранится в Нью-Йоркской библиотеке им. Линкольна, там можно посмотреть совершенно бесплатно, лол)
>>931158 Нет. именно что красная. Желтые алерты фиксаю, там все норм. У меня в основном бзается именно смена сцены, для новых страниц\окон. Но вопрос возник только по главной странице и переходу к одной из игровых страниц, странно. Больше похоже на какой-то баг годота ибо принцип везде один и тот же юзаю.
>>931292 Никто не знает, но легко можно понять почему. У нас другая, не соевая культура общения, мы и лично кого то чморим если он не прав, и шуточку неуместную можем ввернуть.
>>931292 Юан который? который Жуан, да? ну вот он в основном курирует + ведёт немного обособленный от общего движка движ, как например новый HDDAGI (псевдо0рейтрейсинг на стероидах) -- это он делает. В основном по моему все нововведения это либо он делает, либо с его веления. Чел ровный, кстати.
Бля. Я походу приехал. Такая ситуация. Система выборов в ещё зачаточном состоянии. Выводится от 2 до 6 кнопок. Нужно сделать, что при нажатии на каждую кнопку делается что-то своё. Ну и как бы ничего сложного. Вот только таких выборов за игру будит сколько я захочу, а это всяко больше 1 или даже 10. Возникает проблема. Как мне хранить что будет делать кнопка? Кнопки-то дубликатом создаются и в них только id меняется, чтоб знать какую именно нажали, а нужна ещё и куча разных скриптов так-как они должны делать много разного. Меня с начала осенила мега тупая идея хранить то, что делают кнопки в ресурсах и по необходимости просто менять ресурсы, вот только из ресурса я как буду к сцене обращаться? Нельзя же. Ну и как тогда? Кучу кнопок сделать? У меня забьётся сцена кнопками очень быстро. По сути хотелось бы просто кнопке скрипт поменять когда захочу и всё. Как это сделать хз.
>>931337 сделай контроллер кнопок в одном скрипте и обращайся к нему через кнопки и их сигналы, на каждую кнопку своя функция которую она зовёт через сигнал, чё сложного? Если ты не в курсах что такое сигналы то бегом учить, ЭТО КЛАССИКА, ЭТО ЗНАТЬ НАДО.
>>931337 Все кнопки ставят соответствующие флаги в переменную соответствующую выбору, хранящуюся в словаре выборов, типа Dictionary<int, short> где инт - айдишник выбора, а шорт - его результат. Или даже Dictionary<Choice, short> где Choice - енум выбора.
>>931343 А я и написал сразу тип: short, потому что бул слишком мала, а инт слишком велик. > перемудр дикий. Я из расчёта что выборов может быть слишком дохуя, а тут одна функция на всё про всё.
>>931339 Ну вроде норм звучит. Только код будет в спагетину превращаться, если я правильно понимаю. Ну там спагетина простая, однослойная, так что, как бы, как вариант. >>931341 Звучит круто. Только где я буду short"ы хранить и как запускать? Вот тут-то я и обосрался. Где про шорты почитать, если ты говоришь что short это тип? Пять секунд в гугле не дали ответ.
>>931353 > где В словаре. Эти переменные не для запуска, а для хранения выборов, которые сделал игрок. Запускать ты будешь одну и ту же функцию, которой ты будешь передавать (обходным путём) какой это выбор и выбранный ответ, после чего ты их сохраняешь в словарь, и при необходимости к нему обращаешься. > Где про шорты почитать В годоте его зовут uint8_t https://docs.godotengine.org/en/stable/contributing/development/core_and_modules/core_types.html
>>931351 ничего не курю, многие Жуана юриком называют. А Юра настоящий походу прослыл трансфобом и его кикнули за это. Как обычно, не поделили повестку. Очень жаль, и движок хороший и Юра большой вклад сделал.
>>931337 var a = null if игрок нажал на кнопку 1: a = 1 if игрок нажал на кнопку 2: a = 2 ____ if a = 1: такой-то сюжетный поворот if a = 2: другой сюжетный поворот
>>931337 Этот код будет давать тебе преднастроенную кнопку: > func create_button(name: String, text: String, on_press: Callable, on_press_id: int) -> Button: > ____ var result := Button.new() > ____ result,name = name > ____ result,text = text > ____ result,pressed.connect(on_press, [on_press_id]) > ____ return result Использовать его примерно так: > for item in my_choises: > ____ var btn = create_button(item.name, item,text, on_choise, item.id)
>>931392 Как сделать красивый переход между плаваньем и ходьбой? Я как-то делал, у меня лютое дрожание было при переключении стейта на границе области воды с областью земли. Как годаны решают такую задачу?
Анончики, подскажите: Если я планиркю сделать кастомизацию персонажа (пол, текстуры, экипировка) то мне надо просто намоделить это на один скелет и отображать при надобности?
>>931400 У тебя скорее всего в другом состоянии определялось что тут же пора переключаться обратно, и так по кругу. Решается таймером отложенным, когда нужно пробыть хотя бы 0.1 сек в состоянии, или например разнесением в пространстве триггеров, когда между ними есть зазор, а не просто граница сред. Ну могут быть и другие варианты может ты просто pivot point криво поставил и у тебя в другом состоянии поза сдвинута.
Вчера чуть не высрал простыню о том, как я, тупой даун, не могу додуматься как делать игры. Не могу понять как использовать все эти функции и переменные, какие-то блять сигналы, ноды, _ready, _process, хуй пойми зачем они нужны, как и когда применять, комментарии к этим функциям довольно абстрактны. Пока строчил всё это, в голове сложилась картина о том как я должен реализовать свою игру и ответил сам себе почти на все свои решающие вопросы и вышел из ступора советы из краткого гайда в шапке действительно работают.
Самая элементарнейшая игра которую можно придумать - отгадай число. Кое-как я это сделал, но до конца не понял как и потому прошу разобрать некоторые моменты. Короче, игра состоит типа из 4-х сцен: main.tscn - начальное окно с кнопкой старта game.tscn - 10 кнопочек, числа от 1 до 10 result_win.tscn - сцена где говорят что мы победили result_lose.tscn - а тут что проиграли
У каждой корневой Node2D ноды этих сцен есть скрипт, у main и result'ов это просто скрипт содержащий
Во-первых: возьмём любую функцию кнопки _on_button_pressed(). Я не понимаю как происходит сравнение в условии if 1 == random_number, а если конкретнее, то откуда у нас берётся значение random_number'a, ведь функция get_ranum() существует, но не вызывается. Так же есть тело функции _ready(), я прописал его чтобы просто смотреть в консоле какое число было задано. Если это тело убрать или функцию удалить то при попытке играть я всегда проигрываю, то есть random_number пустой и ни одно значение с кнопки с ним не сходится. Короче говоря, выходит, что как раз в функции _ready(), которая выполняется прежде всего, мы вызываем get_ranum() и, соответственно, заполняем random_number с которым, в последующем, и работает условие. Я пытался пользоваться отладчиком чтобы посмотреть что куда присваивается, но что-то нихуя не понял как он работает. пока писал это, до меня дошла мысль что это всё вполне логично, и, наверное, всё именно так и работает. Надеюсь я ошибаюсь и не зря это строчил. Во-вторых, хочу узнать как можно реализовать всё это более чисто и ёмко. Я уверен, наверняка, вместо десяти функций для каждой кнопки, можно сделать одну, и вообще всё оптимизировать и сделать чотка! Короче, расскажите как вы бы сделали, аноны.
>>931467 >Пока строчил всё это, в голове сложилась картина Классика, у меня такое регулярно. Происходит затык, не могу что-то понять, найти или придумать. Пишу длиннопост. В процессе написания приходит понимание. А ещё чаще - оно приходит через пару минут после того, как пост отправлю. Я это для себя объясняю так, что сам процесс написания поста стимулирует мозг к осознанию мыслей, так как они переводятся из абстрактной в текстовую форму и упорядочиваются.
А ещё отвлечься полезно тоже и сходить куда-нибудь, да хотя бы посрать. Все самые лучшие идеи приходят на толчке.
>>931467 То что уже хоть что то высрал, большой прогресс. Не стоит себе засорять голову мусорными вопроси по типу а точно я делаю все правильно, а так можно, а как это использовать правильно, просто бери и делай, попутно смотри как игры делают другие, и тогда вопросы сами отпадут.
>Я не понимаю как происходит сравнение @ >Короче говоря, выходит, что как раз в функции _ready(), которая выполняется прежде всего, мы вызываем get_ranum() и, соответственно, заполняем random_number с которым, в последующем, и работает условие. Так и есть.
Во первых. >random_number = randi() % 10 + 1 Насколько я помню % это остаток, да и вообще не пойму зачем ты пытаешься этим колдануть, когда есть randi_range(int "from", int "to"). Во вторых. Зачем тебе вообще генерировать от 1 до 10 если у тебя при нажатии только 2 состояния, победа и поражение. В третьих. Следуя из пункта выше, у тебя отпадает нужда в 10!!! функциях, делаешь один метод в котором генерируешь инт от 0 до 1. Да даже если бы тебе нужно было что бы каждая кнопка отправляла свое число, столько функций не нужно, хватит одной которая принимает переменную и ее обрабатывает как надо.
Прилагаю пикрилы как бы сделал я. Пик 1 менеджер, если его можно так назвать, который обрабатывает входящие данные и на их основе манипулирует состоянием игры. Скрипт висит очевидно на менеджере. Пик 2 простейший скрипт для передачи номера кнопки который ты поставишь в инпекторе. Скрипт висит очевидно на кнопке. Пик 3, как выглядит сцена. Ну и пик4 сонсолька.
>>931404 Вдогонку: интересует еще вопрос оптимизации. В этой модельке 1900 полигонов, если теоретически добавить экип то будет около 5. Ну для одного персонажа допустим нормально. А если их 30? А если 64? Опыта в геймдеве нет поэтому для меня это еще неочевидно.
Имеется вопрос по сохранению и загрузке данных. Я так понял в этом двигле есть два стула, это классические текстовики тип жсона и свои ресурсы. Свои ресурсы я так понял проще, т.к. не нужно делать се и десериализацию, но ставит палки в колеса любителям загружать чужие сейвы т.к. есть лазейки для вредоносного кода. Теперь наверное нужно указать что мне собственно надо сохранять и загружать. Это сложный инвентарь с предметами на десяток параметров, различные обьекты которые может строить игрок в мире(сундуки, переработчики со своими инвентарями и обработками). Изменения в мире: уничтожение предметов, обьектов, врагов. В юнити я уже это делал на жсоне, мне совершенно не понравилось что это превращается в переборку листов в листе листов. Особенно если потом надо добавить еще один параметр предметов. Так вот, вопрос в том, каким образом рекомендуете сохранять данные? Насколько уязвимость с сохранением через ресурсы актуальна? Целевые платформы десктоп шинды и ведро, чистый синглплеер.
>>931711 по черноте видно что основная детализация в руках, затылке и грудной клетке, почему то? затылок не видно да и грудина судя по всему -- продолжение шеи. то чего не видно надо вырезать, оптимизация, хуё моё.
>>931735 я не про саму грудь, блин, не про сиськи.а про то что внутри грудной клетки явно лишняя геометрия которая, как я и думал, является бюстом башки.
>>931965 Сделай два метода, один с 100500 ифов, второй с 100500 матчей. В начале каждого метода > var elapsed = OS.get_time_msec() В конце > print("Time elspsed is %s msec" % OS.get_time_msec() - elapsed)
>>931503 Я нихуя не понял что тут происходит. То есть у нас есть корневая для кнопок нода манагер. У ноды манагер есть скрипт. У каждой кнопки есть общий скрипт.
Скрипт кнопок поменьше, поэтому с него: Мы добавляем в Инспектор свойство Number Button. В скрипте number_button = 1 1 (один) это типа просто дефолтное значение, но для каждой кнопки оно будет равно значению указанному в Инспекторе этой кнопки если, конечно, укажем?
Потом подключаем сигнал export_value в скрипт манагера, собственно, создаётся наш func _on_butoon_export_value(value) с интересным названием. Выходит, все 10 сигналов каждой кнопки подключаем к скрипту? Однако, ты пишешь >Да даже если бы тебе нужно было что бы каждая кнопка отправляла свое число, столько функций не нужно, хватит одной которая принимает переменную и ее обрабатывает как надо. То есть можно сделать чтобы один некий func _on_butoon_export_value(value) обрабатывал всю эту группу из 10 кнопок? Как это? Как она, одна функция, примет другие переменные, если эти переменные берутся из Инспектора кнопки (типа возьмёт value из заэмиченной к скрипту кнопки первой, скажем, и всё ведь, а дальше)? Блат, надеюсь внятно сформулировал. Кажется, чем дольше я думаю, тем хуже понимаю что происходит и сам путаюсь.
upd: Я начинаю подозревать что если мы не будет выводить какие либо значения в консоль, а будем общаться с игроком через UI, как в моей графической версии, то все эти value нахуй не нужны. Нажали на кнопку с числом - выиграли/проиграли. Какое там value передалось никого не ебёт. Надо сделать
match, очевидно в начале прочитал как math и пол дня ебался искав что же такое math, проверяет на совпадение. В справочнике про эту функцию написана какая-то непонятная поебень. Does a simple expression match (also called "glob" or "globbing"), where * matches zero or more arbitrary characters and ? matches any single character except a period (.). An empty string or empty expression always evaluates to false.
Нужна помощь эксперта. RigidBody3D по скорости так же работает как и KinematicBody3D?
Я хочу сделать много, несколько тысяч, объектов, которые почти всегда будут просто сидеть на месте, и лишь иногда (редко) укатываться от игрока и коллизить со стенами (но не друг с другом). Как оптимальней это сделать?
>>932006 >1 (один) это типа просто дефолтное значение, но для каждой кнопки оно будет равно значению указанному в Инспекторе Да. >Выходит, все 10 сигналов каждой кнопки подключаем к скрипту? ....... Как она, одна функция, примет другие переменные, если эти переменные берутся из Инспектора кнопки Да, но не ручками, кроме первого раза офк. Мы сделали отдельную сцену с кнопкой. Мы добавили эту сцену в главную сцену, туда же добавили менеджер. Сделали подпись менеджера на сигнал. И просто КТРЛ + Д сделали несколько дубликатов сцен с кнопкой. Получился пикрил 1. Я хуй знает как это адекватно объяснить честно говоря. Если по тупому то в дубликатах у сигнала остается та же ссылка на метод которая была у оригинала, но данные которые будут передавать сигналы уже будут разными. Бля, я вот знаю как это все работает, но объяснить нихуя не могу. >upd Ну дак да. Я просто показал что можно передавать абсолютно любые данные сигналом, и обрабатывать их в одном методе, если в этом есть нужда. Ну вот допустим тебе понадобится узнать при нажатии какой кнопки игрок проиграл, что бы собрать условную статистику невезучих кнопок, будешь знать как можно сделать.
>>932006 Смотри, дизайн твоего приложения может создаваться по двум вариантам, в зависимости от того, как тебе удобнее. 1. Много мелких скриптов в объектах. 2. Один божественный скрипт на все объекты, Второй вариант считается, антипаттерном. Нежелательным. Потому что тогда в одном скрипте будет намешана лапша из всех объектов приложения. (Я специально не называю это игрой, потому что это не эксклюзивные знания геймдева, это общая для кодинга инфа). Тебе выше предлагается дизайнить по первому варианту. У каждой кнопки свой скрипт и свой индекс (но нейминг конечно, фу), при нажатии на кнопку, она испускает сигнал с индексом. Но проблема в том, что на все сигналы всех кнопок нужно подписываться. Этот момент либо упущен, либо проигнорирован автором поста. Сигналы (ивенты) это реализация другого паттерна, наблюдатель (обсервер), и распихивание локальных сигналов без возможности на них подписаться - бессмыслица. >>932075 > я вот знаю как это все работает, но объяснить нихуя не могу Не знаешь. А лезешь советовать.
>>932006 Так что выкинь нахер весь этот код и просто работай по варианту 2 (год-обджект) пока не поймёшь, как от него избавиться. Пока сам жо этого не дорастёшь.
То есть, тебе надо в рамках одного скрипта объявить и массив кнопок, и нагрузить их своими коллбэками (либо одним коллбэком с индексом-аргументом). Вот. Приступай.
>>932074 > много, несколько тысяч, объектов, которые почти всегда будут просто сидеть на месте, и лишь иногда (редко) укатываться от игрока и коллизить со стенами (но не друг с другом). Как оптимальней это сделать? Для этого у них есть режим сна, в котором они игнорируются физическим движком. Изучи это.
>>932078 >Не знаешь. А лезешь советовать. Критикуешь предлагай. Покажи сам как правильнее будет сделать, это в разы полезнее будет нежели вести пустой треп о паттернах, особенно когда человек не понимает даже как работает код. Я из себя тут гуру не строю, и только рад буду если кто то более знающий поможет анону.
>>932078 >Для этого у них есть режим сна, в котором они игнорируются физическим движком. Изучи это. Увы, у этого вечные проблемы. Например: Ригидбоди лежит на ригидбоди. Оба спят. Убираешь нижний - верхний продолжает спать и висит в воздухе. Такая же история если куча ригидбодей лежит на статикбоди, и мы удалим статикбоди из мира. Все ригиды спят вися в воздухе.
Можно, конечно, будить их вручную. Но это излишек геморроя, каждую ситуацию учитывать и ригидбоди искать.
>>931998 Я же написал ЭКСПЕРТА, а не какую-то синеволосую соевую гномиху капишь? >OS.get_time_msec() Неправильно. Нет такого метода сейчас. Да и как я буду столько матчей и ифов делать нах надо. Пацаны говорят, что матч, вроде как, как свичами этой всех хуетенью оперирует, а потому быстрее елсифа. Сам я не ебу конечно.
>>932099 > Критикуешь предлагай Предложил: >>932078 > Так что выкинь нахер весь этот код и просто работай по варианту 2 (год-обджект) пока не поймёшь, как от него избавиться. Пока сам жо этого не дорастёшь.
> То есть, тебе надо в рамках одного скрипта объявить и массив кнопок, и нагрузить их своими коллбэками (либо одним коллбэком с индексом-аргументом). Вот. Приступай.
>>932119 Все правильно он тебе ответил. Метод может иначе называется, или его переименовали в четверке. Погуглить ты же в состоянии, верно? Принцип как он тебе и написал - берешь миллисекунды до, берешь после, вычитаешь, смотришь сколько мс код работал.
>Да и как я буду столько матчей В цикле, епта. for i in range(10000000000): match ...
>>932130 >В цикле, епта. for i in range(10000000000): match ... Так у меня i будет просто бежать до 10000000000 же. Скорость будет одна и та же вне зависимости от метода сравнения.
>>932136 А внутри цикла у тебя матч. А внутри такого же другого цикла у тебя иф. В ифах-матчах сравниваешь то, что тебе там надо сравнивать. Потом сравниваешь результаты работы двух больших циклов. Это база, это знать надо.
Короче ты заебал тупить, и я сравнил за тебя на обычных интах. На 10 миллионах сравнений матч быстрее иф-елс на 32 миллисекунды. Это дохуя ценное знание конечно сильно ускорит твой проект.
>>932264 Это конечно хорошо, но в рамках т.з первого поста нет никакой необходимости в динамическом создании кнопок. Это имело бы смысл только в том случае когда нам надо было бы генерировать рандомное число кнопок на старте, а у нас блять их количество статичное, их никогда не будет ни больше ни меньше. Делать динамику там где она нахуй не нужна - бессмыслица.
>>932294 > нет никакой необходимости в динамическом создании кнопок Есть смысл. Это удобно и красиво. Не нужно ебаться с заданием им параметров в инспекторе, или копипастить сконфигурированные, или копипастить код с коннектами в скриптах. Весь коннект происхожит быстро, элегантно, в одном месте. И там же может так же элегантно поизойти расстановка динамических контролов по форме.
>>932296 >Это удобно и красиво. Слишком жидкое оправдание. >Не нужно ебаться с заданием им параметров в инспекторе А это убило. Лучше же поебаться в самом коде насрав милиард ненужных строк, сделав при этом не расширяемое говно, верно? Короче, смысла в дальнейшей дискуссии нету. Оба варианта имеют право на жизнь т.к используются в абсолютно разных ситуациях. Бля ща не доеб, но я чето в голос с того что попытался твое ебало имадженировать, весть такой нарядный, с пакетом, одним словом елегантный.
>>932304 > верно? Неверно. Данный код добавит любое количество кнопок с любыми именами без изменения кода проекта. Достаточно описать эти кнопки в конфигурационном файле, эмуляция которого описана в var choises_from_persist_data > Угадайте число от 1 до 10 > Угадайте число от 45 до 97 > Угадайте фрукт из списка [банан, яблоко, апельсин, слива] > Да / Нет > Да / Нет / Не знаю / Мне повезёт И так далее.
Сделал основные анимации движения, закинул .blend файл в папку проекта, приготовился уже разбираться с анимированием и столкнулся со следующей проблемой. В AnimationPlayer отображаются не все анимации, которые есть в блендере. В чем я напортачил?
Аноны, я правильно понимаю, что точечный свет в 2д + тени очень медленно работает? Решил добавить в мобильную игру свет и тени на локацию - на ведре (пиксель 5а) лагает. В какую сторону копать с оптимизациями? Тени сделал менее детальными, фпс поджал - стало лучше. Но все еще плохо. И это с учетом того, что добавил лишь 5 источников света и около 15 предметов с тенями. Источники свет статичны, предметы с тенями могут появляться\пропадать(некоторые).
>>932650 Советы давать не буду, просто свое отрепорчу.
Тоже со светотенью работаю, тоже для мобилок. Только в 3д. Насколько я понял большинство мобильных чипсетов работает со светотенями по своему, сильно отличающемуся от пк алгоритму. Он неэффективен. Возможно поэтому в гугл плее у меня не вышло найти игр с качественными 3д светотенями. В ГЛЕС3 свет шустрее чем в ГЛЕС2 (в 2 он еще и багается). Прозрачности это тоже касается - на мобилках она медленная, по крайней мере в 3д. Наебался с ней пиздец.
У меня такие результаты. 5-15 омнилайтов, только один из них с тенями, главный. В настройках проекта прошелся и снизил почти все. Эффективнее всего снижать разрешение - актуально если у тебя пиксели или лоуполи. На своем realme 9 получаю стабильно 60 фпс. При этом в доступе у меня есть сяоми с каким-то стремным чипсетом. По бенчмаркам он шустрее моего телефона, но умирает до 3 фпс от одного омнилайта.
>>932952 >Токсичного Чё он там, не поддержал трансовый переход чьего-то ребёнка, не поцеловал ботинок негру или скзаал долбоёбу, что он долбоёб без увиливаний и ужимок? Англосаксы очень нежный и в их понимании токсичностью можно назвать всё, что угодно.
Делаю survival horror. Запили базовое перемещение персонажа, переход между уровнями, систему сохранения, сейчас делаю инвентарь и сразу вплетаю его в систему сохранений. Все верно делаю?
>>931045 (OP) Можно ли вообще включить один AnimationPlayer внутри другого? Я из скрипта вызываю функцию первым AnimationPlayer, которая проигрывает второй, но это не работает, при этом сама функция точно вызывается.
Сап, годач. А как изменить размер кнопки? Меняю его в size, но меньше 21 по x и 17 по y кнопка не становится (возвращаются минимальные размеры). Срабатывает через scale, но это костыль
>>933025 Не нужно >>933029 Не вижу проблемы честно говоря. В конце концов в плеере есть возможность запустить функцию скрипта. Плееры анимируют разное или одно и то же? Может они просто оба одновременно играют и один оверрайдит значения другого? >>933045 Скорее всего, это высчитаный размер исходя из текста таким шрифтом. Попробуй поиграться с отрицательными Margin, потом вон выше есть custom minimum size, посмотри всякие флаги типа extrend, не помню где они в 4-ке. Может быть в Layout.
Ладно котики. Меня позвали пилить мобилки на другом движке, так что не смогу давать советы в ближайшие полгода. Но я обязательно вернусь с игрой мечты и мы сделаем годот великим!
>>933063 >В конце концов в плеере есть возможность запустить функцию скрипта. Ею и пользуюсь. print_debug из функции нормально выводит значение, а плеер уже не работает.
>Плееры анимируют разное или одно и то же? Может они просто оба одновременно играют и один оверрайдит значения другого? Абсолютно разное, так что ничего не перезаписывается. Элемент, который должен анимироваться при вызове функции вообще не меняется.
>>933070 Я попробовал и не нашел способа уменьшить, только увелиить. Нечто похожее можно получить добавив вокруг MarginContainer с негативными маргинами, и галочкой clip content,но он отрезает скругленные углы кнопке - возможно тебе как то под это придется текстуру подогнать.
>>933025 Queue_free() ставит ноду на удаление со следущим кадром а не во время выполнения функции, ибо в текущем кадре к ней может обратиться другой код и будет плоха если ноды не будет на месте
Свершилось! После полугода поиска идеи, прокрастинации, и клепания безыдейных прототипов с копирками, на меня все же снизошло чудо. Теперь я отчетливо вижу то что желаю сделать. И это оригинальная задумка, но довольно очевидная, поэтому все же оригинальность под сомнением, но разве это меня остановит? Теперь можно со спокойной душой лечь спать, а на утро начать колдовать. Давно я такой мотивации не ловил от собственных идей. Путь будет тернистым и долгим, но зато каким!
Чуваки, а что если у меня линукс? Я только вкатываюсь, код пишу хуе мое, но тестировать надо наверно на винде и вообще на ней сидеть? Там же эти библиотеки, дирекс 12 и прочее говно
Алсо я на ноуте геймдевлю, 2 ядра, 8 гигов, амудевстройка, которая в 60 только сталкер тень чернобыля тянет, если все выставить на средние Хотя я и не планирую делать графоуни шутеры
>>933275 Ты о чем вообще, какие экзешники? Годот, будучи опенсорным, работает где угодно и на чем угодно. Я, сидя на линуксе, уже четвертый проект на годоте допиливаю, все предыдущие опубликовал под винду, макось, линь, веб и андроид.
>>933275 Трешка у меня збс работает на дебиане, 4ка работает почти никак потому что в моем некроноуте нет дров на вулкан. А с точки зрения релиза, вообше проблем нет, экспорт это бинарник платформы + твоя игра в виде пака скриптов и ассетов. Кидал и веб билды и виндовые на твг
>>933293 Под айфон не делал, единственная платформа которую я пропустил. Насколько понимаю да, нужен мак с икскодом, и нужен еще и айфон. Плюс если в гугл-плее ты как разработчик платишь единоразово за девелоперский аккаунт, то аппл с тебя ежегодно драть будет 99 баксов. Плюс санкции-верификация, хуе-мое. Поэтому не стал заморачиваться.
А для мака релиз собирается легко из-под любой платформы.
>>933275 Ты это я. Такой же ноут с линухом, только интелвстройка вместо амуде.
Не парься. Движки типа Годота как раз заточены, чтобы одинаково работать на разных платформах. Конечно, иногда это физически невозможно (например, нельзя одинаково управлять шутаном с клавамыша, гейпада и тача), но хотя бы от всяких технических условностей можно абстрагироваться, сосредоточившись на собственно создании игры.
С другой стороны, когда дойдёт до тестирования, тебе в любом случае не хватит одного устройства. Там уже надо подключать всех знакомых и заставлять их играть в твою игру на всём, что у них есть. Тащемта, люди и сами рады в таком деле помочь, как правило. Но до тех пор просто делай на том, что есть. Оно должно работать везде одинаково; а где не будет - там в любом случае нужно тестирование.
Сделал первую из четырех игру по книжке из прошлого треда
Годно, но местами будто автор забыл написать код (иначе бы он наверно написал что то типа "а теперь придумайте код сами) и хоть там и легко для меня было додуматься, ведь я уже пару туторов по паре часов посмотрел, рандом может невтыкнуть и его анус лопнет
Не обьяснил про PackedScenes и что после двоеточия присваивается тип переменной Не обьяснил что такое randi_range (вроде) Не обьяснил что делают -=1 и +=1
>>933320 >Не обьяснил про PackedScenes и что после двоеточия присваивается тип переменной >Не обьяснил что такое randi_range (вроде) >Не обьяснил что делают -=1 и +=1 А разве должен был? Книга то не по изучению гдскрипт, а по обучению работы с годо. Если нюфажи скипают банальное ознакомление с базой языка на котором им придется писать, то это их проблемы, а не автора. Такую ебейшую документацию зря писали что ли?
Вот у меня есть нода, которой надо перерисовать много дочерних нод. Когда это происходит, всё подвисает на несколько секунд. Не круто. У меня есть два пути, как это обойти. А) Разбиваю цикл на части, в _процессе выполняю некоторое количество, ограничиваю время выполнения, чтобы продолжить в следующем фрейме. Пробовал такое в трёшке для загрузки сейвов. Б) Мультитрединг. И тут у меня вопросы, которые требуют ответов. Курил-курил доку, но так и не понял. Мутексы и семафоры вообще описаны в двух словах людьми, которые слишком хорошо понимают, как это работают, поэтому уже забыли, что тут можно не понимать. В общем, мои вопросы: 1. Надо ли это делать в _процессе, таким же методом, только в отдельном потоке? Или func do_all_my_update() и в ней описать весь тхред? Если и так, и так можно, то какие критерии выбора? 2. Если я захочу прервать/перезапустить тхред, как мне к этому всему обратиться? 3. Есть какие-то тхред-сейф операции, а есть какие-то не тхред-сейф. В чём их несейфность? Если я буду добавлять чайлдов в тхреде, что плохого может произойти? 4. Есть у меня переменная в скрипте, которая в варианте А использовалась как индекс цикла, запоминаемый между _процессами. Я точно знаю, что она никому, кроме тхреда, не нужна. Надо ли её как-то защищать мутексами/семафорами при условии, что я пока только пытаюсь вкурить в мультитрединг, или для начала и так сойдёт?
>>933337 Очередной адепт документации. Никогда ни в одной блять документации нормально не пишут, что и как делать. Что и как работает. Пишут ее задроты для задротов. А вся мудрость на формуах и в туториалах
>>933332 >чтоб камера не выезжала за игровое поле У Camera2D есть параметры limit_*, делающие как раз это >Как ограничить игровое 2D поле StaticBody2D, запихни в него шейпы типа WorldBoundaryShape2D (или LineShape2D для третьего годота)
>>933337 Ну тоесть выделить главу на обьяснение что такое вектора он должен, а вот строчку текста потратить на обьяснение нубику принцип работы +=, который юзается постоянно, он не должен?
>>933353 Ну не читай и не пиши. Хуле ты ноешь то все? Книги у тебя не то, документация не то, сам ничего делать не хочешь, и игры соевое говно, и все у тебя кончи, один ты красивый. Только срешь тут.
>>933347 Не читал, но объясняю. Это типичное искажение восприятия. Человек, который глубоко погружён в какую-то тему, не может воспринимать её глазами новичка. И ему не всегда понятно, какие концепты очевидны, а какие надо разжёвывать. Автор книги, судя по всему, решил, что += это достаточно очевидный оператор, значение которого понятно из контекста. Тут, кстати, очень полезно бывает попрактиковаться на детях. Взрослые имеют разный уровень знаний, в то время как дети не знают ничего по определению.
>>933342 Ебать ты шизло, документацию то хоть открывал? Там буквально все расписано, картиночки, да даже анимированые есть, специально наделали, чтоб даже додич с слюной у рта мог понять что ему объясняют. Или по твоему там должны готовые %механикинейм% подавать? >>933347 Эт че шутка такая? Нахуй ты прешься в движок если блять даже БАЗОВЫХ операторов языка не знаешь. Иди язык учи епта. Игры делоть он лезет бля. Это блять как придти на завод болты крутить, но в душе не ебать каким инструментом это надо делать, и в какую сторону вообще крутить. >>933361 Нехуй тут объяснять, в книге черным по белому написан пикрил текст, а значит книга не для вкатыша в геймдев, а для новичка в годо.
>>933371 Я книгу скачал чтобы их не делать а чтобы научили делать Я не на завод приперся точить деталь, я попросился к опытному мастеру в ученики, и мастер местами нихуя не обьяснил
>>933371 >книга не для вкатыша в геймдев, а для новичка в годо. Ты сам-то прочитал то, что запостил? Книга и для вкатыша в геймдев, и для новичка в годо. >This book is for anyone >New users and experienced developers >Some programming experience is recommended Знаешь разницу между recommended и necessary?
>>933371 Блять, двачую! Аплодирую стоя! У меня так же пригорает от нулевых нубов, вкатывающихся в геймдев без элементарных знаний школьной информатики.
>>933453 Тут даже знания школьной информатики не нужны, достаточно скилла гуглить. Или хотя бы придти и спокойно спросить в треде, без предъяв что кто-то кому-то должен.
>>933467 > достаточно скилла гуглить ИМХО, недостаточно. Есть БАЗА, и её знать надо. До того, как он полез в геймдев (вершину айти, на которую восходят лучшие и сложнейшие технологии из остальных подразделов айти).
[bombing] Да вы задрали, илитки бля. Годот (как и некоторые другие движки) делает геймдев доступным для любого хуйдожника без базовых технических знаний, и именно это замечательно. Анон приходит в тред, делится своим мнением по книге, которую прочитал. То есть, он не просто лезет в геймдев, а он прикладывает усилия к тому, чтобы обучиться. И он пишет отзыв, который, может быть, пригодится другому нубу, ищущему хорошую книжку для обучения. А вы тут развели - кококо не хотим пускать в наш уютненький геймдев. Стыдно, товирищи! [/bombing]
По мультитредингу вопрос. В целом я разобрался, как создавать тхред и как пользоваться мутексами. Но теперь вот что спрашивается. Вот у меня в тхреде встречаются call_deferred и set_deferred. И я хочу раньше времени прервать выполнение тхреда (например, чтобы его перезапустить с начала). Как мне теперь отменить эти деферреды, чтобы они не выполнялись?
>>933541 >А вы тут развели - кококо не хотим пускать в наш уютненький геймдев. Соглы. Я был одним из тех, кто на его посты отвечал. Он их так писал, что меня триггернуло на его пустые претензии. Приношу извинения, если что. Вкатывайтесь в геймдев как вам удобно.
>>933444 >>книга не для вкатыша в геймдев Ну пардон, не то слово выбрал. Не для вкатыша в программирование, а для новичка в годо. Так понятнее? >>This book is for anyone Че ты с контекста вырвал, пес. Написано что для каждого кто хочет научиться использовать игровой движок. Нехуй подменой понятий заниматься. >>New users Что в твоем понимании новые пользователи? Те кто нубас в движке? Или те кто нубас в скилле кнопкодава? Ты вообще контекст умеешь воспринимать? Или для тебя прямой перевод всегда несет тру смысл строк? >Знаешь разницу между recommended и necessary? Разница лишь в том что ты, тупорылый, настойчиво пытаешься игнорировать эту строку. На всех играх пишут рекомендуемые минимальные системные требования. Если ты игру попытаешься запустить на ведре параметры которого еще ниже минимальных, она, как неожиданно, запустится, но будет выдавать максимум 2 фпс. И в ком же вина что столько фпс выдает? В разработчиках? Или в том что ты игру запустил на ведре? Рекомендация хоть и не обязательная форма действия, но это явный маркер того что книга содержит материал который будет не понятен вкатуну. >>933541 Никто и не гонит. Если человек приходит с безосновательными предъявами, то пусть уходит нахуй. Этож литерали пикрил мем предъявы.
-Вася.Пукни() -zalupa(a) -Саня браток падажжи пока комната проветрится -await cum -Саня.Пукни() -zalupa(b) -Серега браток падажжи пока комната проветрится -await cum -Серега.Пукни() -zalupa(c) -Кто там следующий пажжи пока комната проветрится -await cum
Хотел загрузить несколько реплик персонажа в один проигрыватель аудио и вызывать их ASP.play("hallo") на свое усмотрение, а оказывается годо так не умеет и нужно под каждую реплику создавать отдельный узел. Ну или возиться с массивами. В юнити такая же ебасосина?
>>933770 Так можно же в скрипт пустого проигрывателя заебенить ссылку с переменной, в которую будет будет передаваться название нужного файла с вызовом функции play()
var replika_name = null
func igrat_huinyu(name): __replika_name = name (Не помню куда там грузить и как,) var suda_gruzit = load('res/audio/repliki/%s.wav' % replika_name) Play() (хз как там)
>>933802 Не, ии. Охерел от правдоподобности англ голоса на elevenlabs.io >>933801 Спс, да, через какие-то костыли конечно можно наверное. Но простого решения чет нет. Пишут в годо 2 была библиотека семплов, но ее выпилили.
Ля, чому я о такой крутой штуке только сейчас узнал, чому мне никто о ней на рассказал раньше, яж теперь куда меньше времени буду тратить на рисование и редактирование связей внутри движка. Бля, я ща радуюсь как маленький, такую годноту купить, за такие копейки, прям подарок.
Нихуя не пойму а зачем этот hurt.emit ? кому он эмитит? ареа 2д может сразу у вошедшего в зону предмета вызывать функции, а функция смерти напиример уже в самом плеере
>>933973 Худу например, либо другим типчикам которые ловят сигнал и на его основе меняют данные, ну вот допустим получил ты урон, потом еще раз и умер, вылезает окошко со статистикой сколько ударов было получено и в какое время. Можно конечно не пускать ивент, а сделать тупо на жесткой связи все, но это не правильно ибо получится получится лапша с которой работать будет невозможно.
>>933973 Эмит, как концепция, рассылает "всем кому интересно". Кому интересно, сами подписываются на то, что им интересно. Либо их менеджер/спавнер подписывает. Еще вариант с event bus когда все эмитят в одну кучу, и все подписываются на интересующие события в этой куче, плюсв и минусы в этом свои.
>>933987 > плюсв и минусы Я только плюсы вижу. Из минусов только что ивентбас является синглтоном, от которого на собесах не перезванивают. мимо фанат ивентбаса
>>933987 Мне эвент бас тоже кажется удобней обычных сигналов. Сигналы заебешься еще коннектить туда-сюда, в иерархию погружаться. А в автобус насрал и забыл, а кому надо сам подберет.
>>934161 Ты не знаешь БАЗУ туториалов. А она такова, что в туториалах инфоцыгане городят говнокод ради донатов. Запомните глупцы: на ютубе вы найдёте только развлекательный контент. Если хочешь изучить движок - читай документацию, качай примеры. Как сказано в шапке.
>>934195 Ты про этого единственного чтоль >>933342 ? Так он же шизик. Как сказал анон выше, туторы - развлекаловка, в основном это примеры того как можно делать и оно будет работать, но в то же время это то как делать вообще не надо. Они скорее нужны для того что бы у тебя отпал страх писать код.
Самое приятное в геймдеве - после долгого периода кода, моделирования и дизайна, наконец собрать и подключить звук и музыку. Игра сразу оживает 10 из 10
>>934192 Инфоцыган в годоте - полтора землекопа. Тут другая проблема. Туториалы делают такие же нубы, которые просто чуть-чуть что-то узнали и теперь бегут этим делиться. Настоящих опытных профессионалов среди них - те самые полтора инфоцыгана плюс ещё полтора канала с парой сотен подписчиков. Доку же пишут те, кто действительно шарит. И в доке есть текстовые туторы, кстати. Просто существует большой разрыв между опытными и нубами. Среди опытных кодеров очень мало хороших учителей, а без этого навыка писать понятные туторы очень сложно. С другой стороны, читать доку - это тоже навык, которому надо учиться, вкатышам это сложно, им проще видос на ютубе.
>>934332 >читать доку - это тоже навык Ну 50/50, тут скорее лень читать и тестировать играет роль, вкатышу же че надо, чтоб он на следующий день уже сидел игру делал, вот и прутся видосики смотреть. Я думаю ты сам часто замечал что вкатыши как способ передвижения юзают телепортацию, тобишь изменение позиции на прямую, а потом задают вопросы типо че при большой скорости тело проходит через коллайдеры, как фиксить. Или вон, недавний пример, анону не объяснили что такое : и +=, хотя с его слов он не один туториал посмотрел. Или вопрос с await. И таких примеров триллиард можно привести. А самое главное, ответы на все эти вопросы можно найти чуть ли не на первой странице документации. Поэтому это скорее не навык, а желание действительно чему то научиться.
Вопрос по BBкодам, сейчас имею richtextlabel и базу с диалогами JSON, где прямо внутри " " тоесть в string данных вписаны цветовые коды для нужных мне слов. Все работает, нужные мне слова другого цвета.
Но проблема в том, что сейчас прописан конкретный цвет - зелёный. Если завтра я захочу его изменить на красный, мне придется полностью все эти коды в диалогах к хуям переписовать. Как мне сделать цвет через переменную, чтобы я мог без лишней ебли менять его?
Для понимания сейчас в json так: "Ебать его в рот диалог [color=#62FF4A] тут типо зелёный цвет [/color] а тут обычный "
Есть идея сделать выделить нужные слова в отдельный массив и в годоте шаманить с выводом, но это какие то лютые костыли
>>934455 Ну конечно не можешь. Это данные. Но ты можешь трактовать какие то данные особым образом. Естественно для этого придется написать какой код, обрабатыающмй данные. Например regex или просто шаблонизатор. По сути автозамену в строке какого то маркера. "My string {green} word {white} " ну ты понел. Перестаньте записывать все подрял, включая нормальный рабочий процесс, в костыли.
>>934344 Так падажжи. Не вижу в твоих аргументах опровержения тезиса о том, что вкатышам сложно в доку. Телепортацию они используют, потому что это самый простой способ перемещения. При том, что все видеотуторы говорят про move_and_slide и move_and_collide прямо с первого же урока. Вот у меня прямо сейчас открыта страница в доке https://docs.godotengine.org/en/stable/classes/class_xmlparser.html . Представим, что её увидел вкатыш, который не знает даже основ погромирования, но телепортировать спрайт уже научился. Как много там непонятных элементов? Буду комментировать как бы от его лица.
>Inherits: RefCounted < Object Блять, что это? >Пример кода на гдскрипте и сишарпе Сложно, надо читать каждую строчку и пытаться осознать. >Methods (табличка) Ну эээ это список всяких штук, которые оно умеет, наверное? Левая колонка вообще хз что значит, справа от штук буковки игнорируем. >Enumerations: Какой-то список состояний. Интересно, для чего? >Method descriptions О, КОНТЕНТ! >int get_attribute_count ( ) const эээ а нахуя тут int? И что значит const в конце? Так, эту функцию я не понимаю, она делает какие-то штуки из высших сфер знаний... Эту тоже... И эту... (мотает) >Returns the type of the current node. Compare with NodeType constants. Так чот знакомое. Даёт тип ноды. Я слышал это слово прежде! >Error open ( String file ) Ошибка открытия (строковый файл). Загадочно. Пишут, что открывает хмл-файл. Почему ошибка? прим. авт.: будучи нубом, я долго не вкуривал, что функции в доке описаны в сишном стиле, хотя с синтаксисом сей, жаб и прочих таких был знаком. Просто от доки годота ожидал, что функции будут описываться в гдскриптовом стиле.
И последнее. В доке и в официальных туторах информация подаётся супер сжато. Примеров очень мало и они очень базовые. Не поясняется способ мышления и почему тот или иной элемент используется. Если что-то повторяется, тебе не будут повторно разжёвывать, зачем оно нужно, вернись назад и прочитай там; но некоторые вещи повторяются из страницы в страницу, потому что они такой доковый аналог бойлерплейта. Нубу приходится учиться выдавливать из одной строчки максимум информации, одновременно с тем, чтобы находить эти золотые строчки среди неактуальных и бойлерплейтных. Для примера. Найди в доке описание оператора += . Много ли этой супер важной штуке уделено текста? И да, я всё ещё считаю, что годотская дока - лучшая из всех, что я когда-либо видел. Но это всё ещё сухой технический текст, написанный по принципу sapienti sat.
>>934519 Не. Ты смотришь в справку по апи классов. Справка по апи содержит именно его. Справка по апи каждого класса не должна начинаться с курса информатики, типов данных, объяснения инхеритед, и опреатора += и тем более способ мышления. Потому что апи представляет собой кубики конструктора. При этом способ мышления вполее описывается в водной части документации. Полистай содержание. Там и введение в гдскрипт, и туториалы, и способ мышления, бест практис, многое описано. Наоборот, ящитаю что в апи классов слишком много примеров. Они заставляют пролистывать их.
>>934519 Так я и не опровергал лол, я лишь написал что для того чтоб читать документацию нужен скорее не навык а банальное желание. Ты сейчас буквально написал все тоже самое что и я, только более развернуто)
>>934483 > Чем отличается Метод range(a, b, c) имеет три параметра, второй и третий необязательные. Таким образом приведенные тобой варианты кода аналогичны. Цикл for генерирует range с одним параметром из поданного ему на вход целого числа (а ты ему целое число на вход подаёшь, int get_child_count().
Сила ренжа проявляется, когда ты используешь два-три параметра: > range(3, 7) # Выдаёт массив целых от 3 до 6 > range(10, -10, -2) # Выдаёт массив от 10 до -9 с шагом -2
>>934517 > а чего бы на исходнике не удалить в граф редакторе? Например, исходник может делать изъёбистый художник которому впадлу и нахуй, а спрайтщитов может быть сотня и все периодически обновляются.
>>934519 > открыл классреференс > считает это всей докой, а не одно лишь из её частей Имаджинировали, с кем в одном треде сидим? > Вот у меня прямо сейчас открыта страница в доке https://docs.godotengine.org/en/stable/classes/class_xmlparser.html > Представим, что её увидел вкатыш Вкатыш, который с наскока пытается в хмл вкотиться? Через геймдев? Очень реалистичный сценарий (нет).
>>934548 >не навык а банальное желание Нет, именно навык. Потому что: 1. Найти нужную страницу с нужной строчкой - для этого надо уметь ориентироваться в этой доке. 2. Вычленить из сухих описаний ответ на свой вопрос. 3. Объединить несколько разрозненных частей информации, каждый из которых по отдельности не отвечает на заданный вопрос, в единый ответ.
А, и самое главное: 0. Суметь сформулировать сам вопрос, ответ на который искать в доке.
Желания может быть сколько угодно, но умение работать с докой - это именно умение. У меня во времена вката (года три назад) был вагон желания, но я открывал доку, читал, нихуя не понимал и шёл в тредик спрашивать анона. Анон давал ссылку на страницу и спрашивал: ЭТО ЧТО?
var text = "{wow} диалог [color={green}] тут типо зелёный цвет [/color] а тут обычный"
var uncensored = "Ебать его в рот" var censored = "Ну эт ваще" var light_green = "#00FF00" var dark_green = "#008000"
var light_text = text.format({"wow": uncensored, "green" : light_green})
print(light_text) #Ебать его в рот диалог [color=#00FF00] тут типо зелёный цвет [/color] а тут обычный
var dark_text = text.format({"wow": censored, "green" : dark_green})
print(dark_text) #Ну эт ваще диалог [color=#008000] тут типо зелёный цвет [/color] а тут обычный
Ну или ты можешь завелосипедить свой аналог при помощи String.replace или String.replacen, если тебя напрягает присутствие фигурных скобок в строке внутри жсона. Или использовать String.json_escape | String.json_unescape.
Вообще, использовать String.format в таких случаях предпочтительнее всего, потому что при переводе на разные языки может оказаться, что в другом языке другой порядок слов, и порезанная строка никак не адаптируется под него. А так прямо в переводимой строке можно прописывать все "переменные".
>>934677 Опиши реальный сценарий. Ну ок не с исходником, а со спрайтшитом до импорта в годот. Фон однотонный? Imagemagick. Фон типа пейзаж? Вроде нейронки какие то были.
Всем привет. Что стоит иметь ввиду при вкате в годот? Я рассматриваю его как альтернативу возможному своему текущему инструментарию (я - изврат из IF-треда, пишущий на твайне (связка js-html-css-sugarcube 2 с основным упором на жс), пилящий пейсочницу/рпг), пока что безыгорный. Вообще, есть какое-то подобие роудмапа? Как какать куда смотреть в первую очередь?
>>934786 >на твайне >пилящий пейсочницу/рпг Твайн же по визуальным новеллам, не? Если так, то у нас хватает плагинов для ВНок.
>Вообще, есть какое-то подобие роудмапа? Мой путь был таков. Проходил официальный 2д гайд, делал насколько учебных проектов, потом поглядывая разные туториалы на ютубе начинал делать свои идеи.
>>934789 Твайн необязательно по вн, но для них он хорошо подходит. Но он точно не подходит для того, чтобы писать игру песочницу/рпг, в которой можно грабить корованы. А я именно на это нацелился. К слову, я пописываю уже полгода в неторопливом темпе. Из последнего - влетел в один досадный баг и выкинул нахуй весь жс с целью переписать его с начала с учётом того, что узнал, лучше и с менее отбитыми решениями.
это код для RigidBody2D игрока, чтобы когда он влетал в край экрана то появлялся с противоположной стороны
То что _integrate_forces юзается чтобы просчет process_physics(delta) не пидорасило я понял Но что делает аргумент в скобках? по дефолту там "state", но автор книги написал "physics_state" потому что "state" уже используется выше Вроде это добавляемое состояние для Игрока, но как оно работает непонятно и что еще за physics_state.transform? что за origin и его ".x"
>>934828 Physics state это внутреннее состояние физ движка, нк пытайся понять, это тебе не понадобится в билжайшие несколько лет. Трансформы описаны в доках, сам трансформ это общее преобразование (позиция, поворот, масштаб), origin это только позиция, x это одна из 3д координат x.y.z
На пике снизу приходит сигнал с менеджера сцен, 30 строчка просто не работает, никаких ошибок ничего нет, просто не работает, при этом в отладчик print мне спокойно эти +++ выводит (31 строчка), то есть сигнал доходит без проблем.
Я добавил специально в сцену кнопку для теста, когда я нажимаю на кнопку, текст меняется на --- без проблем
под переменной просто ссылка на richtextlabel, я пробовал вставлять напрямую, все тоже самое. В чем проблема?
Я сделал вот так на пике В обоих случаях принт мне все выводит, но если через сигнал с менеджера сцен, то текст не меняется. Если через кнопку - меняется. То есть когда сигнал идет с другой сцены - .text просто не работает. Это баг или фича?
>>934875 Хотя это наверное не при чем. Сложно сказать. По опыту могу посоветовать проверить, что ты не затираешь значение тут же другим, например в процесс постоянно не перезаписываешь или обработчиком кнопки (может у тебя постоянно создается эта строка заново ), второе проверь что сама ссылка указывает на тот же объект. Попробуй вывести print(fio), print(fio.name), print(fio.text)
>>934880 Так а сигнал ты вызываешь? Просто зеленая стрелочка означает что кнопку ты подключал через интерфейс редактора, а у второго такой нет, значит ты где-то должен сделать connect, и emit. Проверь в таком случае количество аргументов. Емнип если у тебя обработчик handler(), а ты испускаешь сигнал с параметрами, то этот не вызовется потогму что не совпадает кол-во аргументов.
Это похоже какие то костыли в работе сигналов или я не знаю. Вообщем я еще потестил пик. С кнопки все работает как надо. Через сигнал работает только отладчик, .text и .hide не работают. При всем этом для сигнала и для кнопки счет x идет независимо, хотя по идеи должно идти вместе. То есть я нажму кнопку, станет 11, потом через сигнал - опять 11 выводит, 2 раза кнопку - 1111, а потом сигнал - 111. Короче залупа какая то я хуй знает или я чего то не понимаю в работе сигналов и так и должно быть.
выше кода ничего нет и ниже тоже, я все закомментил на втором пике как вызывается сигнал, функция активируется просто нажатием на кнопку на другой сцене
>>934894 >То есть я нажму кнопку, станет 11, потом через сигнал - опять 11 выводит Это скорей говорит о том что ты твой объект принимающий сигнал в какой то момент задублировал. В каком файле/классе находится _test()? Проверь где ты создаешь объект этого класса. Выведи при отладке и print(self.name)
>>934894 Я даже так предположу. Ты добавил на сцену объект (пациента или что то такое). Подключил ему в редакторе сигнал от кнопки. Не подключал скриптом его ко второму сигналу. Он принимает только сигналы от кнопки. Потом ты в скрипте где-то спавнишь такой же объект. Ты не подключал его к кнопке. Но ты в скрипте подписываешь его коннектом на програмный сигнал. Он принимает только програмные сигналы, но не кнопку. Они могут находиться в одном месте экрана, и ты даже не знаешь что они накладываются друг на друга.
>>934901 >print(self.name) Благодаря этому нашел проблему, сейчас все заработало, спасибо!
>>934906 Да всё проще, я изначально на сцену добавил вторую сцену и все подключил. Потом я эту вторую сцену решил переместить в третий сцену, а уже третью сцену добавить к начальной. При всем этом я забыл удалить вторую сцену из первой, а она ещё и скрыта была, поэтому я не замечал, что у меня по факту стало 2 вторых сцены. При всем этом скрипт к сценам был прикреплен один и тот же. Короче затуп на ровном месте.
>>935033 На первой соньке столько игор сделано, что за одну жизнь всех не переиграть. Если хочется первоплойковской эстетики, просто качаешь эмуль и кайфуешь до самой смерти. Создатели подобных гунметалов перекрывают доступ нам к настоящей олдовой годноте.
Такшта я как считал, так и считаю, делать надо современное, с туншейдером, если тебе не хочется 4К текстуры ставить.
>>935084 >Если хочется первоплойковской эстетики, просто качаешь эмуль и кайфуешь до самой смерти К первоплойковой эстетике в настоящих играх на первой плойке прилагается хуевое управление, кривой геймдизайн, ограничения железа и прочие чудесные вещи консольных игр той эпохи
Блять вторая игра из книжки это дохуя сложно для меня, какой то турбокод который хуй проссышь Автор тупо говорит добавляй это в код, потом это добавляй он то то делает, но я нихуя не пойму логику по которой он вообще добавляется, типа блять а как мне быть когда я сам буду скрипты писать? Как мне продумать что в этом скрипте писать а что в том? А как лучше?
И код сложнфй пиздец, я непонимаю мне хуй на него забить или сидеть изучать что такое "ортогональный" и почему то то умножается на тото
>>935673 _ready() вызываются в порядке от вложенных нод в сторону корневой. Поэтому в ready можно присваивать переменным ссылки на объекты гуя Запись @onready var a = $smth Соответствует var a
Сейчас делаю игры по книжке где 4 игры Мне стоит пока на этом сосредоточится или надо паралельно какую нибудь свою игру пилить? Просто я думаю если игру паралельно пилить то там гуглить надо будет дохуя а это время, а у меня после работки его маловато
>>935934 Ну вообще хочеться перекатится побыстрее на заработок с игор, ибо у меня дноработка 20к и умирающий новутбук, а родня подгоняет пойти на работу пооплачиваемей в колхоз блять за 40к (скорее 30к)
Ты бывал на коровьей ферме? Я бывал, и я не хочу туда
>>935935 >Ты бывал на коровьей ферме? Я бывал, прикольный говняк кругом.
>заработок с игор Будем честны, шансы не слишком большие. Как сказал анон выше - тебе в гиперказуалки, кликеры, веселые фермы, 3-в-ряд, и все такое. И лучше всего сразу под мобилки. А с гугл-плеем и выводом оттуда денег - сам понимаешь, санкции. Мне пришлось в соседней стране банк открывать чтобы все заработало.
Либо, если не под мобилки, то возможно какие-нибудь яндекс-игры или вк-игры. Тут я не шарю.
>>936132 Добро пожаловать в новую с 2022 реальность. Тебе в гугл-плее еще 25 баксов оплатить надо будет за девелоперский аккаунт. С российской картой это, увы, невозможно.
>>935966 Наоборот. Только его и пропускают. С чем-то более сложным, чем три в ряд, заебёшься проходить модерацию, там всегда найдут, к чему прицепиться.
Удваиваю >>935962 . Ебашь по туторам, это самый рабочий вариант для ЯИ.
>ThreadLoadStatus load_threaded_get_status ( String path, Array progress=[] ) >... >An array variable can optionally be passed via progress, and will return a one-element array containing the percentage of completion of the threaded loading. Сукааа в чью светлую голову пришла вообще эта идея? Нахуя? Почему нельзя было сделать как-то так: >Array load_threaded_get_status ( String path, bool report_progress=false ) Чтобы функция возвращала две чиселки вместо одной - первая это статус, вторая прогресс.
Ёбаные сишники. Как же бесит эта их манера вместо int foo(int bar) делать void foo(int★ bar). Возвраты вам для чего Ритчи и Страуструпом даны?
годот 4.2, хочу выложить игру на яндекс калыч, но выдает эту ошибку. В итче знаю можно просто галочку поставить и все заработает, но тут так сделать нельзя, как можно пофиксить? Игра браузерная
>>935933 Либо пили свое, либо улучшай игры из книги, так ты гораздо быстрее познаешь все нюансы. Простое копирование - не твой путь. Если соберешься делать под мобилку и ведроид, то помни, что есть не только гугло-стор но и всякие дополнительные площадки типа: apkmirror.com appbrain.com taptap.io developer.taptap.io open.qoo-app.com Там зачастую нет такой анальщины как в гугле с предрелизной проверкой. Мимо пилю под игру и хз как найти 20 тестеровщиков для гугло-стора.
>>936141 > еще 25 баксов оплатить С беларуского райфайзена все оплатилось отлично, так что проблема решаема дешевым путем.
>>936245 А как вообще модерация проходит? Типа загрузил игру и какой то модер должен ее поиграть пару часов и потом как то на почту напишет что "хуйню сделал, переделывай давай"?
Как прервать анимацию вызванную из _physics_process? Вот у меня персонаж, у него играет анимация idle, тут к нему подходит другой персонаж которому надо уебать и проиграть с этим анимацию attack. Анимация, конечно, проигрывается, за доли секунды, поэтому создаётся впечатление что постоянно играется idle. Вот и как прервать idle на время проигрывания attack? Загуглив нашёл только один тред на Редите где чел вышел из положения вместо _physics_process использовав _ready, но это не мой случай, ибо c _ready ничего не будет играть вообще.
Это не сложно, добавить двоеточие к знаку равенства в большинстве случаев не вызовет ругани компилятора. В редких случаях нужно будет указать тип вручную.
>>936314 Ты только что крейзигеймс, лол Нет, у них там воооот такенный свод правил, и модер должен убедиться, что в игре они нигде не нарушаются ни на буковку.
>>936647 Я всё подряд типизирую, мне не сложно. Вообще, нетипизированные данные - это клёвая фича, но нужна она буквально в двух случаях. 1. Когда делаешь универсальную функцию, принимающую на вход какие-то данные. Функция их как-то интерпретирует, приводит к типу и выдаёт однозначный результат. Например, func play_sound(sound), где sound может быть ресурсом наследником AudioStream или именем файла. 2. Словари. Хотя в четвёрке стало гораздо удобнее использовать кастомные классы в большинстве случаев, когда в тройке я бы заюзал словарь. По сути сейчас словари нужны только для хранения больших гибких структур, типа сохраняемых данных.
>>936717 Ну, тут конечно ситуация тяжкая, раз уж ты в процессе каждую анимацию проигрываешь. Можешь либо переписать всё под стейт-машину, но это почти весь код перелопатить придётся, либо добавить проверку текущей анимации и ее прогресса в строчку с is_on_floor(). Привести к виду чего-то типа пикрила. Конечно, работать будет только при условии, что у тебя анимация "attack" не поставлена на луп.
Ах да, ещё заёб, про который открыто не пишут. а) Модер натыкается на нарушение - модер прекращает проверку. Если там дальше есть какие-то проблемы, до которых он не дошёл, это твои проблемы. б) После прохождения мочерации (а она и так занимает день-два) повторно отправить можно только через время, начиная от суток. И с каждым разом это время увеличивается.
>Можно например кровавый клон дум первого залить? Или там совсем на малышей все расчитано? Можно-то оно можно, сисема возрастного рейтинга там есть. Вот только игроков постарше нет. Там не то чтобы рассчитано под детей, но преимущественно именно они и обитают на платформе.
>>936766 На крейзи, если твоя игра им "не подходит", они просто отказывают без указания причин. Причины указывают только если "подходит", но какие-то правила нарушает. Какие критерии "подходимости"? А пошёл ты на хуй, вот какие.
>>936832 >крейзи Ты меня замотивировал туда отправиться. Сейчас открою вкладку, которая уже недели 2 висит, и заполню эти унылые формы. Отпишусь возьмут ли.
>>936832 По сути сторы хотят чтобы: твоя игра не вредила их бизнесу (не подставляла под порнографию, политику итд) в частности им не нужна хорошая игра как игра, но тот же ЯИ требует хотя бы набивать контентом. Им же надо чтобы игрок зависал на платформе и ему было интересно, чтобы скармлимать ему рекламу. То есть им не нужна игра на 5 минут, им надо игра на полчаса хотя бы. И они не хотят технических косяков. Это пункты про картинку пола, отключение звука на альт табе, отключение долгого клика на айфонах, вот это все. Так что принцип довольно простой. Им не нужна хорошая игра как хорошая игра. Им нужна качественно сделанная, наполненная контентом на какое-то продолжительное время, пусть и примитивная казуальная игра.
>>936876 Отлично, есть healess игровой сервер (который может запускать ту же игру, только без графона - физон, игровую логику), его поднимали во всяких облачных хостингах, есть RPC (дистанционный вызов функций) в 4-ке это аттрибут @rpc, в 3-ке надо было вызывать rpc("имя функции"). Пользовался в 1 игре и 2х утилитах (коннект мобильного клиента и пк). Ну если что попроще там есть http запросы и вебсокеты, если с самописным серваком соединяться.
>>936893 > sharedbuffer Несколько тредов назад постили аддон, который как-то решает эту проблему, я сразу не схоронил, а теперь ссылку найти не могу. А может он оказался нерабочий и его удалили из ассетлиба.
>>936896 Да у меня все равно игра мультитредовая, если ей шаред буффер вырубить то она работать перестанет. Так что крейзигеймс в пролете, не получат они мою драгоценную 10/10 готи игру.
>>936901 >This allows you to force the exported game to run on a single thread У меня мультитредовая игра. Я в коде, сам, треды использую. Чтобы треды работали в вебе им нужен SharedArrayBuffer, если я его выключу (когда дадут возможность), то у игры жопа код отвалится.
Но не критично на самом деле. Игра свое уже показала, когда-то давно я ее под итч делал, сейчас просто хотел дополнительно раскидать.
>>936907 Ну вот ты открыл несколько тредов в отдельных вкладках и читаешь один, а в сосежних мигает значок, что новые посты появились, ты переключаешься в соседнюю вкладку и читаешь посты там, и пока ты читаешь в одной вкладке ты не можешь читать другие, но при появлении новых постов они опять мигают и ты опять переключаешься в другую вкладку.
Вот буквально, литерально, точно так же действуют треды в кодинге. Только читателем в этом случае является процессор пеки.
В одном треде крутится основная игра, а в других тредах подгружаются соседние локации, и когда подгрузились, мигают процессору семафором "эй, я сделял" и проц хватает данные и предоставляет основному треду.
>>936905 >когда-то давно я ее под итч делал, сейчас просто хотел дополнительно раскидать. Не повторяй моих ошибок. Игра под итч и игра под ЯИ - это две очень разные игры. >Я в коде, сам, треды использую А поделись, если не секрет: для чего? Просто мне вот до сих пор не встречалось ситуаций, когда бы это было действительно нужно. Единственный раз понадобилось для загрузки файлов, но для этого у годота есть готовый объект, который сам внутри себя мультитредит как надо. А операции с нодами в любом случае надо в основном потоке делать.
>>937017 Для оптимизации тугого участка кода, там много массивов с кучей информации об истории ходов и оно хорошо параллелилось. Сейчас я уже понял как сделать однопоточно и еще быстрее, но лезть в старый код, в старый проект - и лень и стремно.
Может однажды слоупоки вроде ЯИ и крейзигеймс смогут в SharedArrayBuffer, тогда и им выложу.
>>936992 Шутки шутками, но ящитаю покемоны-стайл или тамагочи-стайл - всегда актуально. Тот же "мой говорящий том" и его клоны до сих пор в топе гуглплея.
Годаны, чего я не понимаю? @tool скрипт. Делаю add_child(node). В дереве сцены, ессно, она не появилась, но визуально видна. Таких нод у меня много, целая генерация. Я в редакторе их нагенерировал, проверил, что всё ок, и теперь хочу, чтобы они отобразились в дереве и сохранились в сцене, чтобы больше не генерировать. Применяю к ним node.set_owner(self). И нихуя не происходит. Что я мог упустить?
Как делать звуковую составляющию игры, если вообще ничего не понимаешь в этом? Я про общую композицию, атмосферу, правила они же наверно есть? и прочее. Вообщем реквест годных материалов по прости господи саунд дизайну или как это называется, желательно на русском
Где брать звуки и музыку, не самому же мне ее писать, аутсорс не предлогать, я бедный соло разраб.
Ну и какой подход лучше, делать звуки одновременно с другими задачами, или сделать все, а потом в конце плотно сесть за музыку и сделать сразу для все игры.
>>937066 >жанр так рано или поздно вымрет из-за эксплуатирования ровно тех же идей в каждой игре. Это как утверждать что котики-собачки вымрут из-за того что живут в каждой второй квартире.
>>937085 Ну так-то ты прав и их купили все желающие, потому их не покупают.
>>937081 Решил посоревноваться со мной в кривых аналогиях? Ну держись. Нет, то что я сказал, это как утверждать, что динозавры вымерли потому что питались одним и тем же мясом и одними и теми же папоротниками.
>>937038 Поковырялся в доках, пришёл к рабочему решению: EditorScript.new().get_scene() аригато, семпай В итоге всё равно отказался от этого решения, потому что тормоза вызывает генерация кучи нойзтекстур, а не это вот всё. Но на пути к этому пониманию твой совет очень помог.
>>937600 Попробую объяснить своими словами (это может быть не так, как реализовано реально в коде, но так, как воспринимается со стороны игродела) Вся сцена помещается в Bounding Box, и на этот объем натягивается текстура для тени размером указанным в Project Settings directional shadow size. Соответственно, проблему можно решить: 1) Увеличив размер текстуры тени (за счет видеопамяти) 2) Уменьшив дальность в Directional Light, тем самым уменьшив 3д объем, при сохранившемся разрешении текстуры тени. Ну и играйся с остальными настройками, например blend splits сглаживает края. А так да, тени в годоте всегда сложно настраивать. Дальше возможно придется погружаться в запечение (для неподвижных объектов).
>>937668 Плюс, насколько я понимаю, настройка Splits сделана для того, чтобы можно было сделать и тени для больших объектов (типа стен), и небольших (типа мяча рядом с камерой игрока).
>>937694 Там очень много подводных, все сразу не вспоминть, и такие моменты что тебе важнее, четкая тень или стабильная (которая не дрожит между кадрами), и что тебе важнее, тень на горизонтальном полу или вертикальных стенах, довольно сильно зависит от того большие или мелкие предметы. многое описано в доках https://docs.godotengine.org/en/stable/tutorials/3d/lights_and_shadows.html а в мобилках это все выкидывается нафик и рисуется просто декаль кружока, такие дела
>>937668 > возможно придется погружаться в запечение (для неподвижных объектов) А если в игре мечты предполагается динамическая смена дня и ночи? Запечение не покатит.
>>937700 >>937694 Так, годаны, погодите. Обесните мне в чём я неправ: Ящитаю, в 2024 нет смысла ебаться с тенями/зеркалами. Задача движка сегодня - предоставить видеокарте с рейтрейсингом, где в сцене источники света и дальше она сама строит тени и отражения. Соответственно, задача девелопа теней сводится к простому алгоритму: 1. Берём в руки си++ и пишем свой проприетарный модуль-адаптер к ртх видюхи (либо нанимаем скиллового челика) 2. Детектируем ртх у игрока. 3. Если ртх не найден, сообщаем игроку, что пусть довольствуется дефолтными говнотенями. Всё.
А вы пытаетесь какие-то тени идеальные выводить. Смысла в этом ноль. Эпоха сменилась. Алё.
>>937741 Собственно на этом месте я пока и бросил делать дин. смену дня и ночи в опенворлде. Скила пока не хватает, изкоробочными решениями не обойтись. Одна из проблем как раз упомянутые горизонтальные/вертикальные поверхности. Допустим я настроил параметры bias и прочее как мне нравится в сцене, а потом поменял угол солнца, и только тени снова пошли полосами, а значит эти параметры надо тоже менять динамически для объектов, может быть даже для каждого часа времени. А еще, емнип в 3-ке, если просто крутить directional light, то шэдоумапа пересчитывается. Поэтому каждый кадр это делать тяжеловато становится для фпс. Возможно там надо делать что-то с интерполяцией, посчитав тень для двух углов солнца. Но вот на такое скила у меня не хватает.
Меня вот эти интересуют. У них древний телефон и глес2, но при этом вполне себе графон на 60 фпс, динамичное освещение, смена дня и ночи, вся хуйня. Они обещали запостить как они этого добились, но так ничего и не запостили, только хайпанули. Пидоры.
>>937757 >древний телефон 8 ядерный флагман, хех. Чуть чуть быстрее моего Xiaomi того же года, а у меня все летает. Так что не очень показательно, не днищефон.
>>937764 У меня видос мыльный в этом месте так что не могу сказать что там происходит. Может дело в том что показан маленький кусочек мира? Ну то есть попробуй применить совет выше и просто ограничь directional light max range God rays и дождь там просто 2д (брызги прямо на дереве спавнятся, не за ним), но с пересчетом проекции.
>>937825 >>937826 Вот я хочу сделать резкое стилизованное затемнение шейдерной травы для plane. Т.е что бы спрайт травы не частично затемнялся от тени, а целиком создавая резкий переход. Насколько я понимаю мне надо получить в точке с травой на plane с шейдером количество тени, и покрасить этой тенью весь спрайт травы. Но я что то нихуя не пойму где тут получить это тенивое значение. Нашёл только какие то обсуждения годовой давности на забугорном форуме но там пишут, что без ковыряния в исходниках такой возможности нету. https://www.reddit.com/r/godot/comments/11ma6if/is_there_any_way_to_access_the_directional_shadow/
>>937842 Какой рендер? Подозреваю мобильный? В любом случае, твоя цель - минимизировать кол-во пар свет-материал. То есть: ограничить радиус света, чтобы свет светил на меньшее кол-во объектов, (соответственно возможно имеет смысл разбить большие объекты на мелкие тайлы, но тут не 100% уверен). ограничить чтобы на один объект светило как можно меньше источников, в идеале только 1. В каких-то режимах рендера, каждый свет это отдельный проход, поэтому на мобилке вообще хардкод лимит 8. Уменьшить кол-во материалов в объекте, а то бывает даже в лоуполи нагородят десятки материалов, когда достаточно одного-двух. По возможности не связываться с полупрозрачностью, особенно многослойной (стакан на фоне бутылок на фоне окна). Обычная прозрачность (есть/нет), вроде, норм, поэтому иногда заменяют тени или прозрачность на дизеринг (в геншине видел). Если ты делаешь траву как выше, копай в сторону Multimesh Instance. Или вообще попробуй для начала готовый аддон https://github.com/HungryProton/scatter там есть готовый пример.
>>937837 >Насколько я понимаю мне надо получить в точке с травой на plane с шейдером количество тени, и покрасить этой тенью весь спрайт травы. Думаю, это можно получить или рисуя в текстуру и проверяя результат, или пуская рейкасты, на проверку между листом и источником света, для конкретного листка. Изнутри шейдера не могу придумать, как это может работать хорошо (если только в вершинном это сначала как то определить)
>>937849 Хорошие советы, спасибо. Поделаю их. Сейчас пытаюсь нагородить альтернативу с помощью HDR в тройке, оставив только 1 реальный омнилайт, остальные заменив объектами с эмиссией.
>>937853 HDR вроде отжирает долю перформанса, и его нет в GLES2. Ну и с эмиссией там будет такой момент, что аура свечения у emission будет одинаковая и индивидуально настроить тут не придумали, см. >>875941 →
>>937858 >HDR вроде отжирает долю перформанса Да, сразу на треть упало, но по моим тестам это пока лучше чем омнилайты. Тут еще плюс в том, что глоу-объектов я могу навалить сколько угодно, и фпс будет почти одинаковый что при 1, что при 300 объектов. А каждый дополнительный омнилайт больно кусает за фпс. Ты прикинь какие красивые уровни можно запилить, имея 300 небольших глоу объектов? Да я ща Blackreach из скайрима!
>Если менять Power в emission, меняется цвет свечения, но радиус остается тем же. Пикрилы - только energy поменял, с 16 до 2. Радиус уменьшился. Думаю у тебя была проблема в настройках WorldEnvironment -> Glow -> Levels. Я все 7 включил.
>>937761 >Однако, через время мы осознали, что взяли слишком жирный кусок и поняли, что нам стало тяжело и неинтересно. Мы увязли в этом проекте, и он стал напоминать вторую работу, просить очень много времени и приносить минимум веселья. Поэтому мы решили не продолжать. Вместо этого мы стали делать другую игру, Лол. Сделали самую маленькую (пусть даже и сложную) часть, а как дошло до всей остальной игры - забили. Ай да разрабы.
>>937922 Сейчас подумал что можно сделать с помощью скелетон3д. Если надо по станции таскать, то вероятно тебе нужна еще и физика, а не просто графика. Чел тут похожее делает - https://www.youtube.com/watch?v=0AR7RqQ_QzU
>>937938 А еще можно унаследоваться от майнлупа и подсунуть этот скрипт майнлупу (дефереддом подсовывать). И будет у тебя майнлуп со своими дополнительными методами. Только в четвёрке с допиленными до ума статиками это уже не нужно.
Парни, я как всегда забрёл в пучину деталей, хотя даже движок ещё не скачал и меня волнует совершенно левый вопрос, но я жить не могу споукойно, пока не докопаюсь до сути. Короче, узнал тут про draw call'ы, и что типа если текстурки находятся на разных "слоях", типа на 3 слоях 2 текстуры: 1 2 1, то будет 3 дк, а не 2. Как это решается, если нужно расположить вот так вот слоями и с наложением?
>>937947 при чём тут движкосрач, даже в доке годота есть кусок на эту тему, но я не понял написанного, там типа предлагается размещать как-то последовательно текстуры, тогда можно будет рендерить как 1 1 2, но момент с наложением я не понял
>>937938 На практике бывает - хочу скопировать кусок кода из прошлого проекта. Ну в общем копаться, листать в блокноте tscn которые бывают мегабайтные, с немного съехавшим форматированием - такое себе. Поиск по файлам тоже дольше. Один раз искал в какой папке положил - вот скрипты одной системы, (контроллер персонажа к примеру), вот другой, а нужных нет. Оказалось тоже в сцене был.
>>937951 По описанию звучит так, что движок при батчинге занимается этим сам, и тебе ничего переставлять не нужно. Или ты про то, как это отключить? Есть проходы (shader next pass), есть Material Overlay. Но они и нужны когда тебе надо сначала что-то нарисовать, а потом либо постобработать, либо поверх полупрозрачный эффект накинуть (типа силового поля). А в таких случаях это должно быть гарантировано после. Нет никакого смысла покрывать один материал другим непрозрачным - тогда первый вообще не был нужен. Переупорядочивание относится только к непрозрачным объектам, скорее всего, а благодаря буферу глубины, неважно в каком порядке они рисуются.
>>938013 любой серверный язык программирования, но вроде в годоте можно делать локалку, типа один игрок сервер, другие клиенты, в таком случае и гдскрипт будет работать наверно
Годаны, посоветуйте годной инфы по ИИ. Игра - по типу Катана Зеро. Двумерная вид сбоку, у врагов есть огнестрел. Пытаюсь понять, какие алгоритмы существуют, чтобы в подобных играх выстраивать пути, но все материалы по 2д фокусируются на виде сверху.
>>938033 >все материалы по 2д фокусируются на виде сверху
Потому что для топ-даун игр это проще всего реализуется - строишь путь по какому-нибудь A* и двигаешь по точкам болванчика - нехуй думать, в общем-то. Когда уже в дело вступает физика всякая итд - там появляются прочие условия и переменные, поэтому двигать болванчика приходится не настолько прямолинейно.
Беглый поиск конкретно для годо приводит, например, к такому видосу - чел рассказывает про инструменты в самом движке и как это работает (на инглише офк, кто тебе на русском чето объяснять будет) https://www.youtube.com/watch?v=LKyGdiHzIk8
Аноны, я новичок в годоте, можете подсказать? Есть state machine игрока, там список действий и анимации к ним. Допустим, я хочу, чтобы игрок мог бить во время прыжка, но первый кадр атаки вызывается в прыжке, а остальные уже при приземлении. Как это исправить? Сорян за тупой вопрос, просто не понимаю
>>938070 > Сорян за тупой вопрос, просто не понимаю Вопрос не тупой и описан в статье о стейтмащинах (выше по треду). Суть в том, что для движения и для стрельбы нужны две стейт-машины. Нельзя мешать в кучу то, что должно быть одновременно. Поэтому ты заводишь вторую стейтмашину для стрельбы, вырезаешь из первой всё, что связано со стрельбой и настраиваешь свою логику так, чтобы стейт-машина ходьбы управлялась WASD, а стейт-машина стрельбы управлялась ЛКМ.
Самое интересное начнётся с анимациями. Потому что в анимациях нужно как-то замиксовать несколько стейтов из разных стейт-машин. Как правило это решается через ограничения по скелету.
>>938076 > А если скелета нет? Тогда подразумевается, двадэ на спрайтщитах? Тогда нужно делать комбинированный узел персонажа из двух и более спрайтов, каждый из которых контролируется своей стейт-машиной. Например, одна часть - туловище с ногами, контролируется ФСМ движения, вторая - руки и голова, контролируется ФСМ стрельбы.
>>938079 Я не он, но у меня например 3д с простейшей не-скелетной анимацией, и пока я их проигрываю последовательно, "прыгнуть", "покрутиться". Сделано на AnimationPlayer, где я тупо меняю rotation_y и origin_y. Если бы мне нужно было их замиксовать, как бы тогда эта проблема решалась?
>>938068 >на инглише офк, кто тебе на русском чето объяснять будет Спасибо за заботу, братюнь, как-нибудь пойму. В целом видос кое-что прояснил. По крайней мере, указал направление, куда копать.
Я так понимаю идея в том что навигация - это граф, соответственно можно делать все то же самое что обычно. Возможно пометив (даже автоматически) точки где спрыгивать-запрыгивать.
>>938120 >ссыль №1 О! А я ведь искал этот аддон и не нашёл. А оказывается, он просто для тройки был. Жаль. Ну хоть исходники почитаю.
Годаны, а я тут знаете что понял? В четвёрке же добавили тип Callable. Так вот, а ведь с ним гдскриптовые словари полностью повторяют луа-таблицы. Даже лучше, потому что таблица в луа это неловкий гибрид словаря и массива, а в гдскрипте массивы теперь ещё и типизировать можно, джва года ждал. Так вооот. Теперь можно в словари запихивать не только сложные иерархические структуры, но и целые указатели на функции. И эти функции по этим указателям вызывать. Ну круто же! Или вот такие штуки: var arr: Array[Callable] ... for f in arr: f.call() сразу напрашивается применение - сценарии для всяких комплексных процедур, которые так и хочется разбить на части и выполнять не то что в цикле, а по чуть-чуть в _процессе. Это я к чему. Раньше я мечтал о человеческом луа в годоте (было только не дебагаемое). А получил даже лучше - ещё и возможность статической типизации. Каеф.
Осталось блочные комментари добавить для полного счастья. Ну типа --[[ такого --]] или / такого /. Или, для соблюдения стиля, как-нибудь |# вот так #|
>>938188 >сценарии для всяких комплексных процедур, которые так и хочется разбить на части и выполнять не то что в цикле, а по чуть-чуть в _процессе. Звучит как корутины. В оф доках не нашел, но как понимаю их можно делать на yield >for f in arr: >[Callable] Могут быть накладные расходы, надо тестить.
Сейчас имею такую систему, массив: y: [x1,x2] Нахожу количество данных в массиве, а потом рандомлю в полученном диапазоне значение. Шанс x1 50% Но вот я захотел, что после некоторого события шанс увеличился скажем до 75%. Как мне это грамотнее реализовать?
Пока придумал такую схему, я просто добавляю к массиву ещё x1 до вида y:[x1,x2,x1] да шанс 77% но смысл я думаю понятен
Понимает кто-нибудь как работает raw формат цветов в годоте? Вот тут я бы ожидал что цвет будет желтым, но на практике он белый. В документации ничего найти не получилось.
>>938275 Похоже на баг. RAW явно отражает 0 ... 255 в 0 ... 1,0. Т.е. поменяй на 1, 1, 0, 1. Либо это для поддержки HDR сделано, но в любом случае интерфейс неудачный.
>>938268 Для гскрипта я не нашел решений хотя особо и не искал, плюс хочется сделать +- самому, чтобы понять принцип работы и нормально встроить в уже готовый json с массивами.
Количество в словаре изначально неизвестно, поэтому вместо % я думаю лучше использовать коэффициент, условно 1 Допустим словарь {x1: 1, x2: 3}. Я беру и рассчитываю массив для генерации, используюя значения из словаря, получится [x1,x2,x2,x2] и рандомлю одно значение из массива. Вполне себе работает. Но если я захочу сделать значение 0,5 или 3,5 то как тогда?
>>938279 Видел такой вариант (сам им буду пользоваться) - складываешь все веса (1+2+2+2+0.5+3.5), делаешь рандом от этого (11), и в цикле проверяешь. roll < 1? roll < 1+2? roll < 1+2+2?
>>938279 Догадался до очевидного решения взять тогда коэффициент по стандарту не за 1, а за 100. Какие подводные кроме огромного конечного массива для генерации, насколько тяжело будет компу условно с 10000 элементами в массиве?
>>938278 Для HDR, да. Raw можно поднимать выше 1, это работает как запланировано, чем выше значение тем заметней HDR эффект. Я просто не могу понять как в raw-формате указать конкретный цвет при условии значений выше единички. Я могу конечно руками подобрать, на глаз, но это такое себе.
>>938283 Ну попробуй выставить нужный цвет мышкой (получится какой-то 0.96, 0, 0.77), а потом умножить на коэффициент, прямо в окошке инспектора напиши *100
>>938256 Это другое. Блочными же можно закомментить даже часть строки. К тому же 4.2 расставляет эти # не в самом начале строки, как это делала тройка, а после табов. И пробел не ставит. Некрасиво.
>>938286 Некогда особо расписывать. Ну у тебя рандом число может быть float 0..11.0 (сумма всех твоих весов). Значит оно указывает на какой-то диапазон. Диапазон считаешь от нуля. Если не принадлежит первому диапазону, то искать в следующих, если принадлежит, вернуть предмет. Цикл может накапливать сумму весов, не обязательно каждый раз всю пересчитывать, просто прибавлять вес текущего проверяемого предмета.
Есть куча спрайтов. Все разного размера. От крохотных (например, 51х51) до довольно больших (что-нибудь типа 257х368). Хранить их отдельными картинками не комильфо, лучше одним атласом, говорят, это уменьшает количество дравколлов. Ок, собрал все в один файл, он получился даже не слишком гигантский. Дальше надо придумать, как их размещать. Ну, очевидный тайлмап? Увы нет, тайлмапа хочет плитки одинакового размера, а это привести к одинаковому размеру нереально. Спрайтами используя регионы? Тогда придётся создать дохуя сцен под каждый предмет, чтобы каждый раз не настраивать регион и оффсет. Я в замешательстве. Годаны, посоветуйте.
>>938367 Я ее особо в этом шарю, но как вариант можно объединить спрайты только одного размера, и спокойно использовать тайлмап. Тоесть будет не один атлас как сейчас, а условно 10 или сколько у тебя там разных размеров.
Аноны, направьте в нужное русло. Хочу сделать зелье хп, игрок их может подбирать/покупать. Зелья должны где-то храниться и запоминаться. Я нихуя не понимаю, подскажите статейку или гайд, по схожей теме мейби
>>938426 А вот собственно, на канале из видоса постом выше, погляди старые видосы, он там и за подбираемые предметы поясняет в том числе. Делай скидку на трёшку, подхватывай суть и делай на четвёрке. А если ты на трёшке еще сидишь, так вообще легко будет.
>>938426 > направьте в нужное русло > Хочу сделать %предмет_нейм% игрок их может подбирать/покупать. > должны где-то храниться и запоминаться ...и, поскольку ты думаешь о зельях, эти предметы должны применяться на игрока и возможно на других персонажей.
Так вот, направляю в нужное русло. Главный программный паттерн большинства игор - база данных. Это необязательно должна быть большая серьёзная СУБД больших дядь из серьёзного ентерпрайза, нет. Тебе достаточно организовать в памяти словарь с данными и удобные тебе функции создания, чтения, обновления, удаления данных в нём.
Когда у тебя будет действующая база данных в проекте (назовём её "Менеджер предметов", МП) у тебя большинство вопросов само отпадёт. Но допустим, не отпало, давай по шагам распишем события, происходящие с типичной банкой с зельем на локации. 1. Локация загрузилась в память и обратилась к МП, получив список предметов, которые у неё должны быть. 2. У локации есть первоначальный список предметов, с которыми она была изначально запроектирована. Локация сразу удаляет из него все предметы, помеченные как удалённые и удаляет (не даёт им появиться в принципе). 3. Локация проходит по списку из МП и расставляет предметы оттуда, не забывая сверяться с встроенным списком, чтобы не задваивать предметы. 4. Игрок идёт по локации и видит зелье. Зелье это интерактивный предмет, у которого есть действие "подобрать". Это действие выполняет две простейшие операции: создаёт (или обновляет если есть) запись в МП о наличии в инвентаре игрока зелья (если это зелье из списка первоначальных предметов, а не дропнуто игровой логикой ранее, то дополнительно в списке локации помечается как удалённое), и второе - удаляет себя с локации. 5. У зелья так же может быть действие "применить" которое минуя работу с МП сразу передаёт игроку свои параметры и самоуничтожается (с записью в локации, если оно первоначальное). 6. У игрока есть инвентарь. Инвентарь состоит из двух частей: визуальной и логической. Визуальная часть - управляет картинками, перетаскиваемыми по гриду или листбоксу. Логическая часть, как и у локации, взаимодействует с МП, чтобы создавать, читать, обновлять и удалять данные в МП, относящиеся к инвентарю игрока. 7. Запись в МП о зелье должна аналогично интерактивному предмету на локации обладать функцией "применить", при которой запись обновляется в минус-один или удаляется если достигает нуля. И при этом передаёт классу игрока некие параметры. +10 ХП например.