Шапка: https://hipolink.me/godothread
Предыдущий: >>926070 (OP)
Архивный: >>919752 (OP)
>>930620 →
Добро пожаловать!
А ГДСкрипт настолько охуенен, что я жду, когда найдется среди годанов скилловый гик, который на LLVM запилит GDLang чтобы прям консольные утилиты и оконные приложения на нём пилить. Сам я, увы, не потяну.
Поправил, заработало, спасибо. Под вечер мозг плохо соображает - не заметил.
Но я все равно не понимаю, зачем это нужно. Только для того, чтобы не возиться с editable children?
>>931044 →
Обычно так и делаю
> чтобы не возиться с editable children?
В том числе да.
Подумай перед сном, какие возможности тебе дали бы выполняющиеся в редакторе тулскрипты?
> Как вы делаете инвентари в игре?
Ебашишь массив и в него вхуячиваешь предметы. Что тут сложного-то?
> Я блять какие-то ресурсы хуячу
Ресурсы (как класс) нужны для удобства управления ресурсами (как файлами).
> пытаюсь связать сцену предмета с ресурсом для инвентаря
Тебе не сцена предмета нужна, тебе в первую очередь класс предмета нужен. А сцена, это вообще-то говоря, ресурс, это файл, в который сериализирован инстанс определенного класса. Пока ты не поймёшь эту фундаментальную разницу, ты не продвинешься вперед.
> меня не покидает чувство, что делаю какую-то хуйню
Подтверждаю. Ты делаешь хуйню. Даже не глядя в твой код. Чисто по тексту видно непонимание смысла.
> Как вы делаете инвентари в игре?
Инвентарь это база данных, таблица, у которой есть набор строк (записей) и столбцов (полей).
У инвентаря есть методы: Create - создать запись о новом предмете, Read - прочитать запись с предметом, Update - обновить запись с предметом (стакнуть в стак, например), Delete - удалить запись с предметом. Это всё. Этого достаточно для любого инвентаря любой сложности.
Но ведь твой вопрос не об инвентаре, а об его внедрении в геймплей. А вот в геймплее уже есть дохуя дел, которые придётся сделать.
Как выкидывать предметы?
Как сортировать предметы?
Как вставлять предметы в слоты?
И т.д. и т.п. Тут целую книгу можно написать, весь тред исписать длиннопостами до бамплимита.
Нахуя? Тебе Хуан дал массивы, пользуйся. Если у тебя простенькая игрушка, то просто хватит добавление индекса предмета, если нет, то можешь сделать предметы объектами, да и инвентарь тоже сделать отдельным классом.
Вот, кстати, периодически вспоминаю такую штуку и советую всем: Во многих играх есть консоль. Квейки, думы, халф-лайфы, тесы. Так вот, ящитаю, годная практика для новичка - это сделать такую консоль, которая принимает на вход текстовые команды и совершает действия в игре. Что-то типа:
> player.inventory.add iron_greatsword 10
> player.equip steel_armor
Продумать, что должна сделать игра при получении команд?
И реализовать.
И когда реализуешь, многие вопросы сами собой отпадут.
>Как вы делаете инвентари в игре?
Пишу на шарпе, был выбор писать самому или спиздить готовенький ассет. Выбор пал на inventory-system на гдскрипте. Спиздил и перекатил на шарпы, сейчас допиливаю и перекрываю говнокод автора своим
Ему это в позапрошлом треде говорили. Он все страдает. Пройдет 3 года, игры не будет, зато инвентарь доделает.
Проще надо делать, проще. Тем более в инди. Раз-раз и готово. Идеей надо брать.
Не, ну тогда он точно троллит.
Вобщем так и не понял в чем проблема, все перетыкал но ниче не помогло, а нагуглить нормально не получается, как проснусь буду дальше разбираться.
Есть главное меню игры, откуда после нажатия на кнопку, происходит переход к самому игровому процессу, при помощи change_scene_to_file.
И вроде все ок, но игра жалуется на циклические импорты т.к. в главном меню игры грузится сцена с игрой, а в сцене с игрой есть переход в главное меню игры.
Как фиксать? Что-то не так делаю?
>Инвентарь это база данных, таблица, у которой есть набор строк (записей) и столбцов (полей).
>У инвентаря есть методы: Create - создать запись о новом предмете, Read - прочитать запись с предметом, Update - обновить запись с предметом (стакнуть в стак, например), Delete - удалить запись с предметом. Это всё. Этого достаточно для любого инвентаря любой сложности.
Ну это я и хотел увидеть. У меня есть класс инвентаря, в массив которого и записываются предметы, которые сами наследуют класс предмета. Чисто по тексту видно, что в первой половине поста ты пытаешься продать мне какую-то хуйню.
>Но ведь твой вопрос не об инвентаре, а об его внедрении в геймплей. А вот в геймплее уже есть дохуя дел, которые придётся сделать.
>Как выкидывать предметы?
>Как сортировать предметы?
>Как вставлять предметы в слоты?
Про это я не спрашивал, с этим у меня ни вопросов, ни проблем нет.
Я думаю, что консоль должна от обратного делаться. Нужно добавлять команды к существующим функциям/методам. А добавлять функционал исходя из требований консоли это что-то странное. Да и не нужна она зачастую индюшатине
Если ты про ассет от expressobits, то мне кажется, что у него версия на шарпе где-нибудь на гитхабе. А вообще я смотрел его, понял, что делаю примерно тоже самое и не стал менять свой велосипед на чужой
У меня на C# ECS пока инвентарь на базовом уровне, в виде двух вкладок: список всех предметов кроме надетых, и вкладка с снаряжением, где слева надетое, справа сответственно не надетое. При поднятии я удаляю со сцены спрайт и компонент позиции в пространстве и добавляю "В инвентаре", при открытии инвентаря я опрашиваю все предметы "В инвентаре" у которых владелец игрок, и ими заполняю список, аналогичным образом со снаряжением. Когда выбрасываю удаляю "В инвентаре" и рисую спрайт и добавляю компонент позиции.
Ты почти что Test-Driven Development описал.
В коде (тест-юнита) пишешь пример использования, и становится понятна архитектура
Только юнит-тесты(почему тесты-юнита, что то меняется от перестановки?) и они зачастую ломаются без поломки в самой игре, и добвляют головной боли. Консоль же -- это немного другое. По нужной команде она либо сама чёто напишет в консоли, либо покажет прям от лица камеры. И писать команды для консоли можно прям в скрипте объекта который нужно менять через них.
> они зачастую ломаются без поломки в самой игре
Так и задумано. Значит что то в апи поменялось и вызов выглядит теперь по другому
и в чём смысл? показать что в разработке что то меняется? для этого можно просто в логе выписывать ошибку на неправильный вызов функции или несовпадение форматов, для последнего даже писать ничего не нужно.
Не все вызовы всегда происходят (был случай когда разраб забыл потестировать движение назад - он всегда шел только вперед), несоотвтетствие форматов может пройти тихо.
>Подумай перед сном, какие возможности тебе дали бы выполняющиеся в редакторе тулскрипты?
Доброе утро. Могу без запуска сцены сразу смотреть поведение нод? И это в свою очередь упростит сборку уровня, например
>И вроде все ок, но игра жалуется на циклические импорты
Это "желтая" ошибка? Я на них обычно не обращаю внимание. У самого в проекте после меню используется "главная сцена" с игроком, ui и прочим, и в нее уже загружаются уровни через add_child
>годо
Лингвисты есть в треде? Почему читается годо? Пачиму t не произносится? Это же не godoh какой-нибудь
Мы заслужили!
Хорошая песенка.
Ну так мы и не паримся. Хочешь - называй годо, а не хочешь - называй годотом.
Удваиваю хороший аргумент. Также Форт Боярд. Сам говорю/пишу и Годот, и Годо, в зависимости от контекста.
Олсо, пытался посмотреть "В ожидании Годо" в постановке театра Вахтангова. Не осилил больше часа. Возможно, бродвейская постановка с Иэном Маккеленом и Патриком Стюартом была бы поинтереснее, но её в интернетах нету целиком (она хранится в Нью-Йоркской библиотеке им. Линкольна, там можно посмотреть совершенно бесплатно, лол)
> Возможно, бродвейская постановка
> была бы поинтереснее
Я лично сильно сомневаюсь. Это артхаус, а он редко бывает интересен.
Слава богу нет.
Нет. именно что красная. Желтые алерты фиксаю, там все норм.
У меня в основном бзается именно смена сцены, для новых страниц\окон. Но вопрос возник только по главной странице и переходу к одной из игровых страниц, странно. Больше похоже на какой-то баг годота ибо принцип везде один и тот же юзаю.
Native
Никто не знает, но легко можно понять почему. У нас другая, не соевая культура общения, мы и лично кого то чморим если он не прав, и шуточку неуместную можем ввернуть.
Плюсы - всегда дадут высшую производительность, но если выбирать между гдскриптом и шарпом, то шарп быстрее
Юан который? который Жуан, да? ну вот он в основном курирует + ведёт немного обособленный от общего движка движ, как например новый HDDAGI (псевдо0рейтрейсинг на стероидах) -- это он делает. В основном по моему все нововведения это либо он делает, либо с его веления. Чел ровный, кстати.
Ну и как бы ничего сложного. Вот только таких выборов за игру будит сколько я захочу, а это всяко больше 1 или даже 10. Возникает проблема. Как мне хранить что будет делать кнопка? Кнопки-то дубликатом создаются и в них только id меняется, чтоб знать какую именно нажали, а нужна ещё и куча разных скриптов так-как они должны делать много разного.
Меня с начала осенила мега тупая идея хранить то, что делают кнопки в ресурсах и по необходимости просто менять ресурсы, вот только из ресурса я как буду к сцене обращаться? Нельзя же. Ну и как тогда? Кучу кнопок сделать? У меня забьётся сцена кнопками очень быстро.
По сути хотелось бы просто кнопке скрипт поменять когда захочу и всё. Как это сделать хз.
сделай контроллер кнопок в одном скрипте и обращайся к нему через кнопки и их сигналы, на каждую кнопку своя функция которую она зовёт через сигнал, чё сложного? Если ты не в курсах что такое сигналы то бегом учить, ЭТО КЛАССИКА, ЭТО ЗНАТЬ НАДО.
Все кнопки ставят соответствующие флаги в переменную соответствующую выбору, хранящуюся в словаре выборов, типа
Dictionary<int, short> где инт - айдишник выбора, а шорт - его результат. Или даже Dictionary<Choice, short> где Choice - енум выбора.
перемудр дикий. сверху же писали-- сигналы и уникальные функции на каждую. Да и какого типа переменная шорт чтоб результат присходил?
А я и написал сразу тип: short, потому что бул слишком мала, а инт слишком велик.
> перемудр дикий.
Я из расчёта что выборов может быть слишком дохуя, а тут одна функция на всё про всё.
> Юрий
> Юан
Ты там что куришь с утра?
https://www.reddit.com/r/godot/comments/1afp1pv/goodbye_yuri/
Ну вроде норм звучит. Только код будет в спагетину превращаться, если я правильно понимаю. Ну там спагетина простая, однослойная, так что, как бы, как вариант.
>>31341
Звучит круто. Только где я буду short"ы хранить и как запускать? Вот тут-то я и обосрался. Где про шорты почитать, если ты говоришь что short это тип? Пять секунд в гугле не дали ответ.
> где
В словаре. Эти переменные не для запуска, а для хранения выборов, которые сделал игрок. Запускать ты будешь одну и ту же функцию, которой ты будешь передавать (обходным путём) какой это выбор и выбранный ответ, после чего ты их сохраняешь в словарь, и при необходимости к нему обращаешься.
> Где про шорты почитать
В годоте его зовут uint8_t
https://docs.godotengine.org/en/stable/contributing/development/core_and_modules/core_types.html
ничего не курю, многие Жуана юриком называют. А Юра настоящий походу прослыл трансфобом и его кикнули за это. Как обычно, не поделили повестку. Очень жаль, и движок хороший и Юра большой вклад сделал.
var a = null
if игрок нажал на кнопку 1:
a = 1
if игрок нажал на кнопку 2:
a = 2
____
if a = 1:
такой-то сюжетный поворот
if a = 2:
другой сюжетный поворот
Тащи сюда код. Так не понять, что там у тебя
вы, кажется, не тому отвечаете.
Этот код будет давать тебе преднастроенную кнопку:
> 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)
> func on_choise(id):
>___ match id:
>___ ___ 0: foo()
>___ ___ 1: bar()
>___ ___ 2: baz()
> > for item in my_choises:
> > ____ var btn = create_button(item.name, item,text, on_choise, item.id)
> > ____ my_dialogue_scene_button_panel.add_child(btn)
Быстрофикс. Самое главное недоговнокодил.
Средне
Как сделать красивый переход между плаваньем и ходьбой? Я как-то делал, у меня лютое дрожание было при переключении стейта на границе области воды с областью земли. Как годаны решают такую задачу?
Я просто хожу по воде.
Если я планиркю сделать кастомизацию персонажа (пол, текстуры, экипировка) то мне надо просто намоделить это на один скелет и отображать при надобности?
У тебя скорее всего в другом состоянии определялось что тут же пора переключаться обратно, и так по кругу. Решается таймером отложенным, когда нужно пробыть хотя бы 0.1 сек в состоянии, или например разнесением в пространстве триггеров, когда между ними есть зазор, а не просто граница сред. Ну могут быть и другие варианты может ты просто pivot point криво поставил и у тебя в другом состоянии поза сдвинута.
проиграл
Самая элементарнейшая игра которую можно придумать - отгадай число. Кое-как я это сделал, но до конца не понял как и потому прошу разобрать некоторые моменты.
Короче, игра состоит типа из 4-х сцен:
main.tscn - начальное окно с кнопкой старта
game.tscn - 10 кнопочек, числа от 1 до 10
result_win.tscn - сцена где говорят что мы победили
result_lose.tscn - а тут что проиграли
У каждой корневой Node2D ноды этих сцен есть скрипт, у main и result'ов это просто скрипт содержащий
func _on_button_pressed():
get_tree().change_scene_to_file("res://game.tscn")
то бишь переход к сцене game.tscn
А вот скрипт ( https://paste.lcomrade.su/rB6bG0OJ ) главной ноды Game сцены game.tscn.
Во-первых: возьмём любую функцию кнопки _on_button_pressed(). Я не понимаю как происходит сравнение в условии if 1 == random_number, а если конкретнее, то откуда у нас берётся значение random_number'a, ведь функция get_ranum() существует, но не вызывается. Так же есть тело функции _ready(), я прописал его чтобы просто смотреть в консоле какое число было задано. Если это тело убрать или функцию удалить то при попытке играть я всегда проигрываю, то есть random_number пустой и ни одно значение с кнопки с ним не сходится. Короче говоря, выходит, что как раз в функции _ready(), которая выполняется прежде всего, мы вызываем get_ranum() и, соответственно, заполняем random_number с которым, в последующем, и работает условие. Я пытался пользоваться отладчиком чтобы посмотреть что куда присваивается, но что-то нихуя не понял как он работает. пока писал это, до меня дошла мысль что это всё вполне логично, и, наверное, всё именно так и работает. Надеюсь я ошибаюсь и не зря это строчил.
Во-вторых, хочу узнать как можно реализовать всё это более чисто и ёмко. Я уверен, наверняка, вместо десяти функций для каждой кнопки, можно сделать одну, и вообще всё оптимизировать и сделать чотка!
Короче, расскажите как вы бы сделали, аноны.
Самая элементарнейшая игра которую можно придумать - отгадай число. Кое-как я это сделал, но до конца не понял как и потому прошу разобрать некоторые моменты.
Короче, игра состоит типа из 4-х сцен:
main.tscn - начальное окно с кнопкой старта
game.tscn - 10 кнопочек, числа от 1 до 10
result_win.tscn - сцена где говорят что мы победили
result_lose.tscn - а тут что проиграли
У каждой корневой Node2D ноды этих сцен есть скрипт, у main и result'ов это просто скрипт содержащий
func _on_button_pressed():
get_tree().change_scene_to_file("res://game.tscn")
то бишь переход к сцене game.tscn
А вот скрипт ( https://paste.lcomrade.su/rB6bG0OJ ) главной ноды Game сцены game.tscn.
Во-первых: возьмём любую функцию кнопки _on_button_pressed(). Я не понимаю как происходит сравнение в условии if 1 == random_number, а если конкретнее, то откуда у нас берётся значение random_number'a, ведь функция get_ranum() существует, но не вызывается. Так же есть тело функции _ready(), я прописал его чтобы просто смотреть в консоле какое число было задано. Если это тело убрать или функцию удалить то при попытке играть я всегда проигрываю, то есть random_number пустой и ни одно значение с кнопки с ним не сходится. Короче говоря, выходит, что как раз в функции _ready(), которая выполняется прежде всего, мы вызываем get_ranum() и, соответственно, заполняем random_number с которым, в последующем, и работает условие. Я пытался пользоваться отладчиком чтобы посмотреть что куда присваивается, но что-то нихуя не понял как он работает. пока писал это, до меня дошла мысль что это всё вполне логично, и, наверное, всё именно так и работает. Надеюсь я ошибаюсь и не зря это строчил.
Во-вторых, хочу узнать как можно реализовать всё это более чисто и ёмко. Я уверен, наверняка, вместо десяти функций для каждой кнопки, можно сделать одну, и вообще всё оптимизировать и сделать чотка!
Короче, расскажите как вы бы сделали, аноны.
>Пока строчил всё это, в голове сложилась картина
Классика, у меня такое регулярно. Происходит затык, не могу что-то понять, найти или придумать. Пишу длиннопост. В процессе написания приходит понимание. А ещё чаще - оно приходит через пару минут после того, как пост отправлю.
Я это для себя объясняю так, что сам процесс написания поста стимулирует мозг к осознанию мыслей, так как они переводятся из абстрактной в текстовую форму и упорядочиваются.
А ещё отвлечься полезно тоже и сходить куда-нибудь, да хотя бы посрать. Все самые лучшие идеи приходят на толчке.
То что уже хоть что то высрал, большой прогресс. Не стоит себе засорять голову мусорными вопроси по типу а точно я делаю все правильно, а так можно, а как это использовать правильно, просто бери и делай, попутно смотри как игры делают другие, и тогда вопросы сами отпадут.
>Я не понимаю как происходит сравнение
@
>Короче говоря, выходит, что как раз в функции _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 сонсолька.
Вдогонку: интересует еще вопрос оптимизации. В этой модельке 1900 полигонов, если теоретически добавить экип то будет около 5. Ну для одного персонажа допустим нормально. А если их 30? А если 64? Опыта в геймдеве нет поэтому для меня это еще неочевидно.
Накопипасти ее в редакторе годота, выключи всинк и лимит фпс, и посмотри когда фпс падать начнет.
Чет помню в каких-то дьяблах разрабы модельки по 5 миллионов полигонов делали, все с них охуевали.
включи сетку, хочу увидеть где именно эти 1.9к Хотя если экип будет той же детализации, то полигонов 3к скорее всего, не утрируй.
Теперь наверное нужно указать что мне собственно надо сохранять и загружать.
Это сложный инвентарь с предметами на десяток параметров, различные обьекты которые может строить игрок в мире(сундуки, переработчики со своими инвентарями и обработками). Изменения в мире: уничтожение предметов, обьектов, врагов.
В юнити я уже это делал на жсоне, мне совершенно не понравилось что это превращается в переборку листов в листе листов. Особенно если потом надо добавить еще один параметр предметов.
Так вот, вопрос в том, каким образом рекомендуете сохранять данные? Насколько уязвимость с сохранением через ресурсы актуальна? Целевые платформы десктоп шинды и ведро, чистый синглплеер.
то что не видно не рендерится. программа отрисовки на корню чекает если объект "всключён" и если нет пропускает его.
И про включить сетку я имел ввиду нажми SHIFT+Z чтоб насквозь было видно. обратно той же комбинацией.
по черноте видно что основная детализация в руках, затылке и грудной клетке, почему то? затылок не видно да и грудина судя по всему -- продолжение шеи. то чего не видно надо вырезать, оптимизация, хуё моё.
Сисик поправил, а в грудной клетке пока находится законцовка "бюста". Экспериментирую со взаимозаменяемостью.
я не про саму грудь, блин, не про сиськи.а про то что внутри грудной клетки явно лишняя геометрия которая, как я и думал, является бюстом башки.
>чистый синглплеер
>уязвимость с сохранением через ресурсы актуальна
Тебе не похуй, что там будут шаманить через сохранения в сингле?
Алсо, я просто закидываю переменную инвентарь (массив со словарями) в такую же переменную инвентарь в файле сохранения. И все норм работает.
Сделай два метода, один с 100500 ифов, второй с 100500 матчей. В начале каждого метода
> var elapsed = OS.get_time_msec()
В конце
> print("Time elspsed is %s msec" % OS.get_time_msec() - elapsed)
И сам получишь ответ на свой вопрос.
Я нихуя не понял что тут происходит.
То есть у нас есть корневая для кнопок нода манагер.
У ноды манагер есть скрипт.
У каждой кнопки есть общий скрипт.
Скрипт кнопок поменьше, поэтому с него:
Мы добавляем в Инспектор свойство 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.
Я хочу сделать много, несколько тысяч, объектов, которые почти всегда будут просто сидеть на месте, и лишь иногда (редко) укатываться от игрока и коллизить со стенами (но не друг с другом). Как оптимальней это сделать?
>1 (один) это типа просто дефолтное значение, но для каждой кнопки оно будет равно значению указанному в Инспекторе
Да.
>Выходит, все 10 сигналов каждой кнопки подключаем к скрипту? ....... Как она, одна функция, примет другие переменные, если эти переменные берутся из Инспектора кнопки
Да, но не ручками, кроме первого раза офк. Мы сделали отдельную сцену с кнопкой. Мы добавили эту сцену в главную сцену, туда же добавили менеджер. Сделали подпись менеджера на сигнал. И просто КТРЛ + Д сделали несколько дубликатов сцен с кнопкой. Получился пикрил 1. Я хуй знает как это адекватно объяснить честно говоря. Если по тупому то в дубликатах у сигнала остается та же ссылка на метод которая была у оригинала, но данные которые будут передавать сигналы уже будут разными. Бля, я вот знаю как это все работает, но объяснить нихуя не могу.
>upd
Ну дак да. Я просто показал что можно передавать абсолютно любые данные сигналом, и обрабатывать их в одном методе, если в этом есть нужда. Ну вот допустим тебе понадобится узнать при нажатии какой кнопки игрок проиграл, что бы собрать условную статистику невезучих кнопок, будешь знать как можно сделать.
Смотри, дизайн твоего приложения может создаваться по двум вариантам, в зависимости от того, как тебе удобнее.
1. Много мелких скриптов в объектах.
2. Один божественный скрипт на все объекты,
Второй вариант считается, антипаттерном. Нежелательным. Потому что тогда в одном скрипте будет намешана лапша из всех объектов приложения. (Я специально не называю это игрой, потому что это не эксклюзивные знания геймдева, это общая для кодинга инфа).
Тебе выше предлагается дизайнить по первому варианту.
У каждой кнопки свой скрипт и свой индекс (но нейминг конечно, фу), при нажатии на кнопку, она испускает сигнал с индексом. Но проблема в том, что на все сигналы всех кнопок нужно подписываться. Этот момент либо упущен, либо проигнорирован автором поста. Сигналы (ивенты) это реализация другого паттерна, наблюдатель (обсервер), и распихивание локальных сигналов без возможности на них подписаться - бессмыслица.
>>32075
> я вот знаю как это все работает, но объяснить нихуя не могу
Не знаешь. А лезешь советовать.
>>32006
Так что выкинь нахер весь этот код и просто работай по варианту 2 (год-обджект) пока не поймёшь, как от него избавиться. Пока сам жо этого не дорастёшь.
То есть, тебе надо в рамках одного скрипта объявить и массив кнопок, и нагрузить их своими коллбэками (либо одним коллбэком с индексом-аргументом). Вот. Приступай.
>>32074
> много, несколько тысяч, объектов, которые почти всегда будут просто сидеть на месте, и лишь иногда (редко) укатываться от игрока и коллизить со стенами (но не друг с другом). Как оптимальней это сделать?
Для этого у них есть режим сна, в котором они игнорируются физическим движком. Изучи это.
>Не знаешь. А лезешь советовать.
Критикуешь предлагай. Покажи сам как правильнее будет сделать, это в разы полезнее будет нежели вести пустой треп о паттернах, особенно когда человек не понимает даже как работает код.
Я из себя тут гуру не строю, и только рад буду если кто то более знающий поможет анону.
>Для этого у них есть режим сна, в котором они игнорируются физическим движком. Изучи это.
Увы, у этого вечные проблемы. Например: Ригидбоди лежит на ригидбоди. Оба спят. Убираешь нижний - верхний продолжает спать и висит в воздухе. Такая же история если куча ригидбодей лежит на статикбоди, и мы удалим статикбоди из мира. Все ригиды спят вися в воздухе.
Можно, конечно, будить их вручную. Но это излишек геморроя, каждую ситуацию учитывать и ригидбоди искать.
Я же написал ЭКСПЕРТА, а не какую-то синеволосую соевую гномиху капишь?
>OS.get_time_msec()
Неправильно. Нет такого метода сейчас. Да и как я буду столько матчей и ифов делать нах надо.
Пацаны говорят, что матч, вроде как, как свичами этой всех хуетенью оперирует, а потому быстрее елсифа.
Сам я не ебу конечно.
> Критикуешь предлагай
Предложил:
>>32078
> Так что выкинь нахер весь этот код и просто работай по варианту 2 (год-обджект) пока не поймёшь, как от него избавиться. Пока сам жо этого не дорастёшь.
> То есть, тебе надо в рамках одного скрипта объявить и массив кнопок, и нагрузить их своими коллбэками (либо одним коллбэком с индексом-аргументом). Вот. Приступай.
Все правильно он тебе ответил. Метод может иначе называется, или его переименовали в четверке. Погуглить ты же в состоянии, верно? Принцип как он тебе и написал - берешь миллисекунды до, берешь после, вычитаешь, смотришь сколько мс код работал.
>Да и как я буду столько матчей
В цикле, епта. for i in range(10000000000): match ...
>В цикле, епта. for i in range(10000000000): match ...
Так у меня i будет просто бежать до 10000000000 же. Скорость будет одна и та же вне зависимости от метода сравнения.
А внутри цикла у тебя матч. А внутри такого же другого цикла у тебя иф. В ифах-матчах сравниваешь то, что тебе там надо сравнивать. Потом сравниваешь результаты работы двух больших циклов. Это база, это знать надо.
Короче ты заебал тупить, и я сравнил за тебя на обычных интах. На 10 миллионах сравнений матч быстрее иф-елс на 32 миллисекунды. Это дохуя ценное знание конечно сильно ускорит твой проект.
Делаю!
Это конечно хорошо, но в рамках т.з первого поста нет никакой необходимости в динамическом создании кнопок. Это имело бы смысл только в том случае когда нам надо было бы генерировать рандомное число кнопок на старте, а у нас блять их количество статичное, их никогда не будет ни больше ни меньше. Делать динамику там где она нахуй не нужна - бессмыслица.
> нет никакой необходимости в динамическом создании кнопок
Есть смысл.
Это удобно и красиво.
Не нужно ебаться с заданием им параметров в инспекторе, или копипастить сконфигурированные, или копипастить код с коннектами в скриптах.
Весь коннект происхожит быстро, элегантно, в одном месте. И там же может так же элегантно поизойти расстановка динамических контролов по форме.
>Это удобно и красиво.
Слишком жидкое оправдание.
>Не нужно ебаться с заданием им параметров в инспекторе
А это убило. Лучше же поебаться в самом коде насрав милиард ненужных строк, сделав при этом не расширяемое говно, верно?
Короче, смысла в дальнейшей дискуссии нету. Оба варианта имеют право на жизнь т.к используются в абсолютно разных ситуациях.
Бля ща не доеб, но я чето в голос с того что попытался твое ебало имадженировать, весть такой нарядный, с пакетом, одним словом елегантный.
> верно?
Неверно.
Данный код добавит любое количество кнопок с любыми именами без изменения кода проекта. Достаточно описать эти кнопки в конфигурационном файле, эмуляция которого описана в var choises_from_persist_data
> Угадайте число от 1 до 10
> Угадайте число от 45 до 97
> Угадайте фрукт из списка [банан, яблоко, апельсин, слива]
> Да / Нет
> Да / Нет / Не знаю / Мне повезёт
И так далее.
Короче просто через gtlf export буду выгружать. Эх, а с редактированием .blend файла в реальном времени было бы в сто крат лучше.
Тени сделал менее детальными, фпс поджал - стало лучше. Но все еще плохо.
И это с учетом того, что добавил лишь 5 источников света и около 15 предметов с тенями. Источники свет статичны, предметы с тенями могут появляться\пропадать(некоторые).
Советы давать не буду, просто свое отрепорчу.
Тоже со светотенью работаю, тоже для мобилок. Только в 3д. Насколько я понял большинство мобильных чипсетов работает со светотенями по своему, сильно отличающемуся от пк алгоритму. Он неэффективен. Возможно поэтому в гугл плее у меня не вышло найти игр с качественными 3д светотенями. В ГЛЕС3 свет шустрее чем в ГЛЕС2 (в 2 он еще и багается). Прозрачности это тоже касается - на мобилках она медленная, по крайней мере в 3д. Наебался с ней пиздец.
У меня такие результаты. 5-15 омнилайтов, только один из них с тенями, главный. В настройках проекта прошелся и снизил почти все. Эффективнее всего снижать разрешение - актуально если у тебя пиксели или лоуполи. На своем realme 9 получаю стабильно 60 фпс. При этом в доступе у меня есть сяоми с каким-то стремным чипсетом. По бенчмаркам он шустрее моего телефона, но умирает до 3 фпс от одного омнилайта.
Если только исчезать пропадать, не двигаться, то просто запеки, очевидно.
>Note: call_group() will always call methods with an one-frame delay
Ебать это мне половину вечера испортило.
Да нахуй они нужны? Пусть не трогают, что не сломано
> Юрку пидорнули
Как бабки базарные, ей богу. Игры делайте, вместо того чтобы за жизнью разрабов следить.
>Токсичного
Чё он там, не поддержал трансовый переход чьего-то ребёнка, не поцеловал ботинок негру или скзаал долбоёбу, что он долбоёб без увиливаний и ужимок? Англосаксы очень нежный и в их понимании токсичностью можно назвать всё, что угодно.
Забулил француза, который физический движок пилил при переходе с 3 на 4. Тот так и сказал, ай фил буллиед и уебал в рокстар.
Запили базовое перемещение персонажа, переход между уровнями, систему сохранения, сейчас делаю инвентарь и сразу вплетаю его в систему сохранений. Все верно делаю?
На Юрку много жалоб было, я тебе просто самый наглядный пример дал, из-за которого физика в 4 до сих пор сломана.
Хорошо хоть на хуана жалоб немного было
Можно ли вообще включить один AnimationPlayer внутри другого? Я из скрипта вызываю функцию первым AnimationPlayer, которая проигрывает второй, но это не работает, при этом сама функция точно вызывается.
Не нужно
>>33029
Не вижу проблемы честно говоря. В конце концов в плеере есть возможность запустить функцию скрипта.
Плееры анимируют разное или одно и то же? Может они просто оба одновременно играют и один оверрайдит значения другого?
>>33045
Скорее всего, это высчитаный размер исходя из текста таким шрифтом. Попробуй поиграться с отрицательными Margin, потом вон выше есть custom minimum size, посмотри всякие флаги типа extrend, не помню где они в 4-ке. Может быть в Layout.
Ладно котики. Меня позвали пилить мобилки на другом движке, так что не смогу давать советы в ближайшие полгода. Но я обязательно вернусь с игрой мечты и мы сделаем годот великим!
Уже поиграл сотвсякими ползунками и значениями. Даже через код попробовал - ничего. Думаю, дело вот в этих ебанутых границах. Как их убрать?
В тройке был rect_min_size, который именно что не давал уменьшить контрол-элемент ниже указанного. В четверке хз.
Ахаха, пиздец, забулили в интернете, они что, дети что ли? Не умеют отстаивать свою точку зрения?
>В конце концов в плеере есть возможность запустить функцию скрипта.
Ею и пользуюсь. print_debug из функции нормально выводит значение, а плеер уже не работает.
>Плееры анимируют разное или одно и то же? Может они просто оба одновременно играют и один оверрайдит значения другого?
Абсолютно разное, так что ничего не перезаписывается. Элемент, который должен анимироваться при вызове функции вообще не меняется.
Планирую сгореть как свеча быстро и ярко и умереть богатым.
Только то проверил, все работает обоими способами. Как через Call Method, так и через Animation Playback Track.
Я попробовал и не нашел способа уменьшить, только увелиить.
Нечто похожее можно получить добавив вокруг MarginContainer с негативными маргинами, и галочкой clip content,но он отрезает скругленные углы кнопке - возможно тебе как то под это придется текстуру подогнать.
Queue_free() ставит ноду на удаление со следущим кадром а не во время выполнения функции, ибо в текущем кадре к ней может обратиться другой код и будет плоха если ноды не будет на месте
Ясно, буду искать тогда ошибку в другом месте. Спасибо.
Полезно.
Теперь можно со спокойной душой лечь спать, а на утро начать колдовать.
Давно я такой мотивации не ловил от собственных идей.
Путь будет тернистым и долгим, но зато каким!
Запиши ее
На 3-й версии. 4-й нужна поддержка SharedArrayBuffers на сервере, которую никто не нашел как в яндексе включить.
Я только вкатываюсь, код пишу хуе мое, но тестировать надо наверно на винде и вообще на ней сидеть? Там же эти библиотеки, дирекс 12 и прочее говно
Алсо я на ноуте геймдевлю, 2 ядра, 8 гигов, амудевстройка, которая в 60 только сталкер тень чернобыля тянет, если все выставить на средние
Хотя я и не планирую делать графоуни шутеры
Я конечно могу запускать ехешники через вайн, портпротон, ботлз, но хз
Ты о чем вообще, какие экзешники? Годот, будучи опенсорным, работает где угодно и на чем угодно. Я, сидя на линуксе, уже четвертый проект на годоте допиливаю, все предыдущие опубликовал под винду, макось, линь, веб и андроид.
Трешка у меня збс работает на дебиане, 4ка работает почти никак потому что в моем некроноуте нет дров на вулкан.
А с точки зрения релиза, вообше проблем нет, экспорт это бинарник платформы + твоя игра в виде пака скриптов и ассетов. Кидал и веб билды и виндовые на твг
Под айфон не делал, единственная платформа которую я пропустил. Насколько понимаю да, нужен мак с икскодом, и нужен еще и айфон. Плюс если в гугл-плее ты как разработчик платишь единоразово за девелоперский аккаунт, то аппл с тебя ежегодно драть будет 99 баксов. Плюс санкции-верификация, хуе-мое. Поэтому не стал заморачиваться.
А для мака релиз собирается легко из-под любой платформы.
Удачи тебе, анон
Ты это я.
Такой же ноут с линухом, только интелвстройка вместо амуде.
Не парься. Движки типа Годота как раз заточены, чтобы одинаково работать на разных платформах. Конечно, иногда это физически невозможно (например, нельзя одинаково управлять шутаном с клавамыша, гейпада и тача), но хотя бы от всяких технических условностей можно абстрагироваться, сосредоточившись на собственно создании игры.
С другой стороны, когда дойдёт до тестирования, тебе в любом случае не хватит одного устройства. Там уже надо подключать всех знакомых и заставлять их играть в твою игру на всём, что у них есть. Тащемта, люди и сами рады в таком деле помочь, как правило.
Но до тех пор просто делай на том, что есть. Оно должно работать везде одинаково; а где не будет - там в любом случае нужно тестирование.
Годно, но местами будто автор забыл написать код (иначе бы он наверно написал что то типа "а теперь придумайте код сами) и хоть там и легко для меня было додуматься, ведь я уже пару туторов по паре часов посмотрел, рандом может невтыкнуть и его анус лопнет
Не обьяснил про PackedScenes и что после двоеточия присваивается тип переменной
Не обьяснил что такое randi_range (вроде)
Не обьяснил что делают -=1 и +=1
А так в целом говна с кодом небыло
>Не обьяснил про PackedScenes и что после двоеточия присваивается тип переменной
>Не обьяснил что такое randi_range (вроде)
>Не обьяснил что делают -=1 и +=1
А разве должен был? Книга то не по изучению гдскрипт, а по обучению работы с годо. Если нюфажи скипают банальное ознакомление с базой языка на котором им придется писать, то это их проблемы, а не автора. Такую ебейшую документацию зря писали что ли?
Вот у меня есть нода, которой надо перерисовать много дочерних нод. Когда это происходит, всё подвисает на несколько секунд. Не круто. У меня есть два пути, как это обойти.
А) Разбиваю цикл на части, в _процессе выполняю некоторое количество, ограничиваю время выполнения, чтобы продолжить в следующем фрейме. Пробовал такое в трёшке для загрузки сейвов.
Б) Мультитрединг.
И тут у меня вопросы, которые требуют ответов. Курил-курил доку, но так и не понял. Мутексы и семафоры вообще описаны в двух словах людьми, которые слишком хорошо понимают, как это работают, поэтому уже забыли, что тут можно не понимать.
В общем, мои вопросы:
1. Надо ли это делать в _процессе, таким же методом, только в отдельном потоке? Или func do_all_my_update() и в ней описать весь тхред? Если и так, и так можно, то какие критерии выбора?
2. Если я захочу прервать/перезапустить тхред, как мне к этому всему обратиться?
3. Есть какие-то тхред-сейф операции, а есть какие-то не тхред-сейф. В чём их несейфность? Если я буду добавлять чайлдов в тхреде, что плохого может произойти?
4. Есть у меня переменная в скрипте, которая в варианте А использовалась как индекс цикла, запоминаемый между _процессами. Я точно знаю, что она никому, кроме тхреда, не нужна. Надо ли её как-то защищать мутексами/семафорами при условии, что я пока только пытаюсь вкурить в мультитрединг, или для начала и так сойдёт?
>чтоб камера не выезжала за игровое поле
У Camera2D есть параметры limit_*, делающие как раз это
>Как ограничить игровое 2D поле
StaticBody2D, запихни в него шейпы типа WorldBoundaryShape2D (или LineShape2D для третьего годота)
Ну тоесть выделить главу на обьяснение что такое вектора он должен, а вот строчку текста потратить на обьяснение нубику принцип работы +=, который юзается постоянно, он не должен?
Спасибо, попробую
Ну не читай и не пиши. Хуле ты ноешь то все? Книги у тебя не то, документация не то, сам ничего делать не хочешь, и игры соевое говно, и все у тебя кончи, один ты красивый. Только срешь тут.
Не читал, но объясняю.
Это типичное искажение восприятия. Человек, который глубоко погружён в какую-то тему, не может воспринимать её глазами новичка. И ему не всегда понятно, какие концепты очевидны, а какие надо разжёвывать. Автор книги, судя по всему, решил, что += это достаточно очевидный оператор, значение которого понятно из контекста.
Тут, кстати, очень полезно бывает попрактиковаться на детях. Взрослые имеют разный уровень знаний, в то время как дети не знают ничего по определению.
Ебать ты шизло, документацию то хоть открывал? Там буквально все расписано, картиночки, да даже анимированые есть, специально наделали, чтоб даже додич с слюной у рта мог понять что ему объясняют. Или по твоему там должны готовые %механикинейм% подавать?
>>33347
Эт че шутка такая? Нахуй ты прешься в движок если блять даже БАЗОВЫХ операторов языка не знаешь. Иди язык учи епта. Игры делоть он лезет бля. Это блять как придти на завод болты крутить, но в душе не ебать каким инструментом это надо делать, и в какую сторону вообще крутить.
>>33361
Нехуй тут объяснять, в книге черным по белому написан пикрил текст, а значит книга не для вкатыша в геймдев, а для новичка в годо.
Я книгу скачал чтобы их не делать а чтобы научили делать
Я не на завод приперся точить деталь, я попросился к опытному мастеру в ученики, и мастер местами нихуя не обьяснил
>книга не для вкатыша в геймдев, а для новичка в годо.
Ты сам-то прочитал то, что запостил? Книга и для вкатыша в геймдев, и для новичка в годо.
>This book is for anyone
>New users and experienced developers
>Some programming experience is recommended
Знаешь разницу между recommended и necessary?
Блять, двачую! Аплодирую стоя! У меня так же пригорает от нулевых нубов, вкатывающихся в геймдев без элементарных знаний школьной информатики.
Тут даже знания школьной информатики не нужны, достаточно скилла гуглить. Или хотя бы придти и спокойно спросить в треде, без предъяв что кто-то кому-то должен.
> достаточно скилла гуглить
ИМХО, недостаточно.
Есть БАЗА, и её знать надо. До того, как он полез в геймдев (вершину айти, на которую восходят лучшие и сложнейшие технологии из остальных подразделов айти).
Печально. Придётся учить информатику в гугле.
Денги плоти!
https://2ch.hk/b/arch/2020-08-11/res/226549079.html (М)
Сойдёт? Бля, остальные треды проебались оказывается
Да вы задрали, илитки бля. Годот (как и некоторые другие движки) делает геймдев доступным для любого хуйдожника без базовых технических знаний, и именно это замечательно. Анон приходит в тред, делится своим мнением по книге, которую прочитал. То есть, он не просто лезет в геймдев, а он прикладывает усилия к тому, чтобы обучиться. И он пишет отзыв, который, может быть, пригодится другому нубу, ищущему хорошую книжку для обучения.
А вы тут развели - кококо не хотим пускать в наш уютненький геймдев.
Стыдно, товирищи!
[/bombing]
По мультитредингу вопрос.
В целом я разобрался, как создавать тхред и как пользоваться мутексами. Но теперь вот что спрашивается.
Вот у меня в тхреде встречаются call_deferred и set_deferred. И я хочу раньше времени прервать выполнение тхреда (например, чтобы его перезапустить с начала). Как мне теперь отменить эти деферреды, чтобы они не выполнялись?
Это не игра. И ты сам об этом написал. Такшта, остаюсь при своём. Такой ассетфлип да, можно вообще без знаний чего-либо запилить.
>А вы тут развели - кококо не хотим пускать в наш уютненький геймдев.
Соглы. Я был одним из тех, кто на его посты отвечал. Он их так писал, что меня триггернуло на его пустые претензии. Приношу извинения, если что. Вкатывайтесь в геймдев как вам удобно.
tl;dr - в этом снапшоте директ 12, однотредовый веб-экспорт, вэйланд.
Вот эта >>33190 проблема с яндексом, который не умеет в SharedBuffer, теперь решилась за счет однотредового веб-экспорта. Радуйтесь, четверочники.
>>книга не для вкатыша в геймдев
Ну пардон, не то слово выбрал. Не для вкатыша в программирование, а для новичка в годо. Так понятнее?
>>This book is for anyone
Че ты с контекста вырвал, пес. Написано что для каждого кто хочет научиться использовать игровой движок. Нехуй подменой понятий заниматься.
>>New users
Что в твоем понимании новые пользователи? Те кто нубас в движке? Или те кто нубас в скилле кнопкодава? Ты вообще контекст умеешь воспринимать? Или для тебя прямой перевод всегда несет тру смысл строк?
>Знаешь разницу между recommended и necessary?
Разница лишь в том что ты, тупорылый, настойчиво пытаешься игнорировать эту строку. На всех играх пишут рекомендуемые минимальные системные требования. Если ты игру попытаешься запустить на ведре параметры которого еще ниже минимальных, она, как неожиданно, запустится, но будет выдавать максимум 2 фпс. И в ком же вина что столько фпс выдает? В разработчиках? Или в том что ты игру запустил на ведре? Рекомендация хоть и не обязательная форма действия, но это явный маркер того что книга содержит материал который будет не понятен вкатуну.
>>33541
Никто и не гонит. Если человек приходит с безосновательными предъявами, то пусть уходит нахуй. Этож литерали пикрил мем предъявы.
Если хуярю так:
>zalupa(a)
>await cum
>zalupa(b)
>await cum
>zalupa(c)
>await cum
то все работает. Но если вхуярить эвейт в конец самой функции, чтобы не повторять одно и то же
>func zalupa(x):
>...
>...
>......await cum
>zalupa(a)
>zalupa(b)
>zalupa(c)
то нихуя, функции хуярят все сразу одна за другой
Смари.
-Вася.Пукни() -zalupa(a)
-Саня браток падажжи пока комната проветрится -await cum
-Саня.Пукни() -zalupa(b)
-Серега браток падажжи пока комната проветрится -await cum
-Серега.Пукни() -zalupa(c)
-Кто там следующий пажжи пока комната проветрится -await cum
Во так и работает корутина. https://gdscript.com/solutions/coroutines-and-yield/
там где стоит await выполнение функции останавливается, пока не кончится await
Так можно же в скрипт пустого проигрывателя заебенить ссылку с переменной, в которую будет будет передаваться название нужного файла с вызовом функции play()
var replika_name = null
func igrat_huinyu(name):
__replika_name = name
(Не помню куда там грузить и как,)
var suda_gruzit = load('res/audio/repliki/%s.wav' % replika_name)
Play() (хз как там)
А куда проще?
> как работает ебучий await?
https://learn.microsoft.com/ru-ru/dotnet/csharp/language-reference/operators/await
Вспоминали о ней и раньше, но редко. Годноты вообще много, всю и не упомнишь.
а зачем этот hurt.emit ? кому он эмитит? ареа 2д может сразу у вошедшего в зону предмета вызывать функции, а функция смерти напиример уже в самом плеере
как этот эмит ловить и чем и зачем?
Худу например, либо другим типчикам которые ловят сигнал и на его основе меняют данные, ну вот допустим получил ты урон, потом еще раз и умер, вылезает окошко со статистикой сколько ударов было получено и в какое время. Можно конечно не пускать ивент, а сделать тупо на жесткой связи все, но это не правильно ибо получится получится лапша с которой работать будет невозможно.
Эмит, как концепция, рассылает "всем кому интересно". Кому интересно, сами подписываются на то, что им интересно. Либо их менеджер/спавнер подписывает. Еще вариант с event bus когда все эмитят в одну кучу, и все подписываются на интересующие события в этой куче, плюсв и минусы в этом свои.
> плюсв и минусы
Я только плюсы вижу. Из минусов только что ивентбас является синглтоном, от которого на собесах не перезванивают.
мимо фанат ивентбаса
Мне эвент бас тоже кажется удобней обычных сигналов. Сигналы заебешься еще коннектить туда-сюда, в иерархию погружаться. А в автобус насрал и забыл, а кому надо сам подберет.
Годотным туториалам надо чаще эвентбас упоминать
Ты не знаешь БАЗУ туториалов. А она такова, что в туториалах инфоцыгане городят говнокод ради донатов. Запомните глупцы: на ютубе вы найдёте только развлекательный контент. Если хочешь изучить движок - читай документацию, качай примеры. Как сказано в шапке.
720x576, 0:58
Таков двач.
Завтра будут утверждать обратное.
Думай своей головой, а не постами на двачах. Не верь никому, даже мне.
Инфоцыган в годоте - полтора землекопа. Тут другая проблема. Туториалы делают такие же нубы, которые просто чуть-чуть что-то узнали и теперь бегут этим делиться. Настоящих опытных профессионалов среди них - те самые полтора инфоцыгана плюс ещё полтора канала с парой сотен подписчиков.
Доку же пишут те, кто действительно шарит. И в доке есть текстовые туторы, кстати. Просто существует большой разрыв между опытными и нубами. Среди опытных кодеров очень мало хороших учителей, а без этого навыка писать понятные туторы очень сложно. С другой стороны, читать доку - это тоже навык, которому надо учиться, вкатышам это сложно, им проще видос на ютубе.
>читать доку - это тоже навык
Ну 50/50, тут скорее лень читать и тестировать играет роль, вкатышу же че надо, чтоб он на следующий день уже сидел игру делал, вот и прутся видосики смотреть. Я думаю ты сам часто замечал что вкатыши как способ передвижения юзают телепортацию, тобишь изменение позиции на прямую, а потом задают вопросы типо че при большой скорости тело проходит через коллайдеры, как фиксить. Или вон, недавний пример, анону не объяснили что такое : и +=, хотя с его слов он не один туториал посмотрел. Или вопрос с await. И таких примеров триллиард можно привести. А самое главное, ответы на все эти вопросы можно найти чуть ли не на первой странице документации.
Поэтому это скорее не навык, а желание действительно чему то научиться.
Но проблема в том, что сейчас прописан конкретный цвет - зелёный. Если завтра я захочу его изменить на красный, мне придется полностью все эти коды в диалогах к хуям переписовать. Как мне сделать цвет через переменную, чтобы я мог без лишней ебли менять его?
Для понимания сейчас в json так:
"Ебать его в рот диалог [color=#62FF4A] тут типо зелёный цвет [/color] а тут обычный "
Есть идея сделать выделить нужные слова в отдельный массив и в годоте шаманить с выводом, но это какие то лютые костыли
var TEST1 : string = "[color=#62FF4A"
var TEST2 : string = "[/color]"
"Ебать его в рот диалог" + TEST1 + "тут типо зелёный цвет" + TEST2 + "а тут обычный "
Ваще не шарю в этом. Но вот так не сработает?
Проблема в том, что это внутри json вписано, тоесть внутри словаря. А в нем я не могу ??? ввести внутри переменную
Ну конечно не можешь. Это данные. Но ты можешь трактовать какие то данные особым образом. Естественно для этого придется написать какой код, обрабатыающмй данные. Например regex или просто шаблонизатор. По сути автозамену в строке какого то маркера. "My string {green} word {white} " ну ты понел.
Перестаньте записывать все подрял, включая нормальный рабочий процесс, в костыли.
Двачую этого. Посмотрите любые диалоговые плагины, они буквально все на регекспах.
for i in grid_container.get_child_count()
от:
for i in range(grid_container.get_child_count())
?
Ничем
Нуу, а чего бы на исходнике не удалить в граф редакторе? А так, шейдером цвет можно поменять
Так падажжи. Не вижу в твоих аргументах опровержения тезиса о том, что вкатышам сложно в доку. Телепортацию они используют, потому что это самый простой способ перемещения. При том, что все видеотуторы говорят про 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.
Так падажжи. Не вижу в твоих аргументах опровержения тезиса о том, что вкатышам сложно в доку. Телепортацию они используют, потому что это самый простой способ перемещения. При том, что все видеотуторы говорят про 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.
Не. Ты смотришь в справку по апи классов. Справка по апи содержит именно его. Справка по апи каждого класса не должна начинаться с курса информатики, типов данных, объяснения инхеритед, и опреатора += и тем более способ мышления.
Потому что апи представляет собой кубики конструктора.
При этом способ мышления вполее описывается в водной части документации. Полистай содержание. Там и введение в гдскрипт, и туториалы, и способ мышления, бест практис, многое описано.
Наоборот, ящитаю что в апи классов слишком много примеров. Они заставляют пролистывать их.
Так я и не опровергал лол, я лишь написал что для того чтоб читать документацию нужен скорее не навык а банальное желание. Ты сейчас буквально написал все тоже самое что и я, только более развернуто)
> Чем отличается
Метод range(a, b, c) имеет три параметра, второй и третий необязательные. Таким образом приведенные тобой варианты кода аналогичны. Цикл for генерирует range с одним параметром из поданного ему на вход целого числа (а ты ему целое число на вход подаёшь, int get_child_count().
Сила ренжа проявляется, когда ты используешь два-три параметра:
> range(3, 7) # Выдаёт массив целых от 3 до 6
> range(10, -10, -2) # Выдаёт массив от 10 до -9 с шагом -2
> а чего бы на исходнике не удалить в граф редакторе?
Например, исходник может делать изъёбистый художник которому впадлу и нахуй, а спрайтщитов может быть сотня и все периодически обновляются.
> открыл классреференс
> считает это всей докой, а не одно лишь из её частей
Имаджинировали, с кем в одном треде сидим?
> Вот у меня прямо сейчас открыта страница в доке https://docs.godotengine.org/en/stable/classes/class_xmlparser.html
> Представим, что её увидел вкатыш
Вкатыш, который с наскока пытается в хмл вкотиться? Через геймдев? Очень реалистичный сценарий (нет).
>не навык а банальное желание
Нет, именно навык. Потому что:
1. Найти нужную страницу с нужной строчкой - для этого надо уметь ориентироваться в этой доке.
2. Вычленить из сухих описаний ответ на свой вопрос.
3. Объединить несколько разрозненных частей информации, каждый из которых по отдельности не отвечает на заданный вопрос, в единый ответ.
А, и самое главное:
0. Суметь сформулировать сам вопрос, ответ на который искать в доке.
Желания может быть сколько угодно, но умение работать с докой - это именно умение. У меня во времена вката (года три назад) был вагон желания, но я открывал доку, читал, нихуя не понимал и шёл в тредик спрашивать анона. Анон давал ссылку на страницу и спрашивал: ЭТО ЧТО?
https://docs.godotengine.org/en/stable/classes/class_string.html#class-string-method-format
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 в таких случаях предпочтительнее всего, потому что при переводе на разные языки может оказаться, что в другом языке другой порядок слов, и порезанная строка никак не адаптируется под него. А так прямо в переводимой строке можно прописывать все "переменные".
Опиши реальный сценарий.
Ну ок не с исходником, а со спрайтшитом до импорта в годот.
Фон однотонный? Imagemagick. Фон типа пейзаж? Вроде нейронки какие то были.
Что стоит иметь ввиду при вкате в годот?
Я рассматриваю его как альтернативу возможному своему текущему инструментарию (я - изврат из IF-треда, пишущий на твайне (связка js-html-css-sugarcube 2 с основным упором на жс), пилящий пейсочницу/рпг), пока что безыгорный.
Вообще, есть какое-то подобие роудмапа?
Как какать куда смотреть в первую очередь?
>на твайне
>пилящий пейсочницу/рпг
Твайн же по визуальным новеллам, не? Если так, то у нас хватает плагинов для ВНок.
>Вообще, есть какое-то подобие роудмапа?
Мой путь был таков. Проходил официальный 2д гайд, делал насколько учебных проектов, потом поглядывая разные туториалы на ютубе начинал делать свои идеи.
Твайн необязательно по вн, но для них он хорошо подходит.
Но он точно не подходит для того, чтобы писать игру песочницу/рпг, в которой можно грабить корованы. А я именно на это нацелился.
К слову, я пописываю уже полгода в неторопливом темпе. Из последнего - влетел в один досадный баг и выкинул нахуй весь жс с целью переписать его с начала с учётом того, что узнал, лучше и с менее отбитыми решениями.
это код для RigidBody2D игрока, чтобы когда он влетал в край экрана то появлялся с противоположной стороны
То что _integrate_forces юзается чтобы просчет process_physics(delta) не пидорасило я понял
Но что делает аргумент в скобках? по дефолту там "state", но автор книги написал "physics_state" потому что "state" уже используется выше
Вроде это добавляемое состояние для Игрока, но как оно работает непонятно
и что еще за physics_state.transform? что за origin и его ".x"
Ну это бомба.
из этого даже с переводчиком мало что понятно
Physics state это внутреннее состояние физ движка, нк пытайся понять, это тебе не понадобится в билжайшие несколько лет.
Трансформы описаны в доках, сам трансформ это общее преобразование (позиция, поворот, масштаб), origin это только позиция, x это одна из 3д координат x.y.z
Спасибо
Вроде разобрался, спасибо
Темплейт выбери/зделой.
В папке пользователя в ос есть папка script templates, там делаешь какие хочешь шаблоны
https://docs.godotengine.org/en/stable/tutorials/scripting/creating_script_templates.html
Где-то в скрытых папках годота лежат эти шаблоны скриптов, можно поправить. Да и вообще можно свои шаблоны на разные случаи написать.
На пике снизу приходит сигнал с менеджера сцен, 30 строчка просто не работает, никаких ошибок ничего нет, просто не работает, при этом в отладчик print мне спокойно эти +++ выводит (31 строчка), то есть сигнал доходит без проблем.
Я добавил специально в сцену кнопку для теста, когда я нажимаю на кнопку, текст меняется на --- без проблем
под переменной просто ссылка на richtextlabel, я пробовал вставлять напрямую, все тоже самое. В чем проблема?
С таким сразу ошибка
>>34876
на кнопку работает без проблем
Я сделал вот так на пике
В обоих случаях принт мне все выводит, но если через сигнал с менеджера сцен, то текст не меняется. Если через кнопку - меняется. То есть когда сигнал идет с другой сцены - .text просто не работает. Это баг или фича?
Хотя это наверное не при чем. Сложно сказать. По опыту могу посоветовать проверить, что ты не затираешь значение тут же другим, например в процесс постоянно не перезаписываешь или обработчиком кнопки (может у тебя постоянно создается эта строка заново ), второе проверь что сама ссылка указывает на тот же объект.
Попробуй вывести print(fio), print(fio.name), print(fio.text)
Так а сигнал ты вызываешь? Просто зеленая стрелочка означает что кнопку ты подключал через интерфейс редактора, а у второго такой нет, значит ты где-то должен сделать connect, и emit.
Проверь в таком случае количество аргументов. Емнип если у тебя обработчик handler(), а ты испускаешь сигнал с параметрами, то этот не вызовется потогму что не совпадает кол-во аргументов.
>>34891
Это похоже какие то костыли в работе сигналов или я не знаю. Вообщем я еще потестил пик. С кнопки все работает как надо. Через сигнал работает только отладчик, .text и .hide не работают. При всем этом для сигнала и для кнопки счет x идет независимо, хотя по идеи должно идти вместе. То есть я нажму кнопку, станет 11, потом через сигнал - опять 11 выводит, 2 раза кнопку - 1111, а потом сигнал - 111. Короче залупа какая то я хуй знает или я чего то не понимаю в работе сигналов и так и должно быть.
выше кода ничего нет и ниже тоже, я все закомментил
на втором пике как вызывается сигнал, функция активируется просто нажатием на кнопку на другой сцене
>То есть я нажму кнопку, станет 11, потом через сигнал - опять 11 выводит
Это скорей говорит о том что ты твой объект принимающий сигнал в какой то момент задублировал. В каком файле/классе находится _test()? Проверь где ты создаешь объект этого класса. Выведи при отладке и print(self.name)
Я даже так предположу.
Ты добавил на сцену объект (пациента или что то такое). Подключил ему в редакторе сигнал от кнопки. Не подключал скриптом его ко второму сигналу. Он принимает только сигналы от кнопки.
Потом ты в скрипте где-то спавнишь такой же объект. Ты не подключал его к кнопке. Но ты в скрипте подписываешь его коннектом на програмный сигнал. Он принимает только програмные сигналы, но не кнопку.
Они могут находиться в одном месте экрана, и ты даже не знаешь что они накладываются друг на друга.
>print(self.name)
Благодаря этому нашел проблему, сейчас все заработало, спасибо!
>>34906
Да всё проще, я изначально на сцену добавил вторую сцену и все подключил. Потом я эту вторую сцену решил переместить в третий сцену, а уже третью сцену добавить к начальной. При всем этом я забыл удалить вторую сцену из первой, а она ещё и скрыта была, поэтому я не замечал, что у меня по факту стало 2 вторых сцены. При всем этом скрипт к сценам был прикреплен один и тот же. Короче затуп на ровном месте.
Ладно, телепаты возвращаются в отпуск.
https://www.youtube.com/watch?v=W1_zKxYEP6Q
На первой соньке столько игор сделано, что за одну жизнь всех не переиграть. Если хочется первоплойковской эстетики, просто качаешь эмуль и кайфуешь до самой смерти. Создатели подобных гунметалов перекрывают доступ нам к настоящей олдовой годноте.
Такшта я как считал, так и считаю, делать надо современное, с туншейдером, если тебе не хочется 4К текстуры ставить.
П.С. Да ещё и мультиплеер, фунахуй.
>Если хочется первоплойковской эстетики, просто качаешь эмуль и кайфуешь до самой смерти
К первоплойковой эстетике в настоящих играх на первой плойке прилагается хуевое управление, кривой геймдизайн, ограничения железа и прочие чудесные вещи консольных игр той эпохи
Двачую этого. Плюс, имея выбор поддержать копрокорпорацию или поддержать братана-индюка, я всегда выберу второе.
Если заплатишь такой же бюджет то легко
Ну, 3д графику 2010-х тут раза три кидали. Road to Vostok, еще пара каких то. И да, нужен будет игровой комп чтобы это работало.
Тут важен и не 3д редактор, а 3д скилл. Все всегда в скилл упирается.
Не совсем, там же какой то физон был, типа взрывом можно снести стену лачуге, можно раздвигать кусты джунглей.
Автор тупо говорит добавляй это в код, потом это добавляй он то то делает, но я нихуя не пойму логику по которой он вообще добавляется, типа блять а как мне быть когда я сам буду скрипты писать? Как мне продумать что в этом скрипте писать а что в том? А как лучше?
И код сложнфй пиздец, я непонимаю мне хуй на него забить или сидеть изучать что такое "ортогональный" и почему то то умножается на тото
Пиздец короче
_ready() вызываются в порядке от вложенных нод в сторону корневой. Поэтому в ready можно присваивать переменным ссылки на объекты гуя
Запись
@onready var a = $smth
Соответствует
var a
func _ready():
a = $dmth
У меня сейчас нахуй голова лопнет
Я немогу просто засунуть в переменную ссылку на ноду потому что?
Потому что то она еще не загрузилась, ее ready не был вызван, объект не до конца сформирован.
Старайся и осиливай. Потом пригодится.
Да. И когда дети этой ноды тоже станут готовыми.
Это и был их план, пчел.
Рогалик
Sandbox/rpg.
Мне стоит пока на этом сосредоточится или надо паралельно какую нибудь свою игру пилить?
Просто я думаю если игру паралельно пилить то там гуглить надо будет дохуя а это время, а у меня после работки его маловато
Ты это делаешь имея стабильный заработок, следовательно это твоё хобби, так что делай как тебе интереснее.
Ну вообще хочеться перекатится побыстрее на заработок с игор, ибо у меня дноработка 20к и умирающий новутбук, а родня подгоняет пойти на работу пооплачиваемей в колхоз блять за 40к (скорее 30к)
Ты бывал на коровьей ферме? Я бывал, и я не хочу туда
Например?
>Ты бывал на коровьей ферме?
Я бывал, прикольный говняк кругом.
>заработок с игор
Будем честны, шансы не слишком большие. Как сказал анон выше - тебе в гиперказуалки, кликеры, веселые фермы, 3-в-ряд, и все такое. И лучше всего сразу под мобилки. А с гугл-плеем и выводом оттуда денег - сам понимаешь, санкции. Мне пришлось в соседней стране банк открывать чтобы все заработало.
Либо, если не под мобилки, то возможно какие-нибудь яндекс-игры или вк-игры. Тут я не шарю.
Нет, зачем? Я пока с 3-ки не перехожу.
Ну в яндекс игоры и мечу
Правда я хз через сколько времени смогу нормально пилить игры а не сосать хуй с туториалами
Ебашь гиперказуалки. По многим из них есть туториалы. Берешь готовые ассеты и хуяк-хуяк и выложил. Со временем еще свои шаблоны наработаешь.
например,с оплатой или рекламой
Тоесть с гугол плея чтобы вывести надо счет за бугром открывать ехать? Мда блять
Наверно прийдется в отечественный рустор сувать...
Добро пожаловать в новую с 2022 реальность. Тебе в гугл-плее еще 25 баксов оплатить надо будет за девелоперский аккаунт. С российской картой это, увы, невозможно.
>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). Возвраты вам для чего Ритчи и Страуструпом даны?
Игра браузерная
Либо пили свое, либо улучшай игры из книги, так ты гораздо быстрее познаешь все нюансы. Простое копирование - не твой путь.
Если соберешься делать под мобилку и ведроид, то помни, что есть не только гугло-стор но и всякие дополнительные площадки типа:
apkmirror.com
appbrain.com
taptap.io
developer.taptap.io
open.qoo-app.com
Там зачастую нет такой анальщины как в гугле с предрелизной проверкой.
Мимо пилю под игру и хз как найти 20 тестеровщиков для гугло-стора.
>>36141
> еще 25 баксов оплатить
С беларуского райфайзена все оплатилось отлично, так что проблема решаема дешевым путем.
што тама? у меня нету вк
Хочу сделать шутер, но получится ли у меня, хз.
А как вообще модерация проходит? Типа загрузил игру и какой то модер должен ее поиграть пару часов и потом как то на почту напишет что "хуйню сделал, переделывай давай"?
Он ещё быстрее типизированного гдскрипта
Пишу исключительно на с++.
Делоем.
Найс. Добавь еще про sharedbuffer в 4.3, а то часто спрашивают. Если шапку вообще кто-то читает.
Вот у меня персонаж, у него играет анимация idle, тут к нему подходит другой персонаж которому надо уебать и проиграть с этим анимацию attack. Анимация, конечно, проигрывается, за доли секунды, поэтому создаётся впечатление что постоянно играется idle.
Вот и как прервать idle на время проигрывания attack?
Загуглив нашёл только один тред на Редите где чел вышел из положения вместо _physics_process использовав _ready, но это не мой случай, ибо c _ready ничего не будет играть вообще.
Контекста маловато. Это ты с AnimatedSprite2D бодаешься или с AnimationTree? Скинул бы хоть гифку/видос как это выглядит
Шапку никто не читает. Я месяц проводил эксперимент, добавив в шапку кое-что в самом начале. Никто не прокомментировал в треде.
Ты только что крейзигеймс, лол
Нет, у них там воооот такенный свод правил, и модер должен убедиться, что в игре они нигде не нарушаются ни на буковку.
>>36647
Я всё подряд типизирую, мне не сложно.
Вообще, нетипизированные данные - это клёвая фича, но нужна она буквально в двух случаях.
1. Когда делаешь универсальную функцию, принимающую на вход какие-то данные. Функция их как-то интерпретирует, приводит к типу и выдаёт однозначный результат. Например, func play_sound(sound), где sound может быть ресурсом наследником AudioStream или именем файла.
2. Словари. Хотя в четвёрке стало гораздо удобнее использовать кастомные классы в большинстве случаев, когда в тройке я бы заюзал словарь. По сути сейчас словари нужны только для хранения больших гибких структур, типа сохраняемых данных.
>Ты только что крейзигеймс, лол
Поясни. Я как раз туда собирался свою поделку отправлять, даже вкладка открытая висит.
Если скрипт принадлежит данной сцене и я в нем ищу ноду, то как может быть нулл?
Я не знаю. Поставь брейкпоинты и посмотри что в рантайме находится. Можешь еще во вкладке remote в дереве нод посмотреть во время запуска.
А если get_node() используешь, что выдаёт? Может ты по пьяни "C", "o" или "e" не в той раскладке написал?
>remote в дереве нод посмотреть во время запуска.
Спасибо антош.
Там искомая Нода2Д не появляется, странно.
Ну, тут конечно ситуация тяжкая, раз уж ты в процессе каждую анимацию проигрываешь. Можешь либо переписать всё под стейт-машину, но это почти весь код перелопатить придётся, либо добавить проверку текущей анимации и ее прогресса в строчку с is_on_floor(). Привести к виду чего-то типа пикрила. Конечно, работать будет только при условии, что у тебя анимация "attack" не поставлена на луп.
Протипировался, быстрее работать не стало
стелс
А че там за правила?
Можно например кровавый клон дум первого залить? Или там совсем на малышей все расчитано?
>ситуация тяжкая
А как можно сделать лучше?
>стейт-машину
Это что такое?
Попробовал твоё условие, всё равно не работает, зацикливание не стоит.
Стей машина это типа механизм изменения состояний
Final state machine
У тебя типа будет список состояний (стоит, сосет хуй, идет) и каждое состояние будет задавать агимации или характеристики другим нодам
А текущее состояние будет указано в определенной переменной, тоесть одновременно можно только одно состояние
>А че там за правила?
Да блять, ну что ты как маленький?
https://yandex.ru/dev/games/doc/ru/concepts/criteria
С таким подходом ты модерацию не пройдёшь.
Ах да, ещё заёб, про который открыто не пишут.
а) Модер натыкается на нарушение - модер прекращает проверку. Если там дальше есть какие-то проблемы, до которых он не дошёл, это твои проблемы.
б) После прохождения мочерации (а она и так занимает день-два) повторно отправить можно только через время, начиная от суток. И с каждым разом это время увеличивается.
>Можно например кровавый клон дум первого залить? Или там совсем на малышей все расчитано?
Можно-то оно можно, сисема возрастного рейтинга там есть. Вот только игроков постарше нет. Там не то чтобы рассчитано под детей, но преимущественно именно они и обитают на платформе.
>>36766
На крейзи, если твоя игра им "не подходит", они просто отказывают без указания причин. Причины указывают только если "подходит", но какие-то правила нарушает.
Какие критерии "подходимости"? А пошёл ты на хуй, вот какие.
>крейзи
Ты меня замотивировал туда отправиться. Сейчас открою вкладку, которая уже недели 2 висит, и заполню эти унылые формы. Отпишусь возьмут ли.
Мда, поднимаем отечественный гейдев
А если этот самый, вконтакте плей какой то, где атомик херт, че там по модерации и аудитории?
По сути сторы хотят чтобы:
твоя игра не вредила их бизнесу (не подставляла под порнографию, политику итд)
в частности им не нужна хорошая игра как игра, но тот же ЯИ требует хотя бы набивать контентом. Им же надо чтобы игрок зависал на платформе и ему было интересно, чтобы скармлимать ему рекламу.
То есть им не нужна игра на 5 минут, им надо игра на полчаса хотя бы.
И они не хотят технических косяков. Это пункты про картинку пола, отключение звука на альт табе, отключение долгого клика на айфонах, вот это все.
Так что принцип довольно простой.
Им не нужна хорошая игра как хорошая игра. Им нужна качественно сделанная, наполненная контентом на какое-то продолжительное время, пусть и примитивная казуальная игра.
Короче говоря, нужно быть нормисом, чтобы сделать нормисную игру и нормисы-модеры её заапрувят. В общем, не для двачеров сервис, мда, штош.
твою залупу тоже нужно подождать иначе ждать cum будет только залупа:
await zalupa(a)
await zalupa(b)
await zalupa(c)
ебаш свой собственный RichTextEffect и делай там что хочешь. можешь там хранить мапку с цветами и юзать их по ключу.
extends RichTextEffect¶
var bbcode = "mycolor"
var color_map = {
title = "#ff0000",
text = "#00ff00",
dialog = "#0000ff"
}
func _process_custom_fx(char_fx):
var c = char_fx.env.get("color", "text")
var out_color = color_map.get(c, "#000000")
char_fx.color = out_color
Юзать:
[mycolor color=title]Title[/mycolor]
P.S. Вроде еще нужно tool и class_name на скрипт. Смотри доку по текст эффектах. можно сделать эффектов на каждый чих для каждого цвета
Отлично, есть healess игровой сервер (который может запускать ту же игру, только без графона - физон, игровую логику), его поднимали во всяких облачных хостингах, есть RPC (дистанционный вызов функций) в 4-ке это аттрибут @rpc, в 3-ке надо было вызывать rpc("имя функции"). Пользовался в 1 игре и 2х утилитах (коннект мобильного клиента и пк).
Ну если что попроще там есть http запросы и вебсокеты, если с самописным серваком соединяться.
> sharedbuffer
Несколько тредов назад постили аддон, который как-то решает эту проблему, я сразу не схоронил, а теперь ссылку найти не могу. А может он оказался нерабочий и его удалили из ассетлиба.
Да у меня все равно игра мультитредовая, если ей шаред буффер вырубить то она работать перестанет. Так что крейзигеймс в пролете, не получат они мою драгоценную 10/10 готи игру.
Хаха! Так им и надо, ретроградам! Это ж надо ж, не могут две строчки в конфиг сервера прописать!
> Godot 4.3 will FINALLY fix web builds, no SharedArrayBuffers required!
https://forum.godotengine.org/t/godot-4-3-will-finally-fix-web-builds-no-sharedarraybuffers-required/38885
?
>This allows you to force the exported game to run on a single thread
У меня мультитредовая игра. Я в коде, сам, треды использую. Чтобы треды работали в вебе им нужен SharedArrayBuffer, если я его выключу (когда дадут возможность), то у игры жопа код отвалится.
Но не критично на самом деле. Игра свое уже показала, когда-то давно я ее под итч делал, сейчас просто хотел дополнительно раскидать.
Ну вот ты открыл несколько тредов в отдельных вкладках и читаешь один, а в сосежних мигает значок, что новые посты появились, ты переключаешься в соседнюю вкладку и читаешь посты там, и пока ты читаешь в одной вкладке ты не можешь читать другие, но при появлении новых постов они опять мигают и ты опять переключаешься в другую вкладку.
Вот буквально, литерально, точно так же действуют треды в кодинге. Только читателем в этом случае является процессор пеки.
В одном треде крутится основная игра, а в других тредах подгружаются соседние локации, и когда подгрузились, мигают процессору семафором "эй, я сделял" и проц хватает данные и предоставляет основному треду.
Остроумно
Мои на 30-60мб.
Итс революшн,Джонни!
>когда-то давно я ее под итч делал, сейчас просто хотел дополнительно раскидать.
Не повторяй моих ошибок. Игра под итч и игра под ЯИ - это две очень разные игры.
>Я в коде, сам, треды использую
А поделись, если не секрет: для чего? Просто мне вот до сих пор не встречалось ситуаций, когда бы это было действительно нужно. Единственный раз понадобилось для загрузки файлов, но для этого у годота есть готовый объект, который сам внутри себя мультитредит как надо. А операции с нодами в любом случае надо в основном потоке делать.
Для оптимизации тугого участка кода, там много массивов с кучей информации об истории ходов и оно хорошо параллелилось. Сейчас я уже понял как сделать однопоточно и еще быстрее, но лезть в старый код, в старый проект - и лень и стремно.
Может однажды слоупоки вроде ЯИ и крейзигеймс смогут в SharedArrayBuffer, тогда и им выложу.
Шутки шутками, но ящитаю покемоны-стайл или тамагочи-стайл - всегда актуально. Тот же "мой говорящий том" и его клоны до сих пор в топе гуглплея.
@tool скрипт. Делаю add_child(node). В дереве сцены, ессно, она не появилась, но визуально видна.
Таких нод у меня много, целая генерация. Я в редакторе их нагенерировал, проверил, что всё ок, и теперь хочу, чтобы они отобразились в дереве и сохранились в сцене, чтобы больше не генерировать. Применяю к ним node.set_owner(self). И нихуя не происходит.
Что я мог упустить?
Где брать звуки и музыку, не самому же мне ее писать, аутсорс не предлогать, я бедный соло разраб.
Ну и какой подход лучше, делать звуки одновременно с другими задачами, или сделать все, а потом в конце плотно сесть за музыку и сделать сразу для все игры.
> >стейт-машину
> Это что такое?
Это такая вещь, с которой обязаны начинаться настоящие курсы геймдева.
(как мы выяснили пару тредов назад)
https://ru.wikipedia.org/wiki/Состояние_(шаблон_проектирования)
https://gameprogrammingpatterns.com/state.html
> всем трендом соберемся и запилим НАШИМОНЫ
Покеходы-наоборот с толщемонами.
Нихуя они не соберутся, проверено. Полна доска одиночек, не умеющих в командную работу.
>жанр так рано или поздно вымрет из-за эксплуатирования ровно тех же идей в каждой игре.
Это как утверждать что котики-собачки вымрут из-за того что живут в каждой второй квартире.
Кривая аналогия подобна котенку с дверцей.
Нет, это как сказать, что спиннеры и попыты уже не покупают, потому что их купили все желающие.
Спиннеры и попыты это мимолетный хайп, а котики вечное.
Поковырялся в доках, пришёл к рабочему решению: EditorScript.new().get_scene()
аригато, семпай
В итоге всё равно отказался от этого решения, потому что тормоза вызывает генерация кучи нойзтекстур, а не это вот всё. Но на пути к этому пониманию твой совет очень помог.
Отсутствует, потому что я не использую анимацию.
на качество тени влияют настройки источника света. Непонятно какой источник у тебя
В тройке в настройках проекта были опции для разрешения теней. Вот они на это влияли. В 4 хз.
Попробую объяснить своими словами (это может быть не так, как реализовано реально в коде, но так, как воспринимается со стороны игродела)
Вся сцена помещается в Bounding Box, и на этот объем натягивается текстура для тени размером указанным в Project Settings directional shadow size.
Соответственно, проблему можно решить:
1) Увеличив размер текстуры тени (за счет видеопамяти)
2) Уменьшив дальность в Directional Light, тем самым уменьшив 3д объем, при сохранившемся разрешении текстуры тени.
Ну и играйся с остальными настройками, например blend splits сглаживает края.
А так да, тени в годоте всегда сложно настраивать. Дальше возможно придется погружаться в запечение (для неподвижных объектов).
Порядок пик перепутал. пик2 - 2), пик3 - 1).
Плюс, насколько я понимаю, настройка Splits сделана для того, чтобы можно было сделать и тени для больших объектов (типа стен), и небольших (типа мяча рядом с камерой игрока).
Там очень много подводных, все сразу не вспоминть, и такие моменты что тебе важнее, четкая тень или стабильная (которая не дрожит между кадрами), и что тебе важнее, тень на горизонтальном полу или вертикальных стенах, довольно сильно зависит от того большие или мелкие предметы.
многое описано в доках
https://docs.godotengine.org/en/stable/tutorials/3d/lights_and_shadows.html
а в мобилках это все выкидывается нафик и рисуется просто декаль кружока, такие дела
> возможно придется погружаться в запечение (для неподвижных объектов)
А если в игре мечты предполагается динамическая смена дня и ночи? Запечение не покатит.
>>37694
Так, годаны, погодите.
Обесните мне в чём я неправ: Ящитаю, в 2024 нет смысла ебаться с тенями/зеркалами. Задача движка сегодня - предоставить видеокарте с рейтрейсингом, где в сцене источники света и дальше она сама строит тени и отражения.
Соответственно, задача девелопа теней сводится к простому алгоритму:
1. Берём в руки си++ и пишем свой проприетарный модуль-адаптер к ртх видюхи (либо нанимаем скиллового челика)
2. Детектируем ртх у игрока.
3. Если ртх не найден, сообщаем игроку, что пусть довольствуется дефолтными говнотенями.
Всё.
А вы пытаетесь какие-то тени идеальные выводить. Смысла в этом ноль. Эпоха сменилась. Алё.
Собственно на этом месте я пока и бросил делать дин. смену дня и ночи в опенворлде. Скила пока не хватает, изкоробочными решениями не обойтись.
Одна из проблем как раз упомянутые горизонтальные/вертикальные поверхности. Допустим я настроил параметры bias и прочее как мне нравится в сцене, а потом поменял угол солнца, и только тени снова пошли полосами, а значит эти параметры надо тоже менять динамически для объектов, может быть даже для каждого часа времени.
А еще, емнип в 3-ке, если просто крутить directional light, то шэдоумапа пересчитывается. Поэтому каждый кадр это делать тяжеловато становится для фпс. Возможно там надо делать что-то с интерполяцией, посчитав тень для двух углов солнца. Но вот на такое скила у меня не хватает.
Не дрочи на графон. В игре главное геймплей. Что толку от твоих теней, если в игре скучно?
Не угадал. Важен И геймплей, И графон, и много чего еще.
>Ящитаю, в 2024
Лет через 10 это будет актуально. Прогресс, когда он зависит от железа, двигается довольно медленно.
>>37700
>>37668
https://twitter.com/Paw_Rescuers/status/1757359069273141310
Меня вот эти интересуют. У них древний телефон и глес2, но при этом вполне себе графон на 60 фпс, динамичное освещение, смена дня и ночи, вся хуйня. Они обещали запостить как они этого добились, но так ничего и не запостили, только хайпанули. Пидоры.
Магия мультитрединга.
Тень попадает в кашу из травы - так что там никакая четкость не нужна. В отличии от скрина выше, где идеально ровная гладкая стена.
>древний телефон
8 ядерный флагман, хех. Чуть чуть быстрее моего Xiaomi того же года, а у меня все летает. Так что не очень показательно, не днищефон.
У меня на телефоне в 2 раза мощнее динамичное освещение дает результаты в 2 раза хуже, как я ни пытался. Тоже на тройке.
У меня видос мыльный в этом месте так что не могу сказать что там происходит.
Может дело в том что показан маленький кусочек мира? Ну то есть попробуй применить совет выше и просто ограничь directional light max range
God rays и дождь там просто 2д (брызги прямо на дереве спавнятся, не за ним), но с пересчетом проекции.
что-то слишком заумно написано, многа букаф, матиматика какая-то, но картинки прикольные, промотал всю статью
программисты-не-нужны, ты что ли?
>>37826
Вот я хочу сделать резкое стилизованное затемнение шейдерной травы для plane. Т.е что бы спрайт травы не частично затемнялся от тени, а целиком создавая резкий переход. Насколько я понимаю мне надо получить в точке с травой на plane с шейдером количество тени, и покрасить этой тенью весь спрайт травы. Но я что то нихуя не пойму где тут получить это тенивое значение. Нашёл только какие то обсуждения годовой давности на забугорном форуме но там пишут, что без ковыряния в исходниках такой возможности нету. https://www.reddit.com/r/godot/comments/11ma6if/is_there_any_way_to_access_the_directional_shadow/
Была мысль прикрепить к ним VisibilityEnabler, но подозреваю они и так скрываться должны когда находятся вне видимости.
Какой рендер? Подозреваю мобильный? В любом случае, твоя цель - минимизировать кол-во пар свет-материал. То есть:
ограничить радиус света, чтобы свет светил на меньшее кол-во объектов, (соответственно возможно имеет смысл разбить большие объекты на мелкие тайлы, но тут не 100% уверен).
ограничить чтобы на один объект светило как можно меньше источников, в идеале только 1. В каких-то режимах рендера, каждый свет это отдельный проход, поэтому на мобилке вообще хардкод лимит 8.
Уменьшить кол-во материалов в объекте, а то бывает даже в лоуполи нагородят десятки материалов, когда достаточно одного-двух. По возможности не связываться с полупрозрачностью, особенно многослойной (стакан на фоне бутылок на фоне окна). Обычная прозрачность (есть/нет), вроде, норм, поэтому иногда заменяют тени или прозрачность на дизеринг (в геншине видел).
Если ты делаешь траву как выше, копай в сторону Multimesh Instance. Или вообще попробуй для начала готовый аддон https://github.com/HungryProton/scatter там есть готовый пример.
>Насколько я понимаю мне надо получить в точке с травой на plane с шейдером количество тени, и покрасить этой тенью весь спрайт травы.
Думаю, это можно получить или рисуя в текстуру и проверяя результат, или пуская рейкасты, на проверку между листом и источником света, для конкретного листка. Изнутри шейдера не могу придумать, как это может работать хорошо (если только в вершинном это сначала как то определить)
Хорошие советы, спасибо. Поделаю их.
Сейчас пытаюсь нагородить альтернативу с помощью HDR в тройке, оставив только 1 реальный омнилайт, остальные заменив объектами с эмиссией.
HDR вроде отжирает долю перформанса, и его нет в GLES2. Ну и с эмиссией там будет такой момент, что аура свечения у emission будет одинаковая и индивидуально настроить тут не придумали, см. >>875941 →
Еще из экстремальных приемов фары из гта5. То ли 3д спрайты, то ли как то с буфером глубины разбираться.
>HDR вроде отжирает долю перформанса
Да, сразу на треть упало, но по моим тестам это пока лучше чем омнилайты. Тут еще плюс в том, что глоу-объектов я могу навалить сколько угодно, и фпс будет почти одинаковый что при 1, что при 300 объектов. А каждый дополнительный омнилайт больно кусает за фпс. Ты прикинь какие красивые уровни можно запилить, имея 300 небольших глоу объектов? Да я ща Blackreach из скайрима!
>Если менять Power в emission, меняется цвет свечения, но радиус остается тем же.
Пикрилы - только energy поменял, с 16 до 2. Радиус уменьшился. Думаю у тебя была проблема в настройках WorldEnvironment -> Glow -> Levels. Я все 7 включил.
Видимо проглядел эту настройку. Ну в любом случае подозрительно, надо посмотреть как будет в динамике скакать между ними.
А не знает ли кто-нибудь способа скрыть меш, оставив глоу от нее?
>Однако, через время мы осознали, что взяли слишком жирный кусок и поняли, что нам стало тяжело и неинтересно. Мы увязли в этом проекте, и он стал напоминать вторую работу, просить очень много времени и приносить минимум веселья. Поэтому мы решили не продолжать. Вместо этого мы стали делать другую игру,
Лол. Сделали самую маленькую (пусть даже и сложную) часть, а как дошло до всей остальной игры - забили. Ай да разрабы.
Подскажите как провода сделать, я могу же сделать кабеля ЛЭП и чтоб таскать их болванчиком по сианции в 3D?
Может это ноды?
https://github.com/RedefineGamedev/Line3D
https://github.com/ApocalypticPhosphorus/Godot-3D-Line-Renderer
Не знаю правда работают ли они в годот 4. А вот тут люди шейдерами делают: https://github.com/godotengine/godot-proposals/issues/6151
Сейчас подумал что можно сделать с помощью скелетон3д. Если надо по станции таскать, то вероятно тебе нужна еще и физика, а не просто графика. Чел тут похожее делает - https://www.youtube.com/watch?v=0AR7RqQ_QzU
А еще можно унаследоваться от майнлупа и подсунуть этот скрипт майнлупу (дефереддом подсовывать). И будет у тебя майнлуп со своими дополнительными методами.
Только в четвёрке с допиленными до ума статиками это уже не нужно.
при чём тут движкосрач, даже в доке годота есть кусок на эту тему, но я не понял написанного, там типа предлагается размещать как-то последовательно текстуры, тогда можно будет рендерить как 1 1 2, но момент с наложением я не понял
А я тоже не понял почему репорт, обычный технический вопрос. С другой стороны, его вопрос я тоже не понял, лол.
На практике бывает - хочу скопировать кусок кода из прошлого проекта. Ну в общем копаться, листать в блокноте tscn которые бывают мегабайтные, с немного съехавшим форматированием - такое себе. Поиск по файлам тоже дольше. Один раз искал в какой папке положил - вот скрипты одной системы, (контроллер персонажа к примеру), вот другой, а нужных нет. Оказалось тоже в сцене был.
По описанию звучит так, что движок при батчинге занимается этим сам, и тебе ничего переставлять не нужно. Или ты про то, как это отключить? Есть проходы (shader next pass), есть Material Overlay.
Но они и нужны когда тебе надо сначала что-то нарисовать, а потом либо постобработать, либо поверх полупрозрачный эффект накинуть (типа силового поля). А в таких случаях это должно быть гарантировано после. Нет никакого смысла покрывать один материал другим непрозрачным - тогда первый вообще не был нужен.
Переупорядочивание относится только к непрозрачным объектам, скорее всего, а благодаря буферу глубины, неважно в каком порядке они рисуются.
да я в целом про оптимизацию, типа как это происходит и зачем об этом пишут, если это делается сорт оф на автомате
Пон, бюлагодарю.
любой серверный язык программирования, но вроде в годоте можно делать локалку, типа один игрок сервер, другие клиенты, в таком случае и гдскрипт будет работать наверно
Все на гдскрипте хуячится.
Игра - по типу Катана Зеро. Двумерная вид сбоку, у врагов есть огнестрел. Пытаюсь понять, какие алгоритмы существуют, чтобы в подобных играх выстраивать пути, но все материалы по 2д фокусируются на виде сверху.
>все материалы по 2д фокусируются на виде сверху
Потому что для топ-даун игр это проще всего реализуется - строишь путь по какому-нибудь A* и двигаешь по точкам болванчика - нехуй думать, в общем-то. Когда уже в дело вступает физика всякая итд - там появляются прочие условия и переменные, поэтому двигать болванчика приходится не настолько прямолинейно.
Беглый поиск конкретно для годо приводит, например, к такому видосу - чел рассказывает про инструменты в самом движке и как это работает (на инглише офк, кто тебе на русском чето объяснять будет)
https://www.youtube.com/watch?v=LKyGdiHzIk8
Покажи код
> (на инглише офк, кто тебе на русском чето объяснять будет)
Яндекс браузер со встроенной нейроозвучкой видосов.
> Сорян за тупой вопрос, просто не понимаю
Вопрос не тупой и описан в статье о стейтмащинах (выше по треду).
Суть в том, что для движения и для стрельбы нужны две стейт-машины.
Нельзя мешать в кучу то, что должно быть одновременно.
Поэтому ты заводишь вторую стейтмашину для стрельбы, вырезаешь из первой всё, что связано со стрельбой и настраиваешь свою логику так, чтобы стейт-машина ходьбы управлялась WASD, а стейт-машина стрельбы управлялась ЛКМ.
Самое интересное начнётся с анимациями. Потому что в анимациях нужно как-то замиксовать несколько стейтов из разных стейт-машин. Как правило это решается через ограничения по скелету.
Окей, спасибо, теперь понял.
>Как правило это решается через ограничения по скелету.
А если скелета нет?
> А если скелета нет?
Тогда подразумевается, двадэ на спрайтщитах? Тогда нужно делать комбинированный узел персонажа из двух и более спрайтов, каждый из которых контролируется своей стейт-машиной.
Например, одна часть - туловище с ногами, контролируется ФСМ движения, вторая - руки и голова, контролируется ФСМ стрельбы.
Я не он, но у меня например 3д с простейшей не-скелетной анимацией, и пока я их проигрываю последовательно, "прыгнуть", "покрутиться". Сделано на AnimationPlayer, где я тупо меняю rotation_y и origin_y. Если бы мне нужно было их замиксовать, как бы тогда эта проблема решалась?
Для мозилы есть? У меня мозила - основной звездолёт. Приходится я.хоромог для переводов держать.
У меня работает фаерфокс + виолентманки + версия клаудфлары https://github.com/ilyhalight/voice-over-translation
a few hours later...
Анонсы, я встроил ноду без отдельного файла-скрипта, брат умер, комп стал сверхновой, где найти деньги на новый комп и пересадку сгоревшей кожи?
>на инглише офк, кто тебе на русском чето объяснять будет
Спасибо за заботу, братюнь, как-нибудь пойму.
В целом видос кое-что прояснил. По крайней мере, указал направление, куда копать.
Спасибо! Добра тебе и успехов! Братишка!
Вот тебе еще пища для ума
path finding in platform game
https://godotengine.org/asset-library/asset/968
https://github.com/smix8/Godot_3D_Navigation_Jump_Links
Я так понимаю идея в том что навигация - это граф, соответственно можно делать все то же самое что обычно. Возможно пометив (даже автоматически) точки где спрыгивать-запрыгивать.
А теперь тож самое, только чтоб все это дело ещё заранее перед тестами прогонялось один раз.
59мс на 10кк атомарных операций не такая уж и разница
Нет ты. Я это вообще с реддита принес.
Есть другое, более подробное: https://www.beep.blog/2024-02-14-gdscript-typing/
>ссыль №1
О! А я ведь искал этот аддон и не нашёл. А оказывается, он просто для тройки был. Жаль. Ну хоть исходники почитаю.
Годаны, а я тут знаете что понял? В четвёрке же добавили тип Callable. Так вот, а ведь с ним гдскриптовые словари полностью повторяют луа-таблицы. Даже лучше, потому что таблица в луа это неловкий гибрид словаря и массива, а в гдскрипте массивы теперь ещё и типизировать можно, джва года ждал.
Так вооот. Теперь можно в словари запихивать не только сложные иерархические структуры, но и целые указатели на функции. И эти функции по этим указателям вызывать. Ну круто же!
Или вот такие штуки:
var arr: Array[Callable]
...
for f in arr:
f.call()
сразу напрашивается применение - сценарии для всяких комплексных процедур, которые так и хочется разбить на части и выполнять не то что в цикле, а по чуть-чуть в _процессе.
Это я к чему. Раньше я мечтал о человеческом луа в годоте (было только не дебагаемое). А получил даже лучше - ещё и возможность статической типизации.
Каеф.
Осталось блочные комментари добавить для полного счастья. Ну типа --[[ такого --]] или / такого /. Или, для соблюдения стиля, как-нибудь |# вот так #|
>сценарии для всяких комплексных процедур, которые так и хочется разбить на части и выполнять не то что в цикле, а по чуть-чуть в _процессе.
Звучит как корутины. В оф доках не нашел, но как понимаю их можно делать на yield
>for f in arr:
>[Callable]
Могут быть накладные расходы, надо тестить.
Сейчас имею такую систему, массив:
y: [x1,x2]
Нахожу количество данных в массиве, а потом рандомлю в полученном диапазоне значение. Шанс x1 50%
Но вот я захотел, что после некоторого события шанс увеличился скажем до 75%. Как мне это грамотнее реализовать?
Пока придумал такую схему, я просто добавляю к массиву ещё x1 до вида y:[x1,x2,x1] да шанс 77% но смысл я думаю понятен
Для такого точно есть и готовые решения и туториалы.
В целом это грамотнее делать словарем, т.е. { x1: 15, x2: 75 }
Похоже на баг. RAW явно отражает 0 ... 255 в 0 ... 1,0.
Т.е. поменяй на 1, 1, 0, 1.
Либо это для поддержки HDR сделано, но в любом случае интерфейс неудачный.
Для гскрипта я не нашел решений хотя особо и не искал, плюс хочется сделать +- самому, чтобы понять принцип работы и нормально встроить в уже готовый json с массивами.
Количество в словаре изначально неизвестно, поэтому вместо % я думаю лучше использовать коэффициент, условно 1
Допустим словарь {x1: 1, x2: 3}. Я беру и рассчитываю массив для генерации, используюя значения из словаря, получится [x1,x2,x2,x2] и рандомлю одно значение из массива. Вполне себе работает. Но если я захочу сделать значение 0,5 или 3,5 то как тогда?
Видел такой вариант (сам им буду пользоваться) - складываешь все веса (1+2+2+2+0.5+3.5), делаешь рандом от этого (11), и в цикле проверяешь. roll < 1? roll < 1+2? roll < 1+2+2?
Догадался до очевидного решения взять тогда коэффициент по стандарту не за 1, а за 100. Какие подводные кроме огромного конечного массива для генерации, насколько тяжело будет компу условно с 10000 элементами в массиве?
Для HDR, да. Raw можно поднимать выше 1, это работает как запланировано, чем выше значение тем заметней HDR эффект. Я просто не могу понять как в raw-формате указать конкретный цвет при условии значений выше единички. Я могу конечно руками подобрать, на глаз, но это такое себе.
Ну попробуй выставить нужный цвет мышкой (получится какой-то 0.96, 0, 0.77), а потом умножить на коэффициент, прямо в окошке инспектора напиши *100
Это другое. Блочными же можно закомментить даже часть строки.
К тому же 4.2 расставляет эти # не в самом начале строки, как это делала тройка, а после табов. И пробел не ставит. Некрасиво.
Некогда особо расписывать. Ну у тебя рандом число может быть float 0..11.0 (сумма всех твоих весов). Значит оно указывает на какой-то диапазон. Диапазон считаешь от нуля. Если не принадлежит первому диапазону, то искать в следующих, если принадлежит, вернуть предмет. Цикл может накапливать сумму весов, не обязательно каждый раз всю пересчитывать, просто прибавлять вес текущего проверяемого предмета.
Теперь понял, неплохой способ, спасибо
Дальше надо придумать, как их размещать. Ну, очевидный тайлмап? Увы нет, тайлмапа хочет плитки одинакового размера, а это привести к одинаковому размеру нереально. Спрайтами используя регионы? Тогда придётся создать дохуя сцен под каждый предмет, чтобы каждый раз не настраивать регион и оффсет.
Я в замешательстве. Годаны, посоветуйте.
Я ее особо в этом шарю, но как вариант можно объединить спрайты только одного размера, и спокойно использовать тайлмап. Тоесть будет не один атлас как сейчас, а условно 10 или сколько у тебя там разных размеров.
> тайлмапа хочет плитки одинакового размера
Может использовать несколько плиток на один большой тайл?
https://www.youtube.com/watch?v=aq2Y6yrxfG4
А вот собственно, на канале из видоса постом выше, погляди старые видосы, он там и за подбираемые предметы поясняет в том числе. Делай скидку на трёшку, подхватывай суть и делай на четвёрке. А если ты на трёшке еще сидишь, так вообще легко будет.
Окей, чекну
> направьте в нужное русло
> Хочу сделать %предмет_нейм% игрок их может подбирать/покупать.
> должны где-то храниться и запоминаться
...и, поскольку ты думаешь о зельях, эти предметы должны применяться на игрока и возможно на других персонажей.
Так вот, направляю в нужное русло. Главный программный паттерн большинства игор - база данных. Это необязательно должна быть большая серьёзная СУБД больших дядь из серьёзного ентерпрайза, нет. Тебе достаточно организовать в памяти словарь с данными и удобные тебе функции создания, чтения, обновления, удаления данных в нём.
Когда у тебя будет действующая база данных в проекте (назовём её "Менеджер предметов", МП) у тебя большинство вопросов само отпадёт. Но допустим, не отпало, давай по шагам распишем события, происходящие с типичной банкой с зельем на локации.
1. Локация загрузилась в память и обратилась к МП, получив список предметов, которые у неё должны быть.
2. У локации есть первоначальный список предметов, с которыми она была изначально запроектирована. Локация сразу удаляет из него все предметы, помеченные как удалённые и удаляет (не даёт им появиться в принципе).
3. Локация проходит по списку из МП и расставляет предметы оттуда, не забывая сверяться с встроенным списком, чтобы не задваивать предметы.
4. Игрок идёт по локации и видит зелье. Зелье это интерактивный предмет, у которого есть действие "подобрать". Это действие выполняет две простейшие операции: создаёт (или обновляет если есть) запись в МП о наличии в инвентаре игрока зелья (если это зелье из списка первоначальных предметов, а не дропнуто игровой логикой ранее, то дополнительно в списке локации помечается как удалённое), и второе - удаляет себя с локации.
5. У зелья так же может быть действие "применить" которое минуя работу с МП сразу передаёт игроку свои параметры и самоуничтожается (с записью в локации, если оно первоначальное).
6. У игрока есть инвентарь. Инвентарь состоит из двух частей: визуальной и логической. Визуальная часть - управляет картинками, перетаскиваемыми по гриду или листбоксу. Логическая часть, как и у локации, взаимодействует с МП, чтобы создавать, читать, обновлять и удалять данные в МП, относящиеся к инвентарю игрока.
7. Запись в МП о зелье должна аналогично интерактивному предмету на локации обладать функцией "применить", при которой запись обновляется в минус-один или удаляется если достигает нуля. И при этом передаёт классу игрока некие параметры. +10 ХП например.
Воот как-то так.
> направьте в нужное русло
> Хочу сделать %предмет_нейм% игрок их может подбирать/покупать.
> должны где-то храниться и запоминаться
...и, поскольку ты думаешь о зельях, эти предметы должны применяться на игрока и возможно на других персонажей.
Так вот, направляю в нужное русло. Главный программный паттерн большинства игор - база данных. Это необязательно должна быть большая серьёзная СУБД больших дядь из серьёзного ентерпрайза, нет. Тебе достаточно организовать в памяти словарь с данными и удобные тебе функции создания, чтения, обновления, удаления данных в нём.
Когда у тебя будет действующая база данных в проекте (назовём её "Менеджер предметов", МП) у тебя большинство вопросов само отпадёт. Но допустим, не отпало, давай по шагам распишем события, происходящие с типичной банкой с зельем на локации.
1. Локация загрузилась в память и обратилась к МП, получив список предметов, которые у неё должны быть.
2. У локации есть первоначальный список предметов, с которыми она была изначально запроектирована. Локация сразу удаляет из него все предметы, помеченные как удалённые и удаляет (не даёт им появиться в принципе).
3. Локация проходит по списку из МП и расставляет предметы оттуда, не забывая сверяться с встроенным списком, чтобы не задваивать предметы.
4. Игрок идёт по локации и видит зелье. Зелье это интерактивный предмет, у которого есть действие "подобрать". Это действие выполняет две простейшие операции: создаёт (или обновляет если есть) запись в МП о наличии в инвентаре игрока зелья (если это зелье из списка первоначальных предметов, а не дропнуто игровой логикой ранее, то дополнительно в списке локации помечается как удалённое), и второе - удаляет себя с локации.
5. У зелья так же может быть действие "применить" которое минуя работу с МП сразу передаёт игроку свои параметры и самоуничтожается (с записью в локации, если оно первоначальное).
6. У игрока есть инвентарь. Инвентарь состоит из двух частей: визуальной и логической. Визуальная часть - управляет картинками, перетаскиваемыми по гриду или листбоксу. Логическая часть, как и у локации, взаимодействует с МП, чтобы создавать, читать, обновлять и удалять данные в МП, относящиеся к инвентарю игрока.
7. Запись в МП о зелье должна аналогично интерактивному предмету на локации обладать функцией "применить", при которой запись обновляется в минус-один или удаляется если достигает нуля. И при этом передаёт классу игрока некие параметры. +10 ХП например.
Воот как-то так.
Огромное спасибо, анон.
Зарплату 20к в месяц плати.
Это законно ваще?