24 декабря Архивач восстановлен после серьёзной аварии. К сожалению, значительная часть сохранённых изображений и видео была потеряна. Подробности случившегося. Мы призываем всех неравнодушных помочь нам с восстановлением утраченного контента!
Годнота от анона - Для приверженцев опенсорца существует возможность распространять проекты в незапакованном формате. Просто скачай темплейт с оф.сайта и положи экзешник/эльфешник в папку с проектом, этого достаточно. Имя файлу можно задать любое. Дополнительно можешь вшить свою иконку в экзешник. После этого, запустившийся файл темплейта обнаружит рядом с собой файл project.godot и начнет грузить проект из него и из файлов, лежащих в распакованном виде в той же директории. Для запущенного таким образом проекта папка res:// становится доступна для записи (если это не ограничено правами доступа в системе). - В версии 3.2 появилась возможность прикреплять pck к бинарнику. Бриллиант для любителей однофайлового продукта! - Редактор персонажей на основе makehuman: https://github.com/Lexpartizan/Go_MakeHuman_dot - Тест-бенчмарк: - - Веб-версия - https://govdot.herokuapp.com - - Вишмастер для винды - https://govdot.herokuapp.com/4Anon.rar
>>734420 (OP) И первый платиновый вопрос треда. Когда я добавляю объект в сцену, то он появляется в нулевой отметки xy. И, когда я пытаюсь его перетащить, то либо цепляю другие объекты, либо куски моего объекта, например только спрайт или только коллижншейп. Как мне удобно и нормально перетаскивать сразу весь объект не цепляя при этом другие вокруг?
Продолжаем платиновые вопросы. Сделал я animationPlayer, запихнул туда анимацию ходьбы в разные стороны, настроил скорость и прочие параметры. Запустил - отлично работает, скорость настроена. Затем сделал animationTree, там blendSpace2D, запихнул туда анимацию для удобства. А эта хуевина проигрывает скорость анимации по своим стандартным параметрам, не учитывая настройки скорости в animationPlayer. Как фиксить?
>>734457 Алсо, в инете тоже не вижу решения пиздец нахуй элементарная же вещь. Если решения нет, то как реализовать тогда в коде смену направлений от градусов?
Привет годаны, у меня опять вопрос. Скачал пример игры, написанной на С# скрипта в примере все работает отлично, но когда я пытаюсь повторить у меня получаются проблемы с нажатием клавишь, например не работает только нажатие клавиши или сигнал на опускание клавиши, пример - прыжок, нажимаю пробел и он работает через раз, нажемаю бежать и пробел и он срабатывает только через некоторое время. Та же беда с мышью, она вообще не работает, ни правый ни левый клик. Я назначал клавиши через внутренние методы Шарпа(принудительное нажатие клавишь и прямое нажатие указанных клавишь) и нет я не забыл назначить клавиши в своём редакторе, все указал, но они работают через раз. Я прочитал посты из предыдущего треда о подобной проблеме и нет с кодом все нормально он почти одинаковый немного переработанный, возможно опять, что в движке не нажал. Насчёт контролов я не совсем понял, что там перекрывает? И да я заметил в некоторых примерах управления персонажей задают годов скриптом, а процедурные вещи, например уровни или объекты пишут на шарпе.
>>734564 Он мне понятен и прятен. Я правда пытался освоить гд скрипт, но постоянный контроль отступов и пробелов вымораживают >>734570 Спасибо, попробую >>734571 Понял, но пока это не возможно. Пишу на работе, дома до конца месяца проблемы с инетом, только офлайн.
На самом деле даже того, что я уже достиг в этом движке значительно перекрывает все то что я делал раньше, надеюсь хотя бы эту игру довести до запланированного конца и вправду душевный двиг, надо было изначально на годот вкатываться столько времени потерял.
Появляется ошибка после срабатывания queue_free() Invalid get index 'position' (on base: 'Nil'). при попытке вычислить свою position на следующей итерации. Разве queue_free() не удаляет весь узел? Почему после queue_free() Годот пытается вызвать позицию удаленного узла?
>>735092 Кью потому и называется кью, а не фри, потому что только ставит в очередь на удаление. Само удаление происходит только между текущим и следующим кадром, потому что иначе в с++ кишках может быть еще ссылка на объект, скажем в системе физики,
Решил проблему с несрабатыванием прыжка, нужно было в редакторе поднять коллайдер коллизий у персонажа (если я правильно назвал) выше, у меня он был наполовину опущен в плоскость пола. Начала работать мышь, но по прежнему игрок или берет предмет, но не кидает его, или не берет предмет, но может пнуть его. Думаю проблема в состоянии персонажа, когда срабатывает булевое условие в руках или на земле плюс подозреваю что опять что то неправильно в редакторе настроил для персонажа.
>>734420 (OP) Так, ну AnimationTree меня нахуй послало с тонкой настройкой анимации. И тогда вопрос: Как мне сделать так, что бы в топ даун игре с четырьмя направлениями враг смотрел в сторону героя? У меня есть четыре анимации ходьбы в четыре стороны соответственно. Но передвижение свободное, то есть, спрайт врага должен меняться от угла по направлению гг
>>735480 алсо, пробовал (direction.global_position.x - global_position.x) > (direction.global_position.y - global_position.y), но персонажа чет ебобить начинает в разные стороны
>>735351 Решил проблему с броском и поднием предметов. Короче все дело в райкасте, у меня в сцене он был направлен в землю, а не в направлении взгляда модели, как и думал накосячил в редакторе, а не в коде. Кстати зря я на шарп гнал, он корректно работает. Сейчас планируют разобраться с поворотом модели, пока по клавишам и добавить анимации, в будущем планируют поворот модели с помощью мыши.
>>735881 Можно и на дуде звук жопой сыграть, только зачем если есть рот? По отдельности рот, жопа и дуда отлично справляются со своими задачами. Так же как годо и шарп, но вот совмещать - это специальная олимпиада.
>>735948 Ну я уже, в демку поиграл, запускалась минут 5, проект создался за несколько минут. В принципе ничего не лагает и всё работает. Вкатываюсь через вот этого челика https://www.youtube.com/watch?v=Mc13Z2gboEk , всё правильно делаю?
>>736170 Есть, как это у чего-то может не быть недостатков? Но к чему этот разговор? Ты смотришь на возможности и решаешь, хватает или не хватает для твоей игры. https://www.youtube.com/watch?v=SEMhbujdxis
Привет, годаны! Как вы тут? С осени не заходил, так как игори не пилю нынче. Что нового? Трёшка всё продолжает вариться в RC, я смотрю. Кто-нибудь из треда зарелизил игру мечты?
>>737032 Есть сигнал animation finished Также можно прямо из анимации дергать любые функции, специальный вид трека есть. Можно тупо в process() смотреть какой сейчас кадр.
Попробовал Godot. GScript медленный, поэтому пробовать его не стал. Попробовал godot-nim, он работает, но без лайв кодинга и документации и туториалов почти нет. gdnim не получилось запустить. Какие другие языки программирования попробовать, желательно с лайв кодингом? C/C++ знаю, но несколько страшно их из-за нестабильности использовать. Rust сложнее C/C++ во многих случаях и компилится часами. Java мне не очень нравится синтаксисом. C# зачем в Godot, eсли есть Unity!? Nim был бы киллер-фичей Godot по сравнению с Unity.
>>737052 Действительно, нахуй они шарп имплементировали, а не на никому неизвестном говне? Бля, да надо было Lisp или D хуячить, а может бреинфак? С такими киллер-фичами прям завтра в мейнстрим вырвемся.
>>737052 Не выёбывайся и изучи лайв кодинг на гдскрипте. Потом как постигнешь объектную модель движка, сможешь с лёгкостью хоть на ним, хоть на раст перекатиться. Как раз поддержку этого твоего ним к тому времени допилят.
>>737052 >GScript медленный, поэтому пробовать его не стал. Какой жанр игры? Шанс, что тебе не хватит GDScript для первых игр, практически нулевой. Это может вылезти только если у тебя что-то уровня факторио или ноиты, или ты собираешься вершины моделек или текстуры каждый кадр перехерачивать. >C/C++ знаю, но несколько страшно их из-за нестабильности использовать. И правильно. >C# зачем в Godot Чтобы написать код на C# который быстро работает, а при необходимости перенести его почти слово в слово в с++ >Rust Попробуй https://github.com/JustinRyanH/godot-zig шучу
>>737088 > Какой жанр игры? У меня есть большие сомнения насчёт реальности его игры. Ящитаю это позавчерашний залетух-движкосрачер от бана откис и теперь зашёл более тонко срач устраивать.
Всем годотерам привет. Вкатился в движок пару месяцев назад, пытаюсь сделать что-то простенькое, но есть вопрос по мультиплееру, я не понимаю как его реализовать. Попробовал через веб сокеты, серверную часть написал на python, и пытаюсь от Годо подключиться. Вроде через .connect_to_url() подключение проходит (появляется сообщение о подключении на сервере), но при этом данные не отправляются ни с сервера, ни из подключенного устройства.
>>737362 Кстати, когда пишу код клиента на том же python, то сервер с ним взаимодействует нормально. Может ли быть проблема в том, что клиент должен быть написан на том же языке, что и сервер?
>>737363 > Может ли быть проблема в том, что клиент должен быть написан на том же языке, что и сервер? Нет, не может. Клиент-серверная технология и создавалась для того чтобы не ограничивать клиент и сервер в выборе языков. Внимательнее разбирайся. Неплохо бы код твой глянуть.
>>734420 (OP) Мне нужно сделать действие, когда наступает определенный кадр анимации. Но код почему-то не срабатывает. Делаю через curren_animation_positionю. Что не так?
>>737845 Проще всего в саму анимацию запихнуть трек вызова метода. Но если хочешь именно кодом, то скорее всего переменная никогда не достигает значения ровно 0.6. Тогла тебе поможет апроксимация к коэффициенту точности: var phi = 0.55 # naprimer if abs(current - 0.6) < phi: print("tvoia kiska v zone puska")
>>734420 (OP) Сап годач. Есть одна проблемка. Предположим у меня есть враг с анимацией атаки в три кадра в четыре разные стороны. Атакаует он в сторону игрока. Но, если игрок начинает кружить вокруг врага, то враг естественно запускает анимацию атаки по новой в каждую сторону. И так его можно закрутить не доводя атаку врага до конца. И мне нужно, чтобы при изменении позиции игрока менялась анимация но с того кадра, который был у предыдущей анимации. Например два кадра в одну, а в другую сторону атака уже с тертьего кадра. Проблема в том, что я не врубаюсь как мне правильно запихнуть переменную, которая сохраняет текущий фрейм, чтобы она фиксировала позицию до изменения, а потом сбрасывалась, а еще какой именно командой запустить анимацию с определенного кадра
>>737992 Просто сделай атаку в развороте. Вариант слева-направо и второй вариант наоборот. Соответственно, если враг разворачивается в атаке, у него стейтмашина переключает анимацию в разворот (с блендингом) и в дальнейшем стало быть спрайт уже развернут в новое положение. И не надо никакие фреймы запоминать. Искури матчасть по блендспейсам.
>>737995 Я не пользуюсь стейтмашиной, потому что она не дает тонко настроить скорость анимации для разных фреймов, как это делает animationplayer (как же это тупо пиздец). Так что я делаю через код все.
Вопрос на миллиард. Где взять фоновую ненавязчивую музыку для игоря? С эффектами разобрался, а с музыкой хз. Могу указать автора взятой музыки, но доход с продаж лол хочу грести себе, ни с кем не делясь. Значит нужна музыка с максимально пермиссивной лицензией, позволяющей продавать-перепродавать и всю хуйню.
>>738190 Это общий вопрос? Потому что чтобы в экспорте годот-игры "вшить" ресурсы (методом ражпега, то есть приписыванием в конец) - это ещё поебаться надо. И движок опенсорсный, а это значит, там в экспорте не только шиндовое ехе.
Чтобы ресурсы были отдельно - описано в оп-посте: >>734420 (OP) > Для приверженцев опенсорца существует возможность распространять проекты в незапакованном формате. Просто скачай темплейт с оф.сайта и положи экзешник/эльфешник в папку с проектом, этого достаточно. Имя файлу можно задать любое. Дополнительно можешь вшить свою иконку в экзешник. После этого, запустившийся файл темплейта обнаружит рядом с собой файл project.godot и начнет грузить проект из него и из файлов, лежащих в распакованном виде в той же директории. Для запущенного таким образом проекта папка res:// становится доступна для записи (если это не ограничено правами доступа в системе).
>>738844 > Есть еще подобное с упором на архитектуру? Может даже и нет. Потому что известные на слуху каналы, типа KidsCanCode, GDQuest, GameEndeavour у них без упора на архитектуру, как я заметил.
Как законнектить сигнал к узлу, которого пока нет? У меня две сцены: типа лобби и арена. В лобби ты выбираешь бойца, на арене он дерется другими бойцами. Имя победителя сохраняется в синглтоне, в процессе скрипта арены боец с именем победителя коннектится к функции с change_scene. На второй или третий запуск сцены арены появляется ошибка >Attempt to call function 'disconnect' in base 'null instance' on a null instance.
>>739150 E 0:00:03.166 emit_signal: Error calling method from signal 'no_bodies': 'Node2D(Arena.gd)::_on_no_bodies': Method not found.. <Исходный код C++>core/object.cpp:1260 @ emit_signal() <Трассировка стека>BodyDetector.gd:12 @ _process()
>>739150 У тебя ошибка в disconnect. Потому что ты сначала обнуляешь имя. Потом по пустому имени ищешь ноду, а это всегда вернет null Потом у null вызыаешь disconnect. Переставь первые две сточки в on winner defined
>>739149 > Как законнектить сигнал к узлу, которого пока нет? > У меня две сцены: типа лобби и арена. Коннекти сигналы в динамическом узле. Допустим узел арена динамически создаётся. Вот в нём и коннектись. При создании арены все сигналы законнектятся, при уничтожении расконнектятся.
>>739150 А ещё можно вот так. > var registrator = ySort # Vasche! > var sender = registrator.get_node(Global.winners_name) > var receiver = registrator.get_node(Global.utils) > if sender and receiver: receiver.connect("winner", receiver, "_on_winner_defined", [sender]) Ну що? Порвало шаблон?
Сендер в скобачках ещё и прилетит в колбэк аргументом (по ссылке, разумеется), благодаря чему, если сендеров несколько, ресивер, выполняя колбэк будет иметь доступ к конкретному сендеру.
>>739149 Почему бы не сделать сцену-родителя, которая будет держать лобби и арену, управлять их переходами и хранить общие для них данные (то же имя победителя)?
>>739201 Да ну, эт придется диз-док писать, проектировать приложение, блок-схемы там всякие рисовать, что откуда выходит и куда заходит. Нет времени! Надо игоры делать!
Анончики, поясните за прозрачность в годоте. Хочу сделать стекла, они они очень сильно дропают кадры. Еще видны артефакты в виде ребер. Можно ли это как то оптимизировать\исправить? В материале в флагах выставил tranparent и установил альфу в альбедо.
>>739560 Бро, моё мнение таково: надо делать игру, а не кинцо. У тебя заморочки уровня "почему кинцо не фотореалистичное?". Без обид, бро, но у тебя там геймплей будет вообще? Или игроку будет предложено на полупрозрачные стёкла смотреть ходить?
>>739564 Блять, я про прозрачность спросил и как сделать так, чтобы она не выдавала 20 кадров на 1060, а не про реализацию интересного геймплея в годоте. Как же вы заебали со своей необходимостью делать только аркадную 2д парашу на этом движке. Дайте поэксперементировать с графикой и поклепать демо-сцены. Без обид, бро, сорвался.
>>739560 Вдогонку: я предполагаю, что стекла у тебя сделаны отдельными объектами. Если же это часть меша - не помешает проверть в первую очередь, будет ли фреймрейт дропаться так же сильно, если сделаешь стекла как тупо плоскости + отдельный материал(ы) с собственными текстурами.
>>734420 (OP) Сап, годаны. Хочу попробовать годот. Вчера скачал билд под винду, скачал Third-Person Shooter Demo, запустил. Оно начало кушать 90% видюхи (2060), это из-за отсутствия всинка? И начало лагать при запуске прожектайлов. Это проблемы с графоном или питону настолько тяжело аллоцировать объекты? Или это просто кривая демка? Подскажите, а то как-то мотивации поубавилось к изучению.
>>739666 Я прошу прощения, не срача ради. Просто уже кучу всего перепробовал, немного подустал от монструозности старших братьев, а писать всё с нуля на каком-нибудь Haxe, конечно, интересно, но очень долго.
>>734420 (OP) Годошнички, подскажите трудно ли на вашем движке сделать механику на подобии Super Tennis Blast? Взял её в пример из за мультяшной графики, а так мне нужно знать именно про игру в большой теннис Особенно если ты ноль в программировании, но уперт как баран.
>>739778 Зависит от прямоты рук. Убить фреймрейт ты на любом движке можешь, расценивай >>739750 как иронию.
>>739727 >ноль в программировании Тогда будет трудно, как и везде. Без кода ты игру - полноценную игру - не напишешь. Синтаксис у gdscript несложный доки написаны хорошо понятно (на английском, по крайней мере, вроде на русский переведены, но я не чииал) -- освоение языка и особенностей движка не должно составить таких уж больших проблем.
А вообще, не верь на слово и посмотри сам где лично тебе работать приятнее: попробуй создать схожие проекты-прототипы на всех трех движках и сделай выводы самостоятельно. Если потом вернешься и рассксжешь что как - плюс тебе в карму.
>>739782 >Что такое "полноценная" игра? В первую очередь, это игра, где ты не ограничиваешь себя в идеях. Как придумал, так и сделал. А не "то я не умею, это не знаю как, поэтому давайте сделаем визуальную новеллу".
>>739781 Спасибо за комментарий! Вчера ночью решил идти от самого легкого, и посмотреть кто создавал уже похожие проекты на этом движке. Может плохо искал, но найти аналог того что я ищу, так и не смог. Кроме первого пика в 2d По задумке мне нужно 3d поле, на котором будут анимированные 2d персонажи.
Странно что мои 2 поста на которых ты ответил удалили, хотя я не пытался развести срач, а просто задать интересующий меня вопрос.
>>739812 >По задумке мне нужно 3d поле, на котором будут анимированные 2d персонажи. Почему не отредерить 3д поле в 2д картинку и просто подставить раз персонажи 2д уже?
>>739727 Аркадный теннис без программирования я б сделал так - нарисовал пару 2d path кривых, одна для вертикального профиля полета и 1 для закрутки мяча. И затюнить для разных видов ударов. Сила удара будет влиять на масштаб кривых. Минимум кодинга понадобится для проверки столкновений и переноса точки откуда начинается кривая. Для мультяшных игроков проще взять 3д модельки и кинуть им toon shader
>>739868 >нарисовал пару 2d path кривых, одна для вертикального профиля полета и 1 для закрутки мяча. И затюнить для разных видов ударов. Сила удара будет влиять на масштаб кривых. Ничего не понял. Но идея интересная. >проще взять 3д модельки Но не проще сделать. С 3d я не особо, а 2d спрайты осилю.
Блять, у меня возникла ебанутая проблема. Почему-то при столкновении collision shape героя с collision shape тайлмапы, у меня сдвигаются на пиксель-два спрайты других объектов. При чем в зависимости от какой стороны столкновение (справа, сдева, внизу, сверху - это топдаун) двигаются разные спрайты. Раньше такого не было. Я вообще не врубаюсь что происходит
Если мне нужен поцфайндинг по клеточкам, там есть какие-то встроенные функции для этого, или проще астар с нуля написать? Я знаю, что есть Navigation2D, но это для произвольных прогулок по навмешу, как я понял.
>>739910 Не, там двигаются даже те объекты, к оторых нет формы. Пробовал играться с формами самого игрока. Выяснил, что сдвиг более виден, когда форма более округлая. Пытался загуглить, но нашел лишь отдаленно похожие проблемы
>>739910 >>739898 >>739911 Еще заметил, что если сталкивается округлая форма с округлой, то норм. В принципе, я мог бы всем сделать округлые формы, но я не могу сделать круглые формы тайлмапе
Вот допустим у меня есть BitmapFont который я хочу применить ко всем наследникам Control на сцене, чтобы для каждого не создавать скрипт с add_font_override. Как этого добиться?
>>739941 Шрифт или тема, назначенная любому контролу, распространяется и на все дерево контролов под ним. На пике шрифт ноды control будет распространяться и на label
>>739915 Обратите внимание, как дергаются вещи. Уточню, я не просто зажимаю кнопку движения, а часто ее жму, чтобы было более видно подергивание. Если просто зажать, то это произойдет два раза - при столкновении и когда я отпущу кнопку движения
>>739942 Не уверен что это работает когда заменяешь шрифт в рантайме, с помощью функции add_font_override(). У меня по крайней мере не получилось, если что в _ready() засовывал.
>>739945 А, все, разобрался. Нахуй рантайм, BitmapFont-объект можно в .tres сохранить с помощью ResourceSaver и потом просто как нормальный шрифт вставить в редакторе.
>>739944 Я не 100% уверен, но возможно это из за того, что у тебя объекты стоят не в целых пиксельных координатах. Вот например на этом видео стенки слева стоят по snap, т.е. 100, 200, 300, а справа стоят как попало, 599.056, 398.112, и при движении камеры левые двигаются в ногу, а правые не в ногу. Если это оно, то надо или расставить объекты с включенным snap в редакторе, или погуглить как делается сабпиксельная камера, чет там через вьюпорты и скейлинг (2д мало занимаюсь так что не помню, но где то читал)
>>739960 >>739953 Бля не, помогло, но не до конца. Если игрок сталкивается сразу с двумя рядом стоящими формами, то объекты все равно смещаются. Надо будет пробовать делать сабпиксельную камеру
>>739981 Супер простым. Это пока просто болванка, чтобы тестить. Алсо, у меня почему-то не все объекты встают в пиксельную сетку... Начал гуглить, нашел похожие случаи, но пока не пофиксил. Проблема судя по всему распространенная ну и говно как же у меня горит
Замоделил поле по туториалу, и возник ещё вопрос. Мне нужно будет кроме игры в теннис создать vn вставки, для чего я установил аддон Rakugo VN. Проблем особых не возникнет?
>>740014 > Мне нужно будет кроме игры в теннис создать vn вставки, для чего я установил аддон Rakugo VN Там ещё в прошлом треде презентовали аддон Dialogic который весьма полноценно реализует диалоги в ВН-стиле (иконка персонажа с вариантами эмоций, текстовое поле с кнопкой скипа, отдельные кнопки вариантов при вопросе, эффекты, стили, шрифты, всё фкаропке), без всего остального ВН-функционала (типа кучи ренпаевских кнопок внизу, сохранений, загрузок, отматываний-проматываний). Если твои "VN вставки" - это по факту диалоги, то может быть лучше его задействовать?
>>740052 >Dialogic Посмотрел, с первого взгляда выглядит как хорошая альтернатива. >Если твои "VN вставки" - это по факту диалоги, то может быть лучше его задействовать? По сути нет. VN-сцены будут лакомкой, а теннис как мини-игра.
Есть некроноут с Хрюшей. Версия 3.2.3 - все норм работает, новая 3.3 помирает при компиляции шейдеров на этапе запуска редактора. Кто-то еще пробовал запускать на некро железе/ОС новую версию?
>>740352 Никогда не имел дело с фронтендом, но если это хоть немного похоже на программирование UI здесь, то теперь мне понятно почему фронт все ненавидят.
>>740438 > логику к ним писать - полный пиздец В смысле? В чём конкретно пиздец? У меня проблем не вызывает. Просто вызываешь обработчики событий (сигналов) как везде.
>>740438 Кстати, наверно у меня не возникает проблем опять же из-за опыта кодинга оконных приложений (фронтенда по современному). Сразу могу дать совет, который работал ещё в нулевых с различными IDE: Обработчик сигнала не должен содержать в себе сложного длинного кода. Обработчик сигнала должен вызывать метод из игровой логики.
Простой пример. Есть пункт "сохранить" в меню, а есть клавиша F5 на клавиатуре. У пункта меню (кнопки) обработчик сигнала "нажато", у кнопки F5 привязано действие в меню действий. Которое обрабатывается колбэком _input, в обоих случаях тебе нужно сослаться на один общий метод сохранения игры (Например, save_game в каком-нибудь Global). Не будешь же ты два раза копипастить логику сохранений? И вот в обработчике кнопки ты пишешь > func on_save_game_pressed(): Global.save_game() а в кейсе F5, в инпуте, ты пишешь > func _input(e): > if Input.is_action_pressed("quick_save"): Global.save_game("quick.save") Ну а в самом методе save_game параметр по умолчанию пустая строка, и если вызвать без параметров, он вызывает меню ручного сохранения, если же указать параметр, то сразу без вызова меню сохранит с указанным именем файл.
То есть, как видишь, обработчик сигнала элемента интерфейса записан в одну строку, ты пишешь его один раз и больше туда не лезешь. Если вдруг у тебя возник соблазн добавить вторую строку - значит ты ду ит вронг. Поразмысли над архитектурой проекта ещё раз. Добавь аргумент в вызываемый метод из игровой логики.
>>740438 Обобщай, делай свои контролы. Например если у тебя однотипные кнопки, например хотбар абилок или инвентарь, нет нужды писать обработчик доя каждой кнопки, можно передавать номер кнопки параметром в сигнал button.connect("pressed", self, "on_pressed", [btn_name]) Многоуровневые меню и навигация по экранам кстати неплохо описываются конечным автоматом (fsm)
>>740440 У меня не то чтобы есть проблемы его сделать. Просто его надо дико заранее планировать перед реализацией и все должно иметь очень-очень четкую структуру иначе баги полезут изо всех щелей, приходится 10 раз все перепроверять. Ну и тут еще перфекционизм не помогает, все эти обновления интерфейса хочется максимально оптимизировать, потому что они происходят при малейшем движении, но тогда код становится менее читаемым. За лайфхак с общими методами спасибо, хоть я и так уже это делаю.
В общем, я долгое время хотел создать RPG про роботов, пингвинов, чертей, обувь, шляпы и мяту, и сегодня пожалуй не начну этого делать. В этом треде буду отписываться о результатах. Сразу скажу, что я нихрена не умею, кроме как созывать анончиков собраться вместе и запилить мне игру, поэтому не буду учиться большинству необходимых вещей с нуля. В качестве языка для разработки выбрал ГДСкрипт + Сишарп. Посмотрим, как у меня выйдет собрать вас, анончиков, в команду.
>>741077 gdscript поначалу (после решетки) непривычен, но довольно удобен, да и заточен под движок; плюс все примеры и большинство вопросов-ответов гуглится на нем. Решетку прикрутили не так давно, поэтому думать и адаптироваться придется больше. Я бы посоветовал для всякой мелочевки (нажатия кнопок, обработка ввода, триггеры на сцене) использовать gdscript, а если потребуется класс с большой и сложной логикой - взять решетку.
Эх, блин, нашел танчики, которые делал еще на версии 2.1.4. Коллизия снарядов как-то через жопу работала, почему-то при попадании в угол кирпича они его не ломали, так и не нашел тогда, почему.
>>741426 Так. Ты при импорте модели получаешь ту же структуру, как в блендере. То есть, если у тебя модель домика деревянного с отдельно замоделированными и заанимированными курьими ножками, то у тебя и в годоте будет импортирована сцена с отдельными мешами домика, ножек, крыши, окон. И анимации блендера сконвертируются в анимационный плеер годота. >>741396 Сорян, не подскажу по данному вопросу.
>>735946 >>741442 И тем более летает GameMaker: Studio 1, но увы он уже не поддерживается да и велосипедить на нем заебало, слишком мало там всего из коробки.
>>741426 Можно и так сказать, конечно. Моделька, если обобщить, это набор вершин (mesh), возможно анимация к ним, и текстуры/материалы. В годоте у тебя есть сцена, где ты размещаешь разные объекты. Так вот, это могут быть: 1) модельки из блендера (и не только) 2) просто какие-то формы, типа кубов, цилиндров. 3) CSG, геометрия основанная на сложении-вычитании форм - пикрил видео, моделька ружья в Holer сделана буквально за 3 минуты прямо в движке. Есть плагин, который позволяет сделать экспорт в obj, если вдруг надо. 4) Ну и наконец, mesh ты можешь процедурно генерить на лету. Буквально добавляя вершины или двигая их. Координаты высчитывая по каким-нибудь формулам. 5) Еще один способ - шейдеры. В таком случае визуал тоже создается по некой математике, задавая вершины, и потом раскрашивая поверхности между ними. Например, можно запилить что то подобное пик 2 - там нет моделек, все рассчитано по формулам. Также в игре понадобятся объекты столкновений, в общем коллайдеры. Их можно создавать на основе моделек, или просто окружать модельку невидимым кубом или цилиндром для простоты.
>>741736 Берешь несколько маленьких, каждый в своей сцене, грузишь их в фоне как чанки по клеточной сетке. Для больших расстояний можно сделать лоуполи модель. Дальше надо будет оптимизировать деревья, траву, скалы и прочее. В ассет сторе есть некоторые инструменты для такого. LOD, Octo imposters, всякие шейдеры для травы. Может через недельку буду посвободнее и попробую собрать что-то наглядное.
>>741937 Делаешь чанки "внахлест", чтобы они перекрывались небольшой полосой, и переносишь редактированные пиксели из правого края левой карты высот в левый край правой. Или редактируешь всю карту в каком нибудь блендере. Или карту высот в фотошопе. А потом экспортируешь и нарезаешь на тайлы.
>>741940 >>переносишь редактированные пиксели из правого края левой карты высот в левый край правой Будут слишком резкие перепады высот. К примеру если на левом чанке крайняя вершина на 100 высоте, а на правом так получилось на глазок что крайняя вершина на 40 высоте - то их никак нормально не состыковать... Ну можно сгладить - искажая при этом половину чанка из-за чего все тоже попортится. Пикча. Тут даже дело не в том как состыковать - я надеялся что есть что-то нормальное чтобы вообще таких проблем не было (как в других движках) - оказалось что нет
И в блендере нельзя нормально оценить как на этом ландшафте будет стоять декор. А ведь ландшафт подстраивается под декор - тут ямка, тут площадка под дом, там насыпь, там дорога, там русло реки и т.д.
Или всю локацию вообще в блендере собирать?
Официальный ответ Службы ПоддержкиАнонимOP09/05/21 Вск 22:02:02#216№742018
>>741736 > как сделать гиганский ландшафт в несколько км? Путём фултаймовой работы команды 20-50 профессионалов. Самый короткий гайд, но это правда. Пройди через все стадии принятия неизбежного и прими это: опенворлд в соло (да на чистом, быстро перегорающем энтузиазме) не запилишь. Ты давай смотри на вещи реально. В соло ты можешь сделать несколько камерных сцен и телепортировать персонажа игрока между ними по мере продвижения сюжета. Сюжета. Хоспаде, пишу об играх, как о кинце. Геймплей не забудь тоже. Игра должна играться. Ходить по пустому опенворлду - это не игра. А в соло у тебя будет пустой опенворлд. Прими. Это. Ах да, чанки, чанки будут у тебя быстро и технично грузиться. Пустые чанки пустого террейна.
>>742032 Про процедурные генераторы кто-то сказал (а я запомнил): "хоть карта и бесконечна, строящий ее алгоритм вполне себе конечный, а потому легко распознается человеком через небольшое время". Глянь тот же майнкрафт: если ты видел биом равнин один раз -- ты, считай, видел все его вариации; от того, что генератор выдаст тебе десять-сто-тысячу этих "различных" равнин, интереснее игра не станет.
Очевидно, помимо генератора местности еще понадобятся ассеты -- модельки, текстуры, шаблонные структуры для генератора (см. постройки в майне), готовые неписи, шаблоны скриптов/событий на локациях и прочее, прочее, прочее. А это огромные времязатраты, если делать качественно.
>>742056 Ну. Если посмотреть на всякие фракталы, то иногда простые правила могут давать довольно сложные результаты. Тот же набор мандельброта. Если настроить процедурность для ассетов и отсеять все неинтересное нейросеточками, то можно чет и сделать имхо.
>>742018 >Путём фултаймовой работы команды 20-50 профессионалов. Террейн в 1км можно в одиночку сделать и многие делают.
Я раньше думал что в годоте есть хоть какие-то инструменты для террейна. Оказалось что ничего нет. Даже для простой минимальной локации
>>742018 >ними по мере продвижения сюжета. Сюжета Есть много разных жанров. Не будь ограничен. Есть игры, в которых нет никакого сюжета. Даже есть игры с минимальным геймплеем. Есть игры просто на исследование местности.
>>742018 >Путём фултаймовой работы команды 20-50 профессионало Вон The First Tree делал один разработчик >>Созданием игры занимался Дэвид Вейл, будучи не имея какого либо опыта программирования и разработки видео-игр
Так и весь вопрос - как сделать такой же ландшафт как там. Ведь его там делала не команда в 50 профи. А всео лишь один человек.
>>742061 >процедурность для ассетов >>742062 >Генерируй Чтобы генерировать - нужно написать, проверить и исправить код. Процедурность ассетов - это не модельки из воздуха, а результат работы. Возможно, даже большей работы, чем создание тех же условных моделек в блендере. Да, легко можно написать генератор, который будет выдавать 10^n уникальных однообразных моделек, а толку? Ты потратишь меньше времени на создание пяти (десяти) в редакторе, а результат будет тот же.
Я не говорю, что процедурность - херня, вовсе нет. Однако создание хорошего пула карт на рандоме -- это очень дорогая в плане времени/усилий штука
>>742078 >Террейн в 1км можно в одиночку сделать и многие делают. Террейн - да. А локацию? Непустой уровень, на котором есть чем заняться десять-пятнадцать часов?
>инструменты для террейна Что ты имеешь в виду? Какие инструменты тебе нужны?
>Есть много разных жанров. Не будь ограничен Я походу ограниченный человек. Я предпочитаю игры, которые предлагают игроку какие-то занятия, дают возможность интересно провести время. Да, захватывающий сюжет необязателен. Да, геймплей может быть минимален. Но игру на исследование однообразной рандомной местности без сюжета и геймплея я бы дропнул менее чем за час, потому что удовольствия никакого.
Вдогонку: мне кажется, неправильно поставлен сам вопрос. Оригинальный "как сделать гиганский ландшафт в несколько км?" предполагает, что опу нечем развлечь игрока кроме рандома уровня.
Правильнее было бы или ставить общий вопрос "как мне разнообразить геймплей [вот такого прототипа моей игры] рандомом?", или частный "какие есть способы генерации/отрисовки под нужды [моей игры с такими-то условиями]?", и рассматривать террейн и рандом как средство достижения каких-л. целей или как возможное решение конуретных проблем при разработке.
>>742096 >Оригинальный Оригинальный вопрос был - как вообще сделать ландшафт в годоте, без лишней кодовозни с максимумом визуальной работы (то есть без вот этих вот сшиваний чанков кодом).
>>742093 >Что ты имеешь в виду? Какие инструменты тебе нужны? Инструменты которые позволяют визуально редактировать весь ландшафт, чтобы я сразу видел результат с учетом не только ландшафта, травы, деревьев, но и со всем декором. Вариант делать ландшафт где-то в другом месте (блендер, вурдмашина и т.д.), и резать на карты высот - фигня, потому что я не могу там учесть окружающий декор .... Короче, я думал что в годоте есть такие же инструменты визуального редактирования ландшафта как во всех остальных движках. Но нет.
>>742112 Ты вообще не понимаешь что пишешь. Инструменты визуального редактирования - не в движках. Они в редакторах. А в годоте редактор расширяется очень просто скриптами.
>>742079 > The First Tree У. А я гадал, какое из копипастных безыдейных говен вбросят на вентилятор. Вбросили это. Ясно. > как сделать такой же ландшафт как там В первом попавшемся генераторе ландшафтов из гугла.
Это будет в 3x сложнее, чем я думал. Уже возникли трудности с созданием персонажа, и его управлением. Но нет ухо без добра! Сделать эффект 2d спрайта смотрящего онли в камеру получилось за пару секунд. Если кому нужно будет https://www.youtube.com/watch?v=N0Laa7XLeS4&ab_channel=Garbaj
Переназначить можно двумя способами 1. В настройках проекта есть вкладка Input, там ты можешь задавать свои действия и назначать им произвольное количество кнопок, осей джойстика и т.д. Т.е. вместо ui_left ты заведешь какой-нибудь walk_left 2. Посмотреть в ассетах, там есть что-то типа менюшек для назначения кнопок самим игроком, наэкранные джойстики для мобилок и тд
>>742162 >Интереса ради, не холивара для -- какой движок? чтобы не агридь мода - такие инструменты есть минимум в ue/unity/unigine. Странно что в годоте их нет
На самом деле в самом редакторе годота вообще нет никакого редактора ландшафта и даже такого понятия - я использовал модуль Height Terrain от стороннего разработчика, но: - автор им больше не занимается (последние апдейты в январе) и он сам говорил. - модуль недоделан, нет например вот этой работы с чанками - то есть например возможности рисовать на стыке двух чанков. В других движках рисовать можно сразу на всех чанках. Тут же предлагается каждый чанк рисовать отдельно, а потом руками пытаться зарисовать все дыры на стыке
>>742217 >В первом попавшемся генераторе ландшафтов из гугла. Только в годоте нет ничего чтобы этот ландшафт показать. Надо самому велосипедить.
>>742152 А я думаю ты просто ищешь отмазку, чтобы уже полгода игру не делать. Я вот закинул ОДИН чанк ландшафта, ткнул ему размер карты высот 2048 и карту 16 на 16. И это дало карту со стороной в 65 тысячи метров (=юнитов). То есть карта 65 на 65 километров. Это гребаные 4200 км2 Типичной лисе со скоростью 65км/ч понадоится ЦЕЛЫЙ ЧАС чтобы пробежать вдоль карты. Четыре часа по периметру. Человеку в 2-3 раза дольше. Для сравнения, спидран всего first tree 20 минут. То есть ты давно бы мог засунуть целиком такую игру в середину всего одного чанка. Правда, может оно и к лучшему - ведь тогда бы пришлось реально работать, расставлять объекты, настраивать свет, тени, тонмаппинг, а ведь все это не делается движком "само".
>>742271 Благодарю, теперь управлять персонажем куда приятнее.
Хотел с утра добавить ему рывок, для разнообразия передвижения, нашёл гайд, но пока для меня это очень трудная задача. Ничего не понял что пацан показал в видио, и по этому сегодня постараюсь сделать черновое меню. Если хватит сил, разберусь как добавить в начало vn сцену, сменяясь после на сам геймплей.
>>742477 Что значит "прикрутить"? Если ты делаешь бекенд на джаве, а клиент на годоте, то обмениваться сообщениями они будут по сети. Например через websocket Или ты хочешь чтобы годот выступал сервером? Но с какой целью? Можно, наверное, подключить какую-нибудь DotNET-либу. Игровой сервер можно и на самом годоте делать. Ну то есть как в старом каэсике можно было запускать dedicated. Как запустить Java внутри годота я хз. C++ можно запустить, если разбираешься. Можно запускать отдельные процессы, ну тупо вызывать команды операционной системы, типа java.exe "do that shit"
>>742268 Небольшой совет по коду. Помимо is_action_pressed есть get_action_strength, возвращающая значение от 0 до 1, где 0 не нажато, 1 нажато. Таким образом, ты можешь всего двумя строчками получить свой инпут: > dir.x = ( get_action_strength(right) - get_action_strength(left) ) 3 > dir.z = ( get_action_strength(down) - get_action_strength(up) ) 3 Обрати внимание, минус где надо появится автоматически.
>>742529 Благодарю за совет, но из меня так себе так что абсолютно весь код для меня как дремучий лес. Двач ещё знаки умножения сожрал, из за чего я даже понять не могу как эти две строчки моими заменить. Но меня такое управление устраивает, хотя бы как-то дает представление что за что отвечает. Почти целый день делал меню, так и не смог осилить эти гребенные контейнеры. На бумаге нарисовать задумку легко, а вот понять логику программы уже трудно. Ну ладно, оставлю это на завтра, а пока часик помучаюсь с рывком для персонажа.
>>742543 > так и не смог осилить эти гребенные контейнеры Да чего там осиливать-то? <- Как-то так как на пикче. > Двач ещё знаки умножения сожрал, из за чего я даже понять не могу как эти две строчки моими заменить. Вот так: > dir.x = ( get_action_strength(right) - get_action_strength(left) ) ж 3 > dir.z = ( get_action_strength(down) - get_action_strength(up) ) ж 3
Нужно ли делать пул для audio 3d нод? Иными словами, если у меня 100 врагов в ряд, но играют звук только ближайшие к игроку, будут ли снижать производительность остальные? Может кто проверял и знает
>>742595 > Нужно ли делать пул для audio 3d нод? Не нужно, звук пуллируется аудиосервером на уровне аудиошин (bus). Просто размещай аудиоплеер чайлдом в ассете и управляй им из инстансов. Например, сам ассет врага пусть решает, воспроизводить ему звук или нет. В тридэ там ЕМНИП даже настройка дальности искаропки есть. > Может кто проверял и знает Я проверял. Основные проблемы там, когда ты на фоне играющего ogg запускаешь много сэмплов wav начинается кряхтение в колонках. Я пытался забороть, но хуй забил на игору вообще, поэтому решения не знаю. И кстати, это кряхтение ещё на версии 3.0.6 было, так что может и оптимизировали уже.
>>742597 Кому должно? Ирл никакого АО не существует, это просто костыль для старых техник освещения - но у анона используется GI Probe, она уже учитывает переотражения. https://nothings.org/gamedev/ssao/
>>742608 > Ирл никакого АО не существует Да ты штоо??? >>742609 Ты автор? Покажи с другого ракурса, что это источник света, а не блик. А если не автор, так не пизди. Я там вижу только блик с засветкой (мы же о поверхности над заложенной дверью говорим, да?) а у отраженного света тоже полутень будет. Везде будет.
>>742612 Глаза разуй, там есть тени на первой и затенение на второй, в довесок к теням. Вот это затенение в узких местах и углах - и есть АО. Отражает распространение света в реальном мире.
>>742613 Э, ну не тралируй э? Там есть освещенность поверхности (по фонгу или как там), но тени шары не отбрасывают. См. пик 1 источник света не дает тени, пик 2 дает - шары затеняют друг друга и пол.
Игроделы, поясните, почему вы выбрали годот для своих игр? Интересует лично ваше субъективное мнение, почему он, а не любой другой. Ну только не говорите мне про бесплатность. Они сейчас все в том или ином виде бесплатные.
>>742643 Открыл только в обратном порядке ну и из анриала и не захотелось выходить впринцапе, хотя и юнити неплох, а годот мне повесил компьютер намертво когда запустил тест игры хотя комп не зависал уже лет 5.
>>742643 анрил мне вообще не понравился у юнети чувствуется, что они тупо больше, как компания и продукт стабильный годот я помню запускал вроде вторую версию и у меня были проблемы с установкой, импортом примеров и т.д. работала только стим версия и то через раз
>>742637 Выбирал по следующим критериям: 3д, опенсорс, редактор сцен, кроссплатформа на пк и мобилы, актуальный (не такое говно мамонта как огре, ирлихт и прочие). Порадовала возможность кодить на c++, но внезапно оказалось что на гдскрипте очень быстро писать, а потом завезли C#.
>>742558 >>742559 >Да чего там осиливать-то? Сама логика мне не очень понятна. В школе кое-как меня научили кодить на html. На ремпае было легко брать кусочки кода, и тупо вставлять в свой проект. А где нужно побольше знаний тут же ступор, и не понимания что от меня хотят. За скрин ниже мне уже пиздец стыдно.
Если до конца месяца не смогу хотя бы половину задуманного в движке сделать, забью на программирование, и пойду дальше.
>>742665 >Это странно. Нет, странно не пользоваться чем-то только потому что там нет функций, которыми ты не пользуешься и не будешь никогда пользоваться. Вот это действительно странно.
>>742677 чел, в гк если и есть "тысячи объектов", то они супер-простые и их явно не тысячи, а максимум сотни и они все супер-простые и если годотя не тянет сотню простых объектов с физоном, то ШТОШ МДАУШ
>>742678 100 объектов это 100100 взаимодействий по дефолту. Хотя это ж опенсорс, надо просто найди где там в буллете ограничитель расстояния физ взаимодействия. Беру свои слова обратно - и для ГК подходит.
>>734420 (OP) Пойду сюда что ль побомблю. Ёбаный ты нахуй, какого ж хуя до сих пор нельзя НОРМАЛЬНО сделать интеграцию с гуглоплеем. Ёбаный же стыд PGSGP уже давно мёртв, разработчикам плагина на него похуй и на 3.3 обновы не видать (кроме костыля, который, сука, без пердолинга, один хуй не работает). Надеюсь, блять, в ёбаной четвёртой версии вся хуйня будет работать нормально
Пытаюсь заспавнить случайное количество кнопок-сцен, чтобы они были всегда по середине, но почему-то получается, как на первой картинке. Если в "Удаленный" вручную выставить для HboxContainer margin_right в ноль, тогда все как надо, как на второй картинке. В коде почему-то эти команды не воспринимаются. Для HboxContainer стоит параметр grow_direction - horizontal - Both.
>func _ready(): >>var hbox = $Control/CenterContainer/HBoxContainer >>var r = 3 >>for _i in range(r): >>>var f = fighter.instance() >>>f.set_custom_minimum_size(Vector2(77, 87)) >>>hbox.add_child(f)
Обновился и отвалились автолоады. Сильно не заглядывал, но похоже автолоад грузится и добавляется в дерево, но не под именем MightyAutoLoad какое ему дал, а под девственным псевдонимом @@2, поэтому остальные скрипты его через FindNode не находят. так что послал сингтоны в жопу
>>743494 > его через FindNode не находят Безумие. Если у тебя автолоад синглтон, тебе не нужно никакое финдноде. У тебя твоё имя сразу регистрируется в редакторе глобально. И ты просто пишешь > MightyAutoLoad.MightyMethod()
>>743698 >Снимай с паузы кнопку Не знаю, поменял в pause_mod на process, stop, все равно кнопка не нажимается не знаю. >hbox.update() Не, че-то не помогает. Ну буду через процесс что уж.
>>744081 Спасибо. Я нашёл что искал. Прошу сразу простить мою наглость, но вы сможете перевести это на С#? Мне не понятно откуда он взял строка 35/36 project_ray_origin().... и строка 10/11 gett_world().direct_space_satate/space_state.intersect_ray
>>744137 Туториалов на игру целиком не видел. По генерации полигональных карт видел, по кликанью по провинциям тоже. Например https://github.com/t-karcher/ClickableMap не мог вспомнить название, потом сообразил что годот в папке пользователя хранит историю по всем когда-либо открытым проектам :3
А может кто объяснить, как разделить сигнал/почему так происходит? Есть сигнал для KinematicBody, срабатывающий по mouse_entered(). Есть 11 мешей (скопированных из одного, в котором как раз дочерний KinematicBody и CollisionShape). По нажатию кнопки я получаю стену срабатываний (предположительно, по количеству мешей), хотя жму один раз всего над мешем с установленным аутлайном, если это пикрил _input(event). При этом func _on_KinematicBody_mouse_entered(): показывается, что срабатывает всего один раз.
>>744419 > почему так происходит? Потому что по умолчанию все элементы_канвы прозрачны для событий мыши/тача. То есть, получив событие, они не препятствуют получению его же остальным слоям канвы. > как разделить сигнал Есть два стула: 1. Сделать canvas_item "непрозрачным", там есть свойство в инспекторе ищи, accept_event(). 2. Обрабатывать события в _unhandled_input и первый кто обработал устанавливает флаг SceneTree.set_input_as_handled(), тобой, в коде, вручную, при соблюдении твоих условий, и если он посылает, то _unhandled_input больше не вызывается для этого события нигде
Вопрос из разряда архитектурно-частных. Дошёл до генерации игрового поля на старте уровня. https://docs.godotengine.org/en/stable/getting_started/step_by_step/instancing.html Если я инстанцирую повторяющиеся меши, это же снизит нагрузку и увеличит скорость работы сцены? Дополнительный вопрос. Скрипты же и сигналы тоже в инстанцирование попадают нормально?
>>744498 Другой вопрос. А генерация. Это что, для тайловой карты 10 на 10 надо цикл в сотню, что ли, загонять? Или у движка есть какие-то инструменты для такого?
>>744520 Ну я имею в виду, что для заполнения гексагонального поля 10 на 10 клеток, мне надо будет сделать цикл х от 1 до 10 с вложенным в него циклом у от 1 до 10. Либо считать, исходя из квадрата числа (карта квадратная-то). Двойные-тройные и т.д. циклы это же плохо и медленно в общем случае? Есть ли инструмент оптимизации этого процесса? Иначе придётся ждать инстанцирование 6400 раз для того же поля 80 на 80 (у меня это занимает уже секунд 5 против моментального запуска карты 20 на 20), что уже не выглядит так просто как 10 на 10.
>>744526 Хотел тебе гридмап посоветовать (увидел, что ты гексы в тридэ делаешь), но оказалось, что у гридмапа гексагональной сетки нет, в отличие от двадэшного тайлмапа. Даже не знаю, что теперь и предложить. Получается, что ты правильно велосипедишь велосипед.
>>744528 >>744526 Вот например вариант. Если у тебя не предполагается карта высот, но хочется красиво наклонять камеру вокруг мапы, то можно сделать отрисованную через вьюпорттекстуру на тридэспрайте двадэшную тайлмапу.
Но скорость её заполнения всё равно смотреть надо, и я уверен, в один поток всё равно будет медленно, поэтому >>744527
>>744527 Ну в общем и целом для пошаговой игры я в этом вижу, скорее, плюс. Не надо усложнять логикой управления многопоточности. Просто вот такие телодвижения, когда у меня простые модель шестиугольника, сваянные на коленке в блендере, а оно на пекарне конца 20 г.в. грузит по 5 секунд, вызывают подозрения, что когда это будет заполненная карта, то это уже будет ощутимо. Хотя, может, занимаюсь преждевременной оптимизацией. Хз. Пока пилю как есть, хотя бы до уровня mvp. А то так вообще никогда ничего не закончить. >>744528 >что у гридмапа гексагональной сетки нет, в отличие от двадэшного тайлмапа Я в гридмап почти неделю проебался, чтобы понят, что он даже с велосипедами не подходит. Точнее можно, но велосипед становится ещё сложнее.
>>744529 >можно сделать отрисованную через вьюпорттекстуру на тридэспрайте двадэшную тайлмапу. Я этот же совет видел на форуме годота раза два. Но что-то мне показалось сложнее, чем в чистом 3д, когда дошёл до взаимодействия с тайлами. Уж и не помню, что в итоге мне не понравилось. С получением координат, что ли, была беда какая-то. В итоге, https://www.redblobgames.com/grids/hexagons/ + 3д взял за основу.
>>744492 Не занимайся преждевременной оптимизацией. Делай саму игру. Если ты не упарываешься в симуляцию планеты, то скорее всего у тебя вся карта легко будет рисоваться. Если же вдруг будет не хватать, то повторяющиеся куски можно будет переписать на MultiMeshinstance или шейдеры.
>>744526 У тебя тут просто ошибочка закралась - ты в цикле каждый раз грузишь сцену с диска, когда надо сделать preload всего один раз, и только инстанцировать. Отсюда и тормоза.
>>744532 >>744533 Тогда вот тебе ответ на твой вопрос. Если тебе нужно заполнить одним циклом некое двумерное поле, определи для поля фиксированную ширину (количество столбцов, C). И тогда: X = i mod C (остаток от деления) Y = i div C (деление нацело) Лол, посмотрел сейчас твой скрин с кодом, а у тебя так и делается. Только каким-то переусложнённым черезжопным образом. Тебе нужно вдовесок к вышеуказанным вычислениям выбрать сдвиг наполовину для каждой, скажем, нечётной строки. И вуаля, готово. Но это по отрисовке. Для заполнения тебе сдвиги уже не нужны. У тебя есть одномерный массив со всеми тайлами и ты получаешь координаты каждого тайла через эти нехитрые вычисления икса и игрека.
Могу геометрический смысл наглядно нарисовать в пейнте, если не уловил.
>>744537 > Только каким-то переусложнённым черезжопным образом. Ровно таким же, если сократить те же i в выражении. Это колдовство осталось из криво созданных изначально моделей и подгонки на глаз, отчего вариант i mod mapSize выдавал не те координаты, что я ожидал.
Короче, пробежаться надо по коду завтра незамыленным глазом в поисках глупостей.
>>744696 У меня была охуенная идея игры - менеджер дачи, где нужно играть за бабку и заставлять всю семью как можно больше вкалывать в огороде за лето и как можно дольше не давать им превратить дачу в место отдыха.
>>744697 а еще возможность вырастить овощи до чересчур больших размеров и количества. А еще красить домик в неприлично-яркие цвета и клеить много слоев обоев.
Вот построил я CollisisonPolygon2D, хочу в его середину поместить надпись. Как найти середину? Я нашел как найти центр масс, но точки у меня не однородно расположены, надпись съезжает далеко от центра.
>>744730 Где-то попадалось про расположение надписей на карте, но я не вникал. Могу только предложить почитать это и по ссылкам там еще походить. https://github.com/Azgaar/Fantasy-Map-Generator Либо тебе нужен центроид. Не знаю отличается ли он от центра масс. Ну и банально проверь что ты label центрируешь, а не по левому краю ставишь.
Вот я хочу, перемещать камеру по экрану, но GUI оставался на месте. Поместил интерфейс в узел CanvasLayer, который специально для этого, но теперь я не могу кликать сквозь этот CanvasLayer. А как?
>>745023 В общем я был неправ, у CanvasLayer нет галочки с инпутом. Могу предложить не пользроваться канвас лейром. У меня в проектах примерно такой сетап ВьюпортКонтейнер - Вьюпорт нужного размера - инстанс сцены с уровнем, камерой и игроком После него все гуи ноды какие нужны. Вроде все просто, быстро и удобно. Единственное что надо понастраивать ресайз окна, если планируется.
А можно ли как-то при инстанцировании задавать значение своего кастомного аргумента, чтобы потом в скрипте этой инстанцированной ноды можно было использовать это значение? Пробовал с export var и с созданием функции внутри скрипта инстанцирумой ноды или меша. Не получилось. Говорит, что нет такого метода в мешинстанс, например.
>>745136 > А можно ли как-то при инстанцировании задавать значение своего кастомного аргумента В гдскрипте на данный момент нет приватных переменных, то есть, создавая инстанс, ты можешь получить доступ к любой его переменной. Итак. У нас есть bullet.tscn, в которой есть переменная speed = 0. > var bullets = load("bullet.tscn") > var current_bullet = bullets.instance() Инстанс создался и у него выполнилась функция _init() > current_bullet.speed = 1500 Нужная переменная в инстансе поменяла значение. > world.add_child(current_bullet) Вот теперь у инстанса выполнились _enter_tree, _ready и начали раз в кадр вызываться _process/.../
>>745151 > И так, похоже, делать не надо. Мешинстанс причём тут? Код показывай, чо ты там нахуевертил? Так надо делать и так делали 30 лет до годота и так будут делать 330 лет после годота. Это классика ООП.
>>745149 В смысле когда? Когда тебе надо что то сделать с мешинстансом, то вызываешь его методы. Когда не с ним, то не у него. Что ты вообще сделать пытаешься?
>>745165 Ну допустим, есть гипотетическая структура Node - MeshInstance - MeshInstance2. Причём первый - родительский для второго, а второй показывается при том же клике мышью на первый. Вод здесь всю эту ситуацию логично обрабатывать методами, вызываемыми у родительского мешинстанса, или у ноды?
Пацаны, я не понимаю. Вот у меня есть сигнлтон, в нем раз в секунду меняется флаг >extends Node2D >var flag = false >func _process(delta): >>... >>flag = !flag В другом скрипте я пытаюсь вызвать сеттер, когда меняется флаг. В логе он меняется. >extends Control >var a = global.flag setget setter >func setter(): >>print("Yay") Почему сеттер не срабатывает? Он же меняется в извне и в другом классе.
Как кошерно работать с глобальными переменными, где хранятся всякие уникальные состояния? Из мыслей - отдельная нода, где все переменные выгнаны типа export(bool) bar unitSelected Или можно как-то красивей?
>>745247 > как-то красивей? В стиле годоскрипта. GlobalData.set_my_parameter_as(new_value) где set_my_parameter_as - это функция, опционально чей-то сеттер.
>>745255 > А как можно реагировать на изменение переменной в синглтоне? Сигналы. Сигналы родимые. Они же события в ентерпрайз-кодинге. Изучи их. Пойми их. И пользуйся их силой. В синглтоне: > signal my_new_state(new_state) ... > emit_signal("my_new_state", moya_peremennaya) В левой ноде: > Singleton.connect("my_new_state", self, "singleton_state_callback") > func singleton_state_callback(new_state): > > print("nakanetcta ya vizhu, chto v singletone peremennaya stala", new_state)
>>745255 Сигналы посылать. В глобале signal flag_changed(value) var flag setget flag_set func flag_set(value): emit_signal(flag_changed, value) В самой сцене func _ready(): global.connect("flag_changed", self, "on_flag_changed")
func on_flag_changed(value): ...
>>745247 Кошерно вообще не иметь глобальных переменных. Ну если по началу тебе так проще, то как угодно. Экспорт вообще нужен только для того чтобы в редакторе годота свойства ручками вписывать. Если ты просто собираешься пользоваться переменной - то без экспорта так же работать будет.
>>745262 >Кошерно вообще не иметь глобальных переменных. А как тогда работать со значениями, идущими от инстанцированных элементов? Напримример, в каждом инстанцированном объекте есть переменная. Для каждого инстанса там своё значением, но вот на глобальной сцене надо учитывать значение из последнего инстанса, с которым ты повзаимодействовал. Тут либо каждый раз выяснять, с кем в последний раз взаимодействовал, после чего тянуть значение, либо в процессе взаимодействия положить значение из инстанцированного элемента в глобальную переменную, а после уже не вспоминать, с каким же инстансом ты взаимодействовал.
>>745267 Просто в ООП за это будет отвечать конкретная сущность, которая и занимается отслеживанием с кем взаимодействовали. Иначе у тебя глобал быстро разрастется до неподдерживаемой лапши. Вообще то что ты описываешь чревато сложноуловимыми багами, когда игрок провзаимодействовал с двумя объектами очень быстро. Плюс что будешь делать, если захочешь взаимодействовать с несколькими объектами (выделять рамочкой к примеру)
>>745269 Прост так заложено в синтаксисе сигналов. sender_node.connect("signal", receive_node, "func_name", [array_of_binds]) То есть ты, вообще говоря, можешь подключать все что угодно к чему угодно, не обязательно к self. Просто если ты не пишешь в начале от кого будет сигнал, то подразумевается что от самой этой ноды, в которой скрипт.
>>745266 Нет, не согласен, я сильно в гдскрипт не закапывался, но чисто с программерской логики, эта конструкция делает не то, что ты думаешь.
Пример из документации выглядит так: var my_var = 5 setget my_var_set То есть 5 это - просто значение, которым переменная инициализируется при создания.
Когда ты пишешь var a = global.flag setget setter Ты на самом деле не создаешь никакой связи между a и global.flag. Просто изначальное значение переменной a задается равным значению global.flag на тот момент времени. Если бы ты в дальнейшем менял саму переменную a, то вызывался бы setter. А флагу нет до изменений a никакого дела. Если тебе надо, чтобы реагировал флаг, то ему, в его файле, и надо определять setget.
>>734420 (OP) Я ебанат и скачал движок в стиме. Теперь он обновляется сам-по-себе и без обновлений не хочет запускаться. Есть проверенный способ отвязать его от стима?
>>745401 Шрифт надо бы настроить до пиксель перфекта Флаги для выбора языка в 2021 имхо не используют В кредитсах стоит указать Godot (у него MIT лицензия) В браузере хотелось бы прыгать по пробелу Не очень понял по какому принципу жабка то делает промежуточный допрыг, то тонет.
>>742637 1) Тяга к опенсоурсу. 2) Году в 12 игрался с юнити. но юнити начал обрастать и тяжелеть, что пиздец. Особенно стало, когда понадобилась студия - до того хорошо жил во встроенном иде с моно. 3) Есть приличное 3д 40 Не такой брошенный во времени, как огре3д и урхо3д.
>>745413 Промежуточный допрыг? Я думаю, речь идёт про бонус неуязвимости, который даётся на каждом новом старте. Надо бы описать их, да. >>745464 >>745472
Спасибо за фидбек, анонасы! Пофикшу в скором времени
>>745837 >бонус неуязвимости Понял, только после 10 игр заметил мигающую иконку. И то что таймер относится к тонущему листику я только потестив подольше узнал.
Блять, пол часа сидел искал баг и оказалось что match по какой-то причине не мог сравнить нормально два int-а. Переписал на if-elif и все магически заработало. Какого хуя Хуан?
Да вот такая обычная конструкция, не знаю на что тут смотреть. В settings[option] валялся интегер от 0 до 2, что я перепроверил консолькой еще. Но по какой-то причине тригерились не 0, 1, 2 ветки, а местный дефолт, то есть _: , причем это происходило не всегда. Не знаю уж баг это или нет, но после переписи - все стало нормально.
Вот на что стоит действительно написать issue, так это на AudioStreamPlayer2D. Мой .ogg стрим (не знаю проблема ли это только .ogg или .wav тоже) зацикливается, даже если в самом годоте галочку убрать с Loop у стрима. Приходится через код отрубать и это 100% баг, причем он и в прошлом релизе был.
>>745964 Если годот по какой-то причине не решил их во флоат где-то сконвертить и потом округлить до целого числа при выводе в консольку - да. Но тогда бы и if нормально не работал, я так думаю.
>>744115 Парни ну помогите, Я тот который переделывал гд-скрипт разворота 3д объекта на C# Я почти допёр, как сделать управление, топдайн шутера в 3д, единственно мне не хватает малости, чтобы поворот модели следовала за курсором мыши, а так модель крутится волчком влево и вправо при движении мыши по Х и по У
>>745965 А, блять. Не только у стрима есть параметр loop оказывается. У самого файла в меню импорта тоже есть параметр loop и он зачем-то по умолчанию включен, интересное открытие.
Глобал шлет сигнал раз в секунду. Хочу, чтобы узел брал значение, сравнивал с предыдущем и показывал изменение, то есть их разность, и рисовать стрелочку. Узел у меня создается каждый раз новый и как только он создается, value у меня всегда равно нулю, почему-то. А в следующие секунды все показывается нормально. Значение new_value мне присылает родительский узел, он тоже это делает раз в секунду по сигналу от глобала.
Есть у меня мыслишка. Неделю уже развиваю или около того. Сделать опенсорсный репозиторий с мини-играми в виде готовых сцен годота. Все мини-игры должны обладать унифицированными интерфейсами для последующего встраивания в более крупные проекты. Что я хочу собрать? Змейки, тривряды, тетрисы, пятнашки, пакманы, взломы замков, механических, электронных, свои авторские пазлы, и многое-многое другое. Для заполнения ими игровых миров анона. Берёшь сцену из репа, встраиваешь в свою игору, юзая стандартизированный АПИ. Как вам идея? Кто хотел бы поучаствовать? АПИ должен включать в себя функции отображения мини-игры, скрытия, опционального запоминания состояния, позволяющие организовать включение и выключение виртуальных устройств с мини-играми в "макро"-игре, при скрытии осуществляется возврат значения (через сигнал), позволяющий организовать собственно взлом доступа куда-либо через мини-игру, или получения чего-либо, или продвижения по квесту.
>>746415 Поздравляю, ты украл мою идею, где персонаж должен ходит по комнатам и решать рандомные случайно выпадающие миниигры. Сука, а я даже анимацию персонажу не могу настроить.
>>746448 > пиши АПИ Предлагаю продумать АПИ вместе, чтобы всем было удобно и чтобы обойти подводные камни, которые не увидишь в одиночку. >>746418 Сорян. Зато ты теперь можешь не писать кучу миниигор, а подсоединить нашу (пока ещё не существующую) базу миниигор прамо в свой проект и сконцентрировать усилия на стиле.
Я импортировал JSON файл в синглтон, присвоил его словарю dict1. В другом скрипте создал еще словарь dict2 = singlton.dict1. Беру из dict2 данные, обновляю их и сохраняю в dict2 новые данные. Но оказывается обновляются и данные в синглтоне. Так и должно быть? И dict2 = Dictionary.new() не работает, функции нет в Dictionary. Короче, чтобы хранить начальные неизменные данные, надо в синглтоне еще один dict3 создать и распаковывать в него? Или можно во втором скрипте все-таки сделать независимый словарь?
Как лучше закладывать поведение ИИ в игру, и где его обрабатывать для пошаговой игры? Есть идея гонять принятие решений в многопотоке, пока игрок ходит свой ход, чтобы потом ИИ имел заданный набор шаблонов для поведения к своему ходу. Из идей только в синглтоне крутить в цикле принятие решений.
>>746651 Думаю так и надо делать. Хотя мне в другом треде настойчиво советуют GOAP или Utility AI. Он вроде как выбирает исходя из текущей ситуации, а не перебирает дерево вариантов.
>>746695 Ну я тоже ориентируюсь на utility ai, но вот если конечная цель не так легко достижима и состоит, по сути, из набора более мелких целей, то всё равно придётся перебрать, какая же из целей лучше здесь и сейчас.
>>746707 Ну вот насколько я понял утилити ничего не перебирает, а просто идет по списку доступных действий и выдает каждому оценку, и берет из самой дорогой категории с самым высоким весом (если таких несколько одинаковых то тут рандом). Это по идее быстрая операция. Или я чего-то не понял про перебор. Еще читал что делают двухуровневый ИИ, один стратегический - он решает какую конечную цель делать, и один для агентов - он уже решает мелкие цели.
Как получить доступ к ключу в словаре? Мне надо в цикле сравнить, равно ли название первого ключа названию ключа в подподсловаре, например, второго ключа. >for entry in data: >>for i in data[entry]["relations"]: >>>for entry1 in data: >>>>if entry != entry1: >>>>>for j in data[entry1]["relations"]: >>>>>>if entry == data[entry1]["relations"].key() - вот тут не получается
>>746758 Что то странное ты делаешь. for entry in data: Ты уже получаешь подряд все {ключ:значение} Зачем после этого лезть в data по entry? Если же ты хотел перебрать все ключи, то пишется for key in data.keys():
>>745973 Не заметил этот пост, сорри. Советую делать как тут https://kidscancode.org/godot_recipes/3d/rotate_interpolate/ Шаг 1. Преобразовать координаты мышки в координаты в 3д мире. Шаг 2. Временному объекту сделать look_at на эту позицию цели Шаг 3. Плавно проинтерполировать направление настоящего объекта Если будут трудности может завтра напишу подробнее
Привет. Есть нода2д на которой лежит layout на котором лежит контрол. Как взять глобальные координаты мира под контролом? Походу лайаут создал ещё один вьюпорт. И я совсем не понимаю как с одного вьюпорта влезть в другой.
>>746953 Покажи дерево нод, потому что не понятно что ты называешь world2d, layout. В любом случае, даже если не разберешься, там можно элементарно посчитать - $Camera2D.get_camera_position() - $Button.rect_global_position
ОП в треде. Перекачу ближе к вечеру. Про оп-пикчу анона помню, поставлю. Предлагайте дополнения в шапку. Позже перечитаю и скомпоную. Всем цемки! Обнял! Убегаю! На связи!
Краткий гайд по вкату в движок:
1. Читать документацию.
2. Качать примеры.
3. ПРОФИТ!
Ньюсач
https://godotengine.org/news/
Ссылки
Скачать движок: https://godotengine.org/download/ или http://store.steampowered.com/app/404790/Godot_Engine/
Теперь прямо онлайн - можно и с дивана: https://godotengine.org/online/godot.tools.html
FAQ: https://docs.godotengine.org/ru/latest/about/faq.html
Документация: https://docs.godotengine.org/ru/latest/ https://docs.godotengine.org/en/stable/
Примеры качаются прямо в движке через свой магазин в отдельной вкладке AssetLib. Там есть всё - от платформера до чата.
Игры, созданные глобальными кириллами: https://steamcommunity.com/app/404790/discussions/0/412448792354265655/
Изумительный Годот: https://github.com/Calinou/awesome-godot - подборка дополнений, модулей и минишоукейс от одного из авторов.
Аддон для диалоговой системы: https://github.com/coppolaemilio/dialogic
Для любителей пощекотать конпеляцию
Бинды LUA: https://github.com/perbone/luascript
Бинды JS: https://github.com/GodotExplorer/ECMAScript
Годнота от анона
- Для приверженцев опенсорца существует возможность распространять проекты в незапакованном формате. Просто скачай темплейт с оф.сайта и положи экзешник/эльфешник в папку с проектом, этого достаточно. Имя файлу можно задать любое. Дополнительно можешь вшить свою иконку в экзешник. После этого, запустившийся файл темплейта обнаружит рядом с собой файл project.godot и начнет грузить проект из него и из файлов, лежащих в распакованном виде в той же директории. Для запущенного таким образом проекта папка res:// становится доступна для записи (если это не ограничено правами доступа в системе).
- В версии 3.2 появилась возможность прикреплять pck к бинарнику. Бриллиант для любителей однофайлового продукта!
- Редактор персонажей на основе makehuman: https://github.com/Lexpartizan/Go_MakeHuman_dot
- Тест-бенчмарк:
- - Веб-версия - https://govdot.herokuapp.com
- - Вишмастер для винды - https://govdot.herokuapp.com/4Anon.rar
Предыдущий:
Архивный: https://arhivach.net/thread/641529/