Это копия, сохраненная 31 мая 2021 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
С изучения документации. Если не можешь в инглиш, и даже в гугл-переводчик, то начат перевод официальной документации: https://docs.godotengine.org/ru/latest/
Но вообще, будь мужиком и изучи английский: https://godot.readthedocs.io/en/stable/
Вместе с движком обязательно смотри примеры, там есть всё - от платформера до чата. Примеры качаются прямо в движке через свой магазин.
Скачать движок: https://godotengine.org/download/ или http://store.steampowered.com/app/404790/Godot_Engine/
FAQ: https://docs.godotengine.org/ru/latest/about/faq.html
Игры, созданные глобальными кириллами: https://godotengine.org/showcase или https://steamcommunity.com/app/404790/discussions/0/412448792354265655/
Скажи "Годот круто!" https://github.com/Calinou/awesome-godot - подборка дополнений, модулей и минишоукейс от одного из авторов.
Годнота от анона:
Для приверженцев опенсорца существует возможность распрострянять проекты в незапакованном формате. Просто скачай темплейт с оф.сайта и положи экзешник/эльфешник в папку с проектом, этого достаточно. Дополнительно можешь вшить свою иконку в экзешник. После этого, запустившийся файл темплейта обнаружит рядом с собой файл project.godot и начнет грузить проект из него и из файлов, лежащих в распакованном виде в той же директории.
Редактор персонажей на основе makehuman: https://github.com/Lexpartizan/Go_MakeHuman_dot
Все языки в одном месте: https://vk.com/topic-70467171_35982467
Тест-бенчмарк:
Веб-версия - https://govdot.herokuapp.com
Вишмастер для винды - https://govdot.herokuapp.com/4Anon.rar
Предыдущий тонет там: >>617485 (OP)
Архивы:
1 http://arhivach.ng/thread/207802/
2 http://arhivach.ng/thread/388500/
3 http://arhivach.ng/thread/388501/
4 http://arhivach.ng/thread/388502/
5 http://arhivach.ng/thread/388503/
6 http://arhivach.ng/thread/432708/
7 http://arhivach.ng/thread/433902/
8 http://arhivach.ng/thread/436355/
9 http://arhivach.ng/thread/455461/
10 http://arhivach.ng/thread/479963/
11 http://arhivach.ng/thread/489815/
12 http://arhivach.ng/thread/494513/
https://godotengine.org/qa/2239/what-is-the-best-way-to-do-object-pooling
> There is no GC in gdscript so your game wont pause in random moments of time to free the memory, this is why there is NO NEED for object pooling in gdscipt.
Если ты говоришь о пулах, как о парадигме, то эту функцию выполняет само дерево сцены. Создай ноду, но не включай её в дерево. Храни её в переменной (my_node_pool например), добавляй в неё ноды, которые требуется держать в памяти наготове, при этом у них не будут обрабатываться коллбэки. Добавляй и удаляй их путём репарента в основное дерево / из него.
Репарент делай осторожно, через call_deferred, что обсуждалось в прошлом треде
https://godotengine.org/qa/9806/reparent-node-at-runtime
С утра рано приходится вставать, вот и бесишься!
Платформеро-рогаликоунтерменш мнение знать не хочу, поэтому 2D мимо.
Если порыться в гитхабе, то есть куча свободных 3D движков разной степени кривизны, в чем существенное отличие его от конкурентов? Что по оптимизации и простоте работы? Сцена из трёх кубов не будет выдавать 3 фпс? Есть ли готовые 3D игры на Годоти дабы посмотреть среднее по больнице или на Годоте сидят только сектанты 2D, а 3D "для галочки", как это было в Gamemaker 1?
Почему именно годот тред, а не Lumix, Wicked, Armory, Xenko и т.д.?
Или все отличия заканчиваются на финансировании Хуана, что позволяет вкладывать деньги в пиар?
> Чем Годотн хорош именно для 3D?
Рабочим процессом. Движок требует минимум сторонних инструментов для создания готовой игры. Фактически, нужен только 3D-редактор.
> в чем существенное отличие его от конкурентов?
Зашкаливающая простота. В движок вкатываешься за день. В скриптинг за второй день.
> Что по оптимизации и простоте работы?
Есть проблемы с оптимизацией. Проблемы есть. Но над ними работают.
> а 3D "для галочки", как это было в Gamemaker 1?
Начиная с третьей версии триде уже не для галочки.
> Сцена из трёх кубов не будет выдавать 3 фпс?
Дело не в количестве кубов, а в количестве нормалмапов в материалах. Над этим работают.
Ой, кажется я забыл номер поста! Или не забыл? )
>Дело не в количестве кубов, а в количестве нормалмапов в материала
А окклюжен куллинг уже завезли, можно делать локации размером больше одного экрана без просадок фпс?
"Размером в экран" - это игра с фиксированной камерой, отсутствием движения камеры или скроллинга, весь игровой процесс которой происходит в рамках этого экрана. Например, тетрис, или бомбермен.
И причем здесь окклюжен? Если у тебя будет скролл над картой бомбермена рамером 10х10 экранов, окклюжен практически никак не повлияет.
А он в годоте есть?
>>35804
Для приведенного тобой примера да, окклюжен работать не будет. Но если у меня вид из глаз и большая карта с домиками, в которые можно входить, а в домиках куча мебели, лежат вилки на столах, я правильно понимаю, что сейчас в годоте будут рендериться внутренности каждого домика, попавшего в кадр, если смотреть на них снаружи?
1920x1012, 0:21
>А он в годоте есть?
Есть конечно.
>Для приведенного тобой примера
Это был приведенный тобой пример. Или ты другой анон?
>например, тетрис, или бомбермен.
>я правильно понимаю
Правильно. Будет через пол года. Если тебе надо раньше, придется самому отключать вилки-ложки, например, когда персонаж отошел за area рядом с домом.
Для интерьеров есть https://github.com/lawnjelly/godot-lportal
Из видоса не совсем понятно где у стрелочки перед, так как впереди ее выдающейся части исчезают стены.
Это не стрелочка. Так обозначают конус видимости из камеры. Да, можно было сделать нагляднее.
>ручками расставлять порталы в 2к20 веке
Не, спс, я игры хочу делать, а не заниматься дрочкой.
Нет, ты не хочешь делать игры, иначе уже давно бы расставил порталы вместе с дверьми, это занимает наносекунду времени.
Ну так свали нахуй в движкосрач-загон.
>Будет через пол года
Лол. Это разве не базовая фича которая должна быть одной из первых вообще? Да хоть сраный з-буффер перебрать, долго чтоль
Как видишь, этой базовой фичи в годоте нет, на том видео показан левый васянский модуль, с которым нужно перекомпилировать движок и шаблоны экспорта, и который криво работает.
Ананас, я разобрался как делать подобие префаба. Теперь хочу напрограммировать коллизию, можно руками делать, см. пик. Но можно ли _create_collision_polygon_2d_node (ток в 3.1 появилось) вызвать как то с gdскрипта или городить свой велосипед. Коллизия нужна чтобы мышой кинематикбади2д двигать, через pickable.
И еще вопрос пока не забыл. Если я двигаю одну на другую коллизию, как из сортировать. А то сразу две\три\... двигаются.
Раз этой фичи нет, значит она не базовая.
Тебе вот прямо совсем обязательно вручную из кода коллизии добавлять? Просто добавить к ноде физический объект с коллизией религия не позволяет?
Потому что сделать это можно, конечно, но придётся дополнительно ебаться с регистрацией нового объекта в сервере физики.
В идеале сделать префаб уровня, закинул картинку и всё. Остальное на лету, при старте сцены. Похуй можно и руками, на сцене предполагается порядка 60-120 таких объектов. Руками тоже можно протыкать каждый.
Что еще за подобие префаба? Просто делаешь отдельную сцену characterZombie и туда в корень добавляешь кинематик, спрайт и коллижн. А потом всю сцену интсансишь в сцене игры.
>Что еще за подобие префаба?
забей юнити сленг, отвыкаю
>А потом всю сцену интсансишь в сцене игры.
Это уже освоил. Но повторюсь у меня не 100 одинаковых зомби, а наоборот 100 разных по шейпу и вариативности спрайтов. Щас я как, делаю отдельную сцену item, туда только спрайт\скрипты\что угодно кроме коллизии, они все разные будут. Далее делаю 100 инстантов в сцене игры. Колизии как указал было бы заебок делать на лету, при старте. Пойду хуану метод предложу, чтобы не только в редакторе кнопку держал.
про порядок, там вообще оказалось ничего нет. народ велосипеды изобретает.
Как передать следующей сцене параметры? Например я пишу get_tree().change_scene("res://scene2.tscn")
И хочу, чтобы в этой scene2 был определенный текст. Как це сделотб?
я бы пользовал global, как хуан завещал. Тут же всё описано: http://docs.godotengine.org/en/stable/getting_started/step_by_step/singletons_autoload.html
Заведи GlobalSceneParameters.gd и пользуй на благо. вкатыватель-выше-кун
а чего нет? я пока не вижу проблем. Пусть убедят в обратном.
> Для нескольких десятков переменных сойдет?
У игры должен быть как минимум один синглтон, олицетворяющий действующий инстанс игры, это игровой мир, если там мир, или игровое поле с расстановкой фигур и правилами. Так или иначе, есть некая структура данных, которую лично тебе выгодно держать в памяти от начала и до конца игровой сессии. Эту же структуру удобно использовать в качестве файла сохранения (сериализовать).
Поэтому самым "правильным" (ИМХО!) решением будет записать необходимые данные в эту глобальную структуру, а когда новая сцена загрузится, она прочитает эти данные у себя в коллбэке _ready()
Вообще говоря в гдскрипе есть классы. То есть ты можешь вполне осмысленно их группировать как и в любом другом языке.
class Pupa:
func za(lupa):
return lupa.zarplata
class Lupa:
var zarplata = 300
var pupa = Pupa.new()
var lupa = Lupa.new()
print(pupa.za(lupa))
Это было к вопросу о куче глобальных переменных в одном главном файле.
Эти встроенные классы говно. Мне гораздо удобнее нововведенная в 3.1. Команда class_name <> которая регистрирует скрипт как класс глобально. Классы становятся отдельными файлами и вызываются из других классов. Вот твой пример в таком варианте:
файл pupa.gd
class_name Pupa
func za(lupa):
return lupa.zarplata
файл lupa.gd
class_name Lupa
var zarplata = 300
файл zalupa.gd
var pupa = Pupa.new()
var lupa = Lupa.new()
print(pupa.za(lupa))
Дело вкуса, не люблю отдельный файл для каждого пука, если микрокласс на пару переменных. Насмотрелся на это в интирпрайз жабе.
Судя по всему вот через это
https://docs.godotengine.org/en/3.1/classes/class_bitmap.html#class-bitmap-method-opaque-to-polygons
Про порядок ты имеешь в виду когда спрайты один над другим? Тоже год назад сношался с этим, тоже только area2d и unhandled input работал.
https://youtu.be/pathScTBsk0
Условия какие? Не получится что все что им отправишь становится их собственностью?
И нахуя оно надо? Купить доменное имя, арендовать сервер за 5 баксов в месяц и можешь сам хоститься.
Забавно, потому что на моей некропека наоборот хтмл годота работало в лисе, но не в хромом
Работает прям в мобильнике, правда игры зумерское гиперкэжуальное г.
Имею ввиду чтоб можно было анимировать движение в 8 направлениях в изометрии. Надо подменять риги и скелеты или это только для платформеров?
Гайс, передо мной стоит такая задача:
нужно по нажатию кнопки сделать эффект размытия фона (т.е. одного конкретного слоя), и по нажатию другой кнопки отключать это размытие и делать картинку опять четкой.
Желательно, чтобы размывалось не моментально, а постепенно в течение одной секунды, и потом также откатывалось назад.
Понимаю, что это по идее делается с помощью шейдеров, но что-то у меня ничего не получается. Помогите, пожалуйста
>Загугли gonkee shaders
Можешь ткнуть меня где у него именно про эффект размытия (blur)? На Гитхабе и на ютуб-канале нашел только про огонь, дым и всякое такое.
>>36743
В общем я разобрался почти со всем, кроме этого:
>Желательно, чтобы размывалось не моментально, а постепенно в течение одной секунды
Как такое сделать? Чтобы к переменной отвечающей за размытие каждый кадр добавлялось например 0.01, а по достижении числа 1 процесс прекращался?
Я вот попытался написать функцию, но она почему-то включает размытие сразу на 1, а не повышает постепенно
Я не программист и вообще пишу код первый раз в жизни, гугля на ходу. Но я рад, что тебе весело.
Само размытие по нажатию кнопки уже работает, теперь мне надо только этот плавный переход как-то настроить
> Насмотрелся на это в интирпрайз жабе.
А я не могу наглядеться. Загляденье просто! Особенно, когда среда разработки осуществляет менеджмент этими файлами так, что ты можешь абстрагироваться от них. Однако, сам факт их наличия предоставляет широкие возможности для бэкапа.
> плавный переход как-то настроить
Просто скармливай шейдеру обновлённые значения радиуса размытия из _process или из корутины, не знаю, как тебе удобнее. Но вот этот мрак на скрине >>36801
это пиздец. Сеттер возвращает void и твой if бессмысленнен. Но даже если туда подставить геттер, чекать ифом значение юниформа бессмысленно в рамках твоей задачи. Ещё раз: просто скармливай новые значения шейдеру через сеттер.
func blur_increase(): Mat.set_shader_peram("blur", wrapf(current_blur + blur_step, blur_min, blur_max))
Все понял, спасибо.
Отключить АА при импорте. Либо свойством filter либо пресетом 2d pixel (что делает то же самое).
И кстати ещё сам редактор при разрезе на куски может смягчать кромки. Выбери жесткое попиксельное выделение в фоторедакторе, если импорт не поможет.
При соблюдении обоих советов куски пикчи совместятся пиксель к пикселю. Но без сглаживания отдельные куски могут на краях выглядеть рвано. Тут три решения. 1. Резать под ровными углами, 1:2, 1:3, 1:4 и т.д. 2. Резать со сглаживанием а затем масштабировать вырезанный кусок на пару пикселов больше, чтобы края перекрывались. 3. Резать по кромкам изображённых объектов, пока не останется задний фон. Затем дорисовать задний фон, это лучше подходит, если у тебя многослойное изображение в формате psd, тогда просто слои сохраняешь в отдельные файлы.
Пока что нет, только костыли
https://www.reddit.com/r/godot/comments/7o6usp/compute_shader_andor_get_back_data_from_gpu/
Надо подождать, пока завезут. В ожидании ждём, посаны!
уже год жду)
Без компот-шейдора не получится сделать снег/дождь, который не проваливается сквозь крыши.
> Был в том обсуждении, предлагал дичайшие костыли вроде лепки нескольких инстансов частиц вокруг домов.
Быстрофикс.
Спасибки, выручил. Отключение filter спасло мою душу.
>>37196
>Выбери жесткое попиксельное выделение в фоторедакторе
Именно это и указал, АА был отключен в редакторе при экспорте.
В любом случае, приму инфу к сведению, про порезку. Пол игры на этом строится. Когда отключил filter на импорте, даже при скалирование окна игры, всё стало как по маслу, без разрезов. Годот сила.
1920x1080, 0:30
Террейн из https://godotengine.org/asset-library/asset/231
Расстановка деревьев с помощью https://godotengine.org/asset-library/asset/380
Водичка из https://github.com/ywaby/godot-WaterPack
На самом деле, визуал водички оказался очень недоработанным (в плане отражений и прозрачности), да и автор его почти не развивает, так что не рекомендую для продакшна.
> Ща гляну, что там за контроллер.
Ба, да это тот самый говноассет, который я доводил до ума в прошлом треде!
> mvarray[0] = true
Однако же замечу, моих постов из прошлого треда тебе не хватит, чтобы довести до ума. Вообще, всё зависит от потребностей твоего проекта. Тут уже стоит задуматься о модульном контроллере, чтобы можно было подключать и отключать фичи. С другой стороны, почему бы не поднять модульность на уровень компоновки персонажа и подключать контроллеры по мере надобности? Надо это обдумать.
Каким макаром лучше запилить в годо многомерный массив?
Я пока вижу два варианта:
1) сделать одномерный с домножением индеков на число, типа N[i,j,k] эквивалентно N[i100 + j10 + k]
2) Сделать ноду N1 создающую массив нод N2, каждая из которых создает массив нод N3... ну вы пони.
Но может есть менее упоротые варианты?
Еще вопрос: логично, что в случае с ОЧЕНЬ большим массивом, во втором варианте будет просто адское кол-во нод. Как это скажется на производительности если эти ноды будут иметь минимальный функционал и, по сути, будут только хранить данные?
>Как это скажется на производительности если эти ноды будут иметь минимальный функционал и, по сути, будут только хранить данные?
В том смысле - дергает ли годо ноды и имеющие свойства(переменные) но не имеющие никаких функций? Или они просто безболезненно висят не потребляя ресурсов компа кроме оперативы?
Мда. Так и думал, что можно проще. Еще такой вопрос: при таком способе ведь не будет ограничения на кол-во измерений? 10-мерный массив можно так запилить? И есть ли ограничение на кол-во элементов в массиве, или оно условно бесконечно?
Вот этот вопрос тоже в силе
Ты лучше пиши что ты хочешь сделать, потому что 10-мерный массив это очень странно.
>есть ли ограничение на кол-во элементов в массиве, или оно условно бесконечно?
Там int, 2,147 миллиарда, если выделилась память.
>потому что 10-мерный массив это очень странно.
Не, я понимаю что странно, лол. Хочу проверить работоспособность одного своего алгоритма, для одной утилитки на комп. Так что описать, что я хочу сделать в двух словах наверное не выйдет. Короче будем считать, что мне нужно запилить массив на много (около 10) измерений.
>Там int, 2,147 миллиарда, если выделилась память.
Но, всегда ведь можно вложить в этот массив еще массив на пару миллиардов, так?
Нууу.. я на самом деле сам пока еще думаю, как лучше сделать. Но, будем считать для простоты что сплошные
Просто массив будет заполняться по ходу работы проги, и я хз, как оно повернется.
Хотя массив этот должен хранить списки, так что мб сразу проще пилить в виде ступенек
Ты с арифметикой дружишь? Если у тебя первое измерение (ширина) 2 миллиарда, и в каждом столбце (высота) 2 миллиарда ячеек, то тебе надо чтобы в компе стояло 2 миллиарда плашек по 4гб (минимум)
Да я спросил чисто для теории. Не придирайся. В моей проге, надеюсь, до такого не дойдет.
Но там реально дохуя этих элементов, и я вообще хз, во что это выльется и заработает ли.
> Хочу сделать прогу. Но какую не скажу.
Неужели на нашем движке собрались писать вирусы? Вот это честь!
Но вообще да, я не посчитал, когда спрашивал
Естественно не скажу, т.к. это не прога, а алгоритм обработки довольно специфичного списка данных, который х*й знает работает ли вообще.
Все еще непонятно зачем тебе 10-мерность. Ты уверен что тебе нужно arr[3][14][59][265][5][35][89][793][23][846], а не скажем просто arr[x][y][10].
Если кратко, и не вдаваясь в подробности - для скорости "индексации" - чтобы быстро переходить к нужному элементу, подходящему под заданные условия, а не ворошить каждый раз многотонный список. Хотя, конечно, возможно есть более простые решения, но, думаю вариант с разбиением списка на сотню тысяч (а мб и больше) частей тоже не так уж плох.
> возможно есть более простые решения
> с разбиением списка на сотню тысяч (а мб и больше) частей
Именно так. Деревья. Все юзают их, а не многомерные массивы.
Ты так спрашиваешь, будто я профи байтоёбства. Гугли октодеревья, бинарные деревья поиска и прочее такое найдёшь далее по ссылкам из нагугленного текста. Учись гуглить и курить матчасть. Без этого не станешь девелопером. И готовься к тому, что 99% инфы будет на английском.
Ладно, хоть скажи, это реализуемо на gdscript, или придется делать вставки на C++?
Реализуемо.
Главное - пытайся и делай. Могу помочь с алгоритмом, если ты перестанешь строить из себя секретного спецагента и внятно объяснишь, что ты хочешь посчитать. Возможно, оно уже реализовано в движке, если ты правильно поставишь себе задачу и прошерстишь АПИ движка.
Ок, я погуглю в свободное время. Если будет что непонятно - спрошу
Пасиб за разъяснения
Возможно ему вообще не игровой движок нужен, а чистая ИДЕ для обкатки своих идей в простом ЯП.
Кстати да, хоть он и пишет, что данные будет собирать из игры, игру же можно реализовать в виде клиент-сервера, и собирать обезличенные данные о юнитах (без графона и так далее), игровое поле просто как массив объектов в любом ЯП.
Годот хоршо только скоростью с которой ты будешь создавать, писать на гдскрипте намного быстрее и проще чем на си, если ты делаешь игру мальенкой кампанией(один), то на U или на U, ты за занчительный промежуток времени сделаешь нихуя, а на гд можно написать годную мобилку за 1 день
Я вообще картинки делаю texture rect и инпут с них ловлю
Сделай не кинематик, а риджыд(в нем надо будет когда поднимаешь мод менять на кинематик, а когда кладешь обратно), еще чуть выше написал про то что инпут ловлю с тексутр ректа, если так делать то будешь мышкой брать ток 1 объект
попробую. пасиб за совет, может проще будет. в целом я победил через area2d и _unhandled_input. Норм работает.
2д графон, пошаговые бои, диалоги разветвленные, вот это все.
Пробовал РПГ мейкер, он не позволяет диалоги сложные строить, печаль. Гамак пробовал, он начинает в определенный момент просто виснуть от обилия файлов.
Что делать, анон? Вливаться в ГОДОТ? Если да, подскажи, как облегчить себе жизнь?
> как облегчить себе жизнь?
Выучить программирование. Если выучишь, то сможешь на годоте такое сделать.
>но при этом нихера не шарю в коде?
Главное выучить программирование. Потом сможешь использовать любой движок.
Годно. Однако в век терабайтов с гигагерцами интересно разве что в академических целях. Более-менее красивая игра с графоном, звуком, будет весить от 600 Мб. Экономия 5-7 мегов тут погоды не делает.
Ты не сможешь сделать годной игры без навыков в программировании. Годоскрипт прост лишь для кодеров со стажем, увы. Если ты принципиально не понимаешь логики компьютеров, как персонаж тролля, набрасывающего в соседних Индия-тредах, то ты и в годоскрипте будешь как слепой котёнок тыкаться.
У меня стаж кодинга 20 лет и то я целый год над одной только диалоговой системой работал, постоянно переделывая и отбрасывая неудачные варианты. А ещё бывает, натыкаешься на неочевидные вещи, никак не отражённые в документации. Например, есть кнопка, у неё есть сигналы. Есть диалог, у него есть сигналы. Это в доках есть. Так же в доках подробно описано, как вешать обработчики на сигналы. Но в доках не написано, что ты можешь получить ссылку на кнопки в диалоге и назначить обработчики на их сигналы нажатия, чтобы потом получать нажатие кнопки ОК в диалоге и действовать соответственно. Предполагается, что ты это уже понимаешь.
Короче говоря. Геймдевелопинг - это сложное и обширное ответвление от софтдевелопинга в целом. Наивно вкатываться в него с нуля. Поэтому я и много других анонов в очень многих тредах советуют новичкам начинать с общих курсов кодинга, чтобы хоть немного поднатаскаться в матчасти. А потом уже игры делать, уровня фолыча, с корованами и домиками деревянными.
>но при этом нихера не шарю в коде
Опиши свое "нихера". Если ты можешь отличить переменную от массива, а интерфейс от абстрактного класса - то можешь спокойно вкатываться.
Нужно что-то как на картинке
> питон
Нет, не слышали.
https://docs.godotengine.org/ru/latest/getting_started/scripting/c_sharp/
Существует множество различных платформ и языков программирования, однако среди них нет более элитного, чем C#. Это поистине язык богов, сочетающий в себе простоту использования с поистине неограниченными возможностями. Знание C# — прекрасный детектор современного, умного и успешного человека. Изучение платформы .NET безошибочно указывает на успешного в будущем человека.
> нарисовать СВЕТЯЩУЮСЯ ЛИНИЮ
Какое грамотное, полное и всеобъёмлющее ТЗ. Я сделаю этот заказ за 3 тыс рублей.
Мб я чет не понимаю, но ведь видеокарте проще нарисовать текстурку, чем для каждого пикселя сделать по какой--нибудь операции разве не?
Нет. Ведь быстрее "нарисовать текстурку" на GPU а не на CPU.
С языком все в порядке, а что там с поддержкой платформ? iOS точно нет, html версия и андроид в бете?
Ты втираешь что-то странное. Экспорт c# в андроид заявлен в 3.2 который еще не зарелизился. Экспорт в ios заявлен как не сделанный. Пруфы экспорта c# в ios какие нибудь имеются?
https://github.com/godotengine/godot/issues/20268
Да не страшно, Хуан мог бы и почетче на сайте написать, из чего куда есть экспорт, а куда нет.
Сишарп - надежда игростроя.
https://yadi.sk/d/n41WryoNBr-dhw
А, неважно, у меня на 3.1.2 запустилось. А звука там нет или это у меня из-за линокса не заиграло?
Если в игре есть звуки, пожалуйста, переименуй все звуковые файлы, чтобы они были с мелких букв и переэкспортируй.
> Погодите а как вы ехе запускаете на лиунксе?
Я свой ельф сделал, очевидно. Точнее просто взял от одной из своих игор. Заработало! И со звуком!
Тут другой вопрос. Музыка закончилась, я еду дальше в тишине. Нужно либо запускать шарманку сначала, либо уровень заканчивать.
> управление мышкой,
Ассет, который ты спиздил, также управляется и стрелками с клавиатуры. И гораздо удобнее.
Я пока забил на эту игру и делаю другую, т.к. там проблема в шейдере на телефоне, при столкновении на компе шейдер работает отлично, а телефоне дергает картинку 1 раз в бок и обратно, почему пока не разобрался да и лень как-то, все равно еще 100000 фишек надо добавлять чтобы это стало играбельным.
А по поводу той-же музыки, всё равно я не могу использовать этот трек, если буду выкладывать в гуглплей, сам я музыку писать не умею, есть один друг одногруппника, который умеет что-то, но не хочу его просить пока все настолько неготово
> сам я музыку писать не умею
Вот держи https://opengameart.org/content/neon-transit
Этот трек я хотел заюзать для своей Т2 на ТВГ, но прокрастинация одолела.
Я знаю что такое ассет, но не умею их устанавливать, т.е. еще ни разу не получилось когда пытался, управляется стрелками т.к. управление на компе я вообще делал только для теста, эта игра не задумывалась для пк. По этому сначала я сделал на стрелки, но управление стрелками оч далеко от управления наклоном, по этому придумал сделать на мышку, максимально похоже на управление гироскопом.
Скрестил пальцы за тебя, анончик! Сделай игру за всех нас!
В шапке есть подсказка (после жирных букв)
Спс схоронил
Кстати советую забекапить папку C:\Users\ИМЯ_ЮЗЕРА\AppData\Roaming\Godot
У меня от экспериментов с шейдерами с падением драйвера видюхи, и от ковыряния с экспериментальными билдами, пару раз зависал комп целиком, и после ребута все настройки были проебаны.
Ну немношк есть. До студии канеш далеко. Но ребята стараются.
Теоретически можно писать в vs code с помощью https://github.com/godotengine/godot-vscode-plugin
Практически, наверное, заебешься.
Практически, если речь о годоскрипте, то для него сторонние тулзы не нужны, а если речь о сишарпе, то мне, например, удобнее безо всяких тулзов открыть в студии сгенерированный годотом солюшен и не забывать сохраняться после написания кода.
Что хочу переделать:
- выкинуть их рендер, встроить vulkan/DX12/OGL (знаю что в 4 версии это тоже хотят сделать - но они там еще лет сто будут делать)
- выкинуть их питон-скрипт, заменив нормальным скриптовым языком и доделать C#
- выкинуть bullet, встроить physx
- оптимизировать 3Д
Почему не контрибутить? потому что хочу многое переделать, они не пустят (и вообще у них ущербная политика контрибуции - доходит до того что пофиксив баг, надо потом им доказать что это был очень важный фикс бага)
Если вулкан сделаешь, вообще заебись будет, а то этот ебаный жылет2 без гпу, а жилет3 вообще нихуя не работает.
А если выкинуть питон скрипт то нахуй тогда овобще гд нужен, он же только для тех кому лень в си подобные
вместо питона думаю что-нибудь типа JavaScript/TypeScripts для ленивых и довести до ума C# для остальных. Плюс когда-нибудь хотелось бы и свои блюпринты
Ну а конкретно сейчас переделываю систему сборки (scons меняю на premake5) и обмазываюсь профиляторами (надо узкие места латать)
Если все пойдет, открою свой форк на гитхабе
Да ты наркоман.
Это вообще не проблема. Можно качать готовое. Можно делать лоуполи по гайдам. Можно рисовать пиксельарт по гайдам. Можно делать процедурную генерацию графона. Главное просто начать и делать. Вот тебе мотивирующий видосик https://www.youtube.com/watch?v=7TXEZ4tP06c
А что ему рисовать? Хуи на стенах?
Навигация по элементам есть, как можно заметить и в левом нижнем углу по списку, так и подчеркивание гиперссылок при наведении мышки +ctrl
Ночной ПРОтип - чтобы автодополнение работало, надо подсказать ему кастом типа через "as ИмяТипа" как выделено строчкой выше. Динамический язык же.
На самом деле все оказалось намного проще, надо просто добавить в проект картинку шрифта, и вот такой файл, сохранить с расширением .fnt
Потом просто загрузить текстовому контролу этот fnt в свойстве custom fonts (он определится как битмапфонт).
Чтобы картинка осталась пикселизированой, выбрать картинку в проекте, открыть у нее вкладку import, убрать галочку с filter, и нажать reimport.
Вся эта ботва также работает с юникодом, id это просто десятичный код символа.
В конце прилагаю скрипт на питоне для генерации по своим размерам. Заменить ✶ на звездочки.
===
goodneighbors_cc0.fnt
===
info face="FontName" size=16 bold=0 italic=0 charset="" unicode=1 stretchH=0 smooth=1 aa=0 padding=0,0,0,0 spacing=0,0 outline=0
common lineHeight=16 base=16 scaleW=192 scaleH=96 pages=1 packed=0 alphaChnl=0 redChnl=0 greenChnl=0 blueChnl=0
page id=0 file="goodneighbors_cc0.png"
chars count=96
char id=32 x=0 y=0 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=33 x=12 y=0 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=34 x=24 y=0 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=35 x=36 y=0 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=36 x=48 y=0 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=37 x=60 y=0 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=38 x=72 y=0 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=39 x=84 y=0 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=40 x=96 y=0 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=41 x=108 y=0 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=42 x=120 y=0 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=43 x=132 y=0 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=44 x=144 y=0 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=45 x=156 y=0 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=46 x=168 y=0 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=47 x=180 y=0 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=48 x=0 y=16 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=49 x=12 y=16 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=50 x=24 y=16 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=51 x=36 y=16 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=52 x=48 y=16 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=53 x=60 y=16 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=54 x=72 y=16 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=55 x=84 y=16 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=56 x=96 y=16 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=57 x=108 y=16 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=58 x=120 y=16 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=59 x=132 y=16 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=60 x=144 y=16 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=61 x=156 y=16 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=62 x=168 y=16 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=63 x=180 y=16 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=64 x=0 y=32 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=65 x=12 y=32 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=66 x=24 y=32 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=67 x=36 y=32 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=68 x=48 y=32 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=69 x=60 y=32 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=70 x=72 y=32 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=71 x=84 y=32 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=72 x=96 y=32 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=73 x=108 y=32 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=74 x=120 y=32 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=75 x=132 y=32 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=76 x=144 y=32 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=77 x=156 y=32 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=78 x=168 y=32 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=79 x=180 y=32 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=80 x=0 y=48 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=81 x=12 y=48 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=82 x=24 y=48 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=83 x=36 y=48 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=84 x=48 y=48 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=85 x=60 y=48 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=86 x=72 y=48 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=87 x=84 y=48 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=88 x=96 y=48 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=89 x=108 y=48 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=90 x=120 y=48 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=91 x=132 y=48 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=92 x=144 y=48 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=93 x=156 y=48 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=94 x=168 y=48 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=95 x=180 y=48 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=96 x=0 y=64 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=97 x=12 y=64 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=98 x=24 y=64 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=99 x=36 y=64 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=100 x=48 y=64 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=101 x=60 y=64 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=102 x=72 y=64 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=103 x=84 y=64 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=104 x=96 y=64 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=105 x=108 y=64 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=106 x=120 y=64 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=107 x=132 y=64 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=108 x=144 y=64 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=109 x=156 y=64 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=110 x=168 y=64 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=111 x=180 y=64 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=112 x=0 y=80 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=113 x=12 y=80 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=114 x=24 y=80 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=115 x=36 y=80 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=116 x=48 y=80 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=117 x=60 y=80 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=118 x=72 y=80 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=119 x=84 y=80 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=120 x=96 y=80 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=121 x=108 y=80 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=122 x=120 y=80 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=123 x=132 y=80 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=124 x=144 y=80 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=125 x=156 y=80 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=126 x=168 y=80 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=32 x=180 y=80 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
===
gen_fnt.py
===
TABLE_W=16; TABLE_H=6; CHAR_W=12; CHAR_H=16; CHAR_STEP=9; FILE_NAME="goodneighbors_cc0.png" #TABLE_x = columns and rows in image; CHAR_x = char pixel dimensions; CHAR_STEP = how much pixels shift after printing one char
CHARSET=" !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ "
print("info face=\"FontName\" size=%s bold=0 italic=0 charset=\"\" unicode=1 stretchH=0 smooth=1 aa=0 padding=0,0,0,0 spacing=0,0 outline=0" % (CHAR_H))
print("common lineHeight=%s base=%s scaleW=%s scaleH=%s pages=1 packed=0 alphaChnl=0 redChnl=0 greenChnl=0 blueChnl=0" % (CHAR_H, CHAR_H, TABLE_W✶CHAR_W, TABLE_H✶CHAR_H))
print("page id=0 file=\"%s\"" % (FILE_NAME))
print("chars count=%s" % (TABLE_W✶TABLE_H))
loop_i_j=[print("char id=%s x=%s y=%s width=%s height=%s xoffset=0 yoffset=0 xadvance=%s" % (ord(CHARSET[I+J✶TABLE_W]), I✶CHAR_W, J✶CHAR_H, CHAR_W, CHAR_H, CHAR_STEP)) for J in range(0,TABLE_H) for I in range(0,TABLE_W)]
На самом деле все оказалось намного проще, надо просто добавить в проект картинку шрифта, и вот такой файл, сохранить с расширением .fnt
Потом просто загрузить текстовому контролу этот fnt в свойстве custom fonts (он определится как битмапфонт).
Чтобы картинка осталась пикселизированой, выбрать картинку в проекте, открыть у нее вкладку import, убрать галочку с filter, и нажать reimport.
Вся эта ботва также работает с юникодом, id это просто десятичный код символа.
В конце прилагаю скрипт на питоне для генерации по своим размерам. Заменить ✶ на звездочки.
===
goodneighbors_cc0.fnt
===
info face="FontName" size=16 bold=0 italic=0 charset="" unicode=1 stretchH=0 smooth=1 aa=0 padding=0,0,0,0 spacing=0,0 outline=0
common lineHeight=16 base=16 scaleW=192 scaleH=96 pages=1 packed=0 alphaChnl=0 redChnl=0 greenChnl=0 blueChnl=0
page id=0 file="goodneighbors_cc0.png"
chars count=96
char id=32 x=0 y=0 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=33 x=12 y=0 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=34 x=24 y=0 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=35 x=36 y=0 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=36 x=48 y=0 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=37 x=60 y=0 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=38 x=72 y=0 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=39 x=84 y=0 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=40 x=96 y=0 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=41 x=108 y=0 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=42 x=120 y=0 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=43 x=132 y=0 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=44 x=144 y=0 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=45 x=156 y=0 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=46 x=168 y=0 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=47 x=180 y=0 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=48 x=0 y=16 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=49 x=12 y=16 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=50 x=24 y=16 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=51 x=36 y=16 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=52 x=48 y=16 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=53 x=60 y=16 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=54 x=72 y=16 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=55 x=84 y=16 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=56 x=96 y=16 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=57 x=108 y=16 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=58 x=120 y=16 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=59 x=132 y=16 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=60 x=144 y=16 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=61 x=156 y=16 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=62 x=168 y=16 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=63 x=180 y=16 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=64 x=0 y=32 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=65 x=12 y=32 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=66 x=24 y=32 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=67 x=36 y=32 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=68 x=48 y=32 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=69 x=60 y=32 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=70 x=72 y=32 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=71 x=84 y=32 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=72 x=96 y=32 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=73 x=108 y=32 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=74 x=120 y=32 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=75 x=132 y=32 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=76 x=144 y=32 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=77 x=156 y=32 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=78 x=168 y=32 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=79 x=180 y=32 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=80 x=0 y=48 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=81 x=12 y=48 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=82 x=24 y=48 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=83 x=36 y=48 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=84 x=48 y=48 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=85 x=60 y=48 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=86 x=72 y=48 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=87 x=84 y=48 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=88 x=96 y=48 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=89 x=108 y=48 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=90 x=120 y=48 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=91 x=132 y=48 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=92 x=144 y=48 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=93 x=156 y=48 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=94 x=168 y=48 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=95 x=180 y=48 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=96 x=0 y=64 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=97 x=12 y=64 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=98 x=24 y=64 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=99 x=36 y=64 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=100 x=48 y=64 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=101 x=60 y=64 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=102 x=72 y=64 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=103 x=84 y=64 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=104 x=96 y=64 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=105 x=108 y=64 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=106 x=120 y=64 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=107 x=132 y=64 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=108 x=144 y=64 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=109 x=156 y=64 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=110 x=168 y=64 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=111 x=180 y=64 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=112 x=0 y=80 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=113 x=12 y=80 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=114 x=24 y=80 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=115 x=36 y=80 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=116 x=48 y=80 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=117 x=60 y=80 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=118 x=72 y=80 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=119 x=84 y=80 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=120 x=96 y=80 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=121 x=108 y=80 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=122 x=120 y=80 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=123 x=132 y=80 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=124 x=144 y=80 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=125 x=156 y=80 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=126 x=168 y=80 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
char id=32 x=180 y=80 width=12 height=16 xoffset=0 yoffset=0 xadvance=9
===
gen_fnt.py
===
TABLE_W=16; TABLE_H=6; CHAR_W=12; CHAR_H=16; CHAR_STEP=9; FILE_NAME="goodneighbors_cc0.png" #TABLE_x = columns and rows in image; CHAR_x = char pixel dimensions; CHAR_STEP = how much pixels shift after printing one char
CHARSET=" !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ "
print("info face=\"FontName\" size=%s bold=0 italic=0 charset=\"\" unicode=1 stretchH=0 smooth=1 aa=0 padding=0,0,0,0 spacing=0,0 outline=0" % (CHAR_H))
print("common lineHeight=%s base=%s scaleW=%s scaleH=%s pages=1 packed=0 alphaChnl=0 redChnl=0 greenChnl=0 blueChnl=0" % (CHAR_H, CHAR_H, TABLE_W✶CHAR_W, TABLE_H✶CHAR_H))
print("page id=0 file=\"%s\"" % (FILE_NAME))
print("chars count=%s" % (TABLE_W✶TABLE_H))
loop_i_j=[print("char id=%s x=%s y=%s width=%s height=%s xoffset=0 yoffset=0 xadvance=%s" % (ord(CHARSET[I+J✶TABLE_W]), I✶CHAR_W, J✶CHAR_H, CHAR_W, CHAR_H, CHAR_STEP)) for J in range(0,TABLE_H) for I in range(0,TABLE_W)]
Спасибо, няша! Родина тебя не забудет.
> не знаю какую игру делать. я программист
Ты - треугольник.
Многоугольники охотятся за тобой.
Постигни искусство вертушки и заряди им в щщи!
https://www.youtube.com/watch?v=5CKJ4ulHO28
> Как кастовать не нашел. Как быть?
Попробуй не использовать var. Прописывай тип явно.
Spatial collider = raycast.GetCollider();
или
Node2D collider = raycast.GetCollider();
Поищи, есть ли в сборке шаблонизированная GetCollider<T>? Если есть юзай её, выводя нужные тебе типы.
> Как кастовать не нашел. Как быть?
И да, вот так кастовать:
https://docs.microsoft.com/ru-ru/dotnet/csharp/programming-guide/types/casting-and-type-conversions
Он даёт тебе ссылку на экземпляр базового класса, иначе говоря, он даёт тебе ссылку на данные, но не предоставляет интерфейса. Чтобы получить интерфейс, ты должен ПРИВЕСТИ базовый класс к желаемому тебе дочернему. В ссылке на МСДН выше это всё объяснено.
>>39660
Пожалуйста! Обращайтесь в истинную веру!
Чтобы спрайты лежали в папочках, можно было отредактировать их, перезапустить билд и они подтягивались.
Хочу отдать билд художнику побаловаться.
Не работает без редактора, видимо ресурсы дублируются в .import и не переимпортируются без запущенного редактора после изменения.
Блять, редактор прост, как швейцарский армейский нож. Хули твой художник так туп? Научи его открывать проекты в редакторе.
> думаю над решением проблемы
Да что тут думать? В одном из первых тредов приводил пример, как создавать текстуры в рантайме из внешних пикч. Только зачем анону ебаться с этими велосипедами, если проще и быстрее научить художника открывать проект в редакторе. Не сложнее, чем открыть кино в видеоплеере. Охуеваю с зумеров. Просто пиздец!
Но ведь поебаться с велосипедами это так по кайфу для бумеров. Я бы вообще взял класс image.cpp и на его основе сделал модуль-автоимпортилку при запуске, только времени нет
https://youtu.be/WoVMAUJeqTU
в чем смысл делать видео состоящее из скрола статьи?
и его еще и лайкают - что с людьми не так? открыть статью никак, надо ее смотреть через ютуб?
Зумеры же. Клиповое мышление. Для нас бумеров там ссылка на статью в описании.
на каком безрыбье? Ты можешь открыть саму статью и за пять минут все нужное прочесть.
Ну или открыть получасовой видос чтобы посмотреть на эту же статью под гундявого картавого петросянящего тянущего диктора.
Мой выбор очевиден - я прочел статью...
Но вот мир почему-то выбирает видосы (сейчас увидел такое же зачитывание патчноута по вышедшему юнити 2019.3 - прям в таком же формате - что-то там туда-сюда скросит в патчноуте)
меня просто шокирует эта мода на видосы.. Особенно по программированию - это же пиздец как уныло учиться программированию по видео: то что пишется за 5 минут, в видосе мусолится по полчаса
(люди реально тратят 28 минут жизни на то чтобы узнать как писать цикл for на C#? они больные?
>на каком безрыбье?
Ну накинь еще каналов для индюков, про обзоры всяких юнити и пэйнтеров и годотов, даун. Увидел один ролик и начал недовольно пердеть ртом, уебок.
Видосы - это интернет-аналог лекций в вузике. Не нравится - не смотри. Но от видосиков уже не уйти. Их популярность будет только расти.
Жрать говно тоже становится популярным и от этого не уйти.
Так вот. В моём так сказать "роад-мапе" заложено, что выводить готовые диалоги программа сможет либо в жсон-файлы, либо в БД. И вот по жсон-файлам у меня возникла идея, как бы прикрутить к этому делу схемы? Мне не нравится, что сейчас у меня структура выходного файла прибита гвоздями к коду. Я хочу, чтобы у меня в отдельной панели настроек имелась схема, в которой описывались бы элементы выходного файла и их поля. Согласно этой схеме строился бы интерфейс ввода данных в диалог и конечно же строился бы сам выходной файл. При загрузке сохранённого файла, он бы загружался по схеме и предупреждал о несоответствии. Схемы предполагаю хранить в отдельных файлах в директории конфига программы. Я в принципе не вижу никаких непреодолимых препятствий сделать это всё, однако предлагаю обсудить паттерны и подходы для реализации этого. Ну, чтобы не изобретать велосипедов. Буду рад не только постам, но и полезным ссылкам.
Занимаешься хуйней без задач уже два года.
Достаточно просто сделать загрузку диалогов из файла, и писать их ручками в json/yaml, зачем тратить годы на визуальный редактор?
Давно бы уже игру доделал за это время, и сейчас бы лежал в гамаке на Багамах.
> Достаточно просто сделать загрузку диалогов из файла, и писать их ручками в json/yaml
Я посмотрю на тебя, как ты будешь для эрпогэ на 50+ часов геймплея писать разветвлённые диалоги с несколькими концовками и перекрёстными ссылками, в зависимости от этапов игры. Ручками. В блокноте.
>Видосы - это интернет-аналог лекций в вузике.
не аналог:
- преподаватели готовятся к лекциям а не "ну эм наверное тут вот так почему то не работает".
- у них есть к этому способности и навыки
- есть живое общение (ради которых лекции и существуют)
- всё равно учатся по учебникам, а не маханиям рук преподавателя перед доской. преподаватель объясняет непонятные вещи из учебника, а не учит с нуля.
Видосы по программированию - это убийца времени, потому что любая тема тянется из-за формата видео (а еще и время на перепечатывание кода с экрана с попытками поймать нужную секунду кадра).
Тратить один или два часа на тему которую можно было прочесть за пару минут.... В программировании каждая минута важна
видосы это телешоу, а не обучение. И те кто хотят учится по видосам - на самом деле не хотят, им нужно только зрелище (ну там поржать над шутками автора и т.д.)
И это не визуальный редактор, а классический, по паттерну "master-detail".
> Ручками. В блокноте.
Именно так, только не в блокноте, а в vscode, с подсветкой, поиском, сворачиванием блоков и прочими фичами. И делать буду естественно не один файл на 100000 строк, а буду разбивать на отдельные маленькие файлы для каждого персонажа/катсцены. Я же не долбоёб.
> для эрпогэ на 50+ часов
Ты сначала сделай хотя бы игру на пару часов геймплея. У тебя за два года вышло 0 часов геймплея, ты с такими темпами 50 часов за остаток жизни не доделаешь.
> преподаватели готовятся к лекциям а не "ну эм наверное тут вот так почему то не работает"
жыды-квест готовится к своим видосам. Не равняй под одну гребёнку всех. Обидно, конечно, что русскоязычные ютуб-лекторы мычат. Селяви.
> есть живое общение
В комментариях.
> всё равно учатся по учебникам
Спорим об одном и том же. На лекции послушал общую инфу, обсудил. И идёшь учить матчасть по учебникам. Никто и не спорит.
Ты пидар тупой, я тебе написал, что у него есть подробные уроки с разбором движков, а это просто новости кто сам не мониторит.
Но ты потерял не день, а два года, за которые вполне можно было сделать полноценную игру.
Вот щас бы воспринимать поговорки буквально. Это ты что ли тут топишь за ютуб-туториалы вместо нормального обучения?
>>И идёшь учить матчасть по учебникам. Никто и не спорит.
но в видео уроках не так. Типа - посмотрел видосы и уже типа все умеешь
>>39884
>что русскоязычные ютуб-лекторы мычат
зарубежные тоже не ок - вечно восторженно взахлеб базарят- уши режет. А еще их вечная английская лыба....
https://www.youtube.com/watch?v=AD4JIXQDw0s
>что у него есть подробные уроки с разбором движков
то что я у него на канале посмотрел - это не обзоры движков, это именно зачитывание чужих статей, плюс пара тыков мышкой иногда.
Потому что ты слепой уебан .
>>А мог бы игры делать...
ну конечно же ты еще можешь смотреть 80 часов видео по json-schema вместо одного учебника
Ох я проебался. Оказывается я из мастера выкачал уже 4.0.dev, а не 3.2.
Беру простой чисто 2Д платформер, рисую карту в tiled экспортирую в проект как набор tilemap'ов. Далее, если экспортировать под пека, выдает стабильные 60фпс, почти на чем угодно. Если же экспортирую под android или html5, то получаю дикие лаги с падением fps до 20 и ниже. Если вместо тайлмапов, просто кидать большую текстуру (экспортирую карту из tiled'а как один большой png), тогда все работает почти нормально. В html получаю fps = 60 (проседания только если еще несколько страниц в браузере открывать), в андроиде же все равно fps не стабилен где-то в районе 50-60fps. Причем на разных устройствах по разному. Причем на более слабых иногда даже больше бывает, чем на более мощных. При том что дело именно в отрисовке, на рассчет одного физического фрейма уходит максимум 0.004с, даже если физику выкрутить на 120). Сразмерами чанков тайлмапов пробовал играться, ни на что не влияет.
Можно ли вообще добиться стабильных 60fps на андроиде и как под это дело проект оптимизировать?
Пробовал тайлмапы создавать не в tiled'е, а непосредственно в годоте - та же самая фигня.
Сам тайлсет если, что идет единым атласом.
Андроидопроблемы.
Не рекомендую делать игры для андроида. Делая игры на проприетарный гуглозондовый андроид, ты предаёшь своих пекабратьев. Отлучаю тебя от церкви ГНУ ЖОПАЕЛЬ, отступник. Пиздуй нахуй. Навсегда.
Ну вообще изначально планировал пару слоев параллаксного бэкграунда. Плюс 3-4 слоя самой карты. Плюс слой фореграундного параллакса. Но смысл в том, что данная проблема появляется даже при наличии всего одного тайлмапа на сцене.
Т.е. даже если я сделаю кучу слоев но большими текстурами/картинками - то производительность в принципе норм и держится близко к 60 fps (на одном слабом старом девайсе, даже, каким-то образом, показало 66fps при включенном vsynce, я х.з. как такое может быть). Как только заменяю хотя бы один слой карты на тайлмап, фпс тут же проседает до 20-ки. Даже на достаточно мощных устройствах.
В поиске нашел только вот такие тикеты:
https://github.com/godotengine/godot/issues/7885
https://github.com/godotengine/godot/issues/26620
Но в них нихера решения нету.
Да, игр полон тред.
1) Для тех кто использует плагин для импорта тайлмапов из tiled'a. При переходе на godot 3.2 все ваши карты пойдут по пизде, но поправить это несложно.
Ищете в вашем проекте следующий файл скрипт:
\addons\vnen.tiled_importer\tiled_import_plugin.gd
В нем находите строку:
options.apply_offset = true и меняете на false
Затем очищаете каталог .import и открываетет проект заново. Все должно быть нормально.
2) Так же если вы используете touchscreenbutton с текстурами на кнопках и какой-нибудь формой в свойстве shape с флагом centered, то будьте готовы, что выши контролы уедут в сторону. Т.е. shape будет отображаться по центру текстуры в редакторе, а вот реагировать она будет как будто она в левом верхнем углу. В бестекстурных кнопках такого не наблюдается.
Это то, что вылезло на моих проектах. Может есть еще какие-нибудь подводные камни, я хз.
А какая версия годота, 3.1 хотя бы? Какой рендерер, gles2? Скрипты что то с тайлами делают или ты только рендер тестишь?
>Обновляться во время работы над серьёзным проектом
Ну такое.
А вообще, осенью интересовался тайледом, но не понял, чем он лучше встроенного редактора. Обесните плиз.
> Это то, что вылезло на моих проектах. Может есть еще какие-нибудь подводные камни, я хз.
На моём проекте вылезло вот что: Я использовал неявный каст StreamTexture на ImageTexture и в 3.1. вопросов не было, а в 3.2. мне показало ошибку компиляции. Видимо, типизацию доработали.
>>Обновляться во время работы над серьёзным проектом
>Ну такое.
А что такого. Проект все равно под контролем версий, миграция отдельной веткой идет, откатить назад вообще не проблема, тем более, что по факту изменения мизерные.
>А вообще, осенью интересовался тайледом, но не понял, чем он лучше встроенного редактора. Обесните плиз.
Возможностей редактирования карты в разы больше. Намного удобнее встроенного редактора. Во встроенном редакторе можно накидать простенькую карту, но вот если захочешь ее изменить, то это будет боль.
> Возможностей редактирования карты в разы больше. Намного удобнее встроенного редактора.
Пойду ещё раз пересмотрю туториалы. Может я с наскока чего-то недопонел.
Был 3.1 сейчас 3.2 - сэйм щит.
Gles 2. Пробовал 3-й - результат был может быть на пару кадров лучше.
Скрипты с картой ничего не делают. Только персонаж по ней гуляет туда сюда и все. Физика стандартная платформенная.
Завтра прогоню пару тестов с разными вариантами и подробнее распишу, что и как с цифрами.
А еще по плагину поясни. Он экспортирует полностю готовую карту или мне всё равно придётся ебаться с настройкой коллизий, окклюзий света, навполигоном?
Уже сам загуглил.
> Физика стандартная платформенная.
Коллижн шейпы у тайлов? Хотя вроде ты пишешь физика не тормозит. А клетки какого размера?
Вообще про твою проблему пишут много, пробуй менять квадрант, они же чанки (начни с 16 или 32, или 8), ставить целочисленные camera zoom, подумай над увеличением размера клетки (меньше клеток на экране = быстрее), отключи Ysort если без него можешь обойтись. Пока не знаю что еще посоветовать. Можно включить сжатие тектур, но вряд ли поможет.
Да тяжело понимаю. но твоя жопа теперь в полной их власти
Ну и нахрена это надо, когда есть б-жественный итч.ио, на который можно билды заливать по одному клику мыши и вдобавок тебе не будут тыкать пачкой говнорекламы в лицо сходу с главной страницы?
Я верил и верю в годот!
>Коллижн шейпы у тайлов? Хотя вроде ты пишешь физика не тормозит.
Все коллижен шейпы идут отдельным слоем, и не привязаны к тайлам. Формы у всех либо прямоугольники, либо трапеции с редкими закруглениями.
>Вообще про твою проблему пишут много,
Пишут то много, а вот решения нет. Судя по github'у они просто пересылают друг друга от тикета к тикету и никто решением не занимается.
>пробуй менять квадрант, они же чанки (начни с 16 или 32, или 8),
Пробовал, не дает эффекта при минмальном 8 и максимальном 128 эффект одинаковый.
>ставить целочисленные camera zoom,
Не использую, везде один к одному.
>подумай над увеличением размера клетки (меньше клеток на экране = быстрее),
У меня размер тайлов 16 х 16, если делать больше, то проще сразу в одну большую картинку конвертить.
>отключи Ysort если без него можешь обойтись.
не использую, слои просто разнесены по разным Z level'ам
>Можно включить сжатие тектур, но вряд ли поможет.
Не пойдет - пиксельарт
---------------
Погонял сегодня разные варианты, получаются вот такие цифры:
1)Карта нарисована тайлмапами
режим stretch 2D = 10...15fps
режим stretch Viewport = 15...20fps
2)Карта сделана несколькими большими текстурами
режим stretch 2D = 35...40fps
режим stretch Viewport = 50...60fps (c периодическими падениями до 45)
-------
Физика работает отлично, максимум на один физический фрейм уходит 0.005сек (при 120 фреймах в секунду), инпут лага нету. Т.е. затык именно в отрисовке.
-------
На компе во всех режимах стабильные 60fps
-------
Похоже придется делать по последнему варианту. Написать скрипт для tiled'а, чтобы он автоматом сохранял мне каждый слой карты в отдельную картинку, и из них уже сцену лепить. Плюс возможно сделать в настройках опцию для залочивания FPS на 40 или 30 (это кстати вообще возможно в годоте? ), чтобы не было рывков, т.к. насколько я понял добиться постоянных 60fps от андроида почти нереально.
>Коллижн шейпы у тайлов? Хотя вроде ты пишешь физика не тормозит.
Все коллижен шейпы идут отдельным слоем, и не привязаны к тайлам. Формы у всех либо прямоугольники, либо трапеции с редкими закруглениями.
>Вообще про твою проблему пишут много,
Пишут то много, а вот решения нет. Судя по github'у они просто пересылают друг друга от тикета к тикету и никто решением не занимается.
>пробуй менять квадрант, они же чанки (начни с 16 или 32, или 8),
Пробовал, не дает эффекта при минмальном 8 и максимальном 128 эффект одинаковый.
>ставить целочисленные camera zoom,
Не использую, везде один к одному.
>подумай над увеличением размера клетки (меньше клеток на экране = быстрее),
У меня размер тайлов 16 х 16, если делать больше, то проще сразу в одну большую картинку конвертить.
>отключи Ysort если без него можешь обойтись.
не использую, слои просто разнесены по разным Z level'ам
>Можно включить сжатие тектур, но вряд ли поможет.
Не пойдет - пиксельарт
---------------
Погонял сегодня разные варианты, получаются вот такие цифры:
1)Карта нарисована тайлмапами
режим stretch 2D = 10...15fps
режим stretch Viewport = 15...20fps
2)Карта сделана несколькими большими текстурами
режим stretch 2D = 35...40fps
режим stretch Viewport = 50...60fps (c периодическими падениями до 45)
-------
Физика работает отлично, максимум на один физический фрейм уходит 0.005сек (при 120 фреймах в секунду), инпут лага нету. Т.е. затык именно в отрисовке.
-------
На компе во всех режимах стабильные 60fps
-------
Похоже придется делать по последнему варианту. Написать скрипт для tiled'а, чтобы он автоматом сохранял мне каждый слой карты в отдельную картинку, и из них уже сцену лепить. Плюс возможно сделать в настройках опцию для залочивания FPS на 40 или 30 (это кстати вообще возможно в годоте? ), чтобы не было рывков, т.к. насколько я понял добиться постоянных 60fps от андроида почти нереально.
Погоди, я немного недопонел. А ты пробовал делать стандартные тайлмапы и тестить их в андроиде? Может там сами тайлмапы тормозят и tiled не при чём вообще?
В срачетреде вчера уже обсудили. УЕЧ будет с годоскриптом! Hell YEAH!!
Да пробовал. Такая же фигня. Тем более что из tiled'а они как раз в стандартные тайлмапы и импортируются.
То есть, tiled и tiled exporter не при чём и их не нужно указывать в гугле при поиске решения. Тормозят сами тайлмапы.
Да.
---
Попробовал на gles3 переделать. Та же фигня. В некоторых вариантах даже на 5...10fps порисовка падает.
Мобильные процессоры какие-то странные. Вроде мощ есть. Но в ряде задач они дичайше тормозят. По видимому реализация тайлмапа как раз использует такие подходы, которые ОК для классической архитектуры пека и неподьёмны для мобильной. Я честно говоря, не особо разбираюсь в железе, так что могу посоветовать только отказаться от использования тайлмапов. Конструируй тайлмапы и конверитруй их в картинки. Юзай спрайт для помещения картинки целиком на игровое поле. Интерактивные объекты делай отдельными спрайтами.
И ещё к тебе просьба, попробуй собрать бенчмарк тайлмапов от анона из прошлых тредов под андроид и замерить фпс https://govdot.herokuapp.com/4Anon.rar
>Пробовал, не дает эффекта при минмальном 8 и максимальном 128 эффект одинаковый.
А 16 и 32 пробовал?
Ладно вот такой вопрос - а какой у тебя аппарат и сколько у него RAM (в идеале сколько свободной).
https://github.com/godotengine/godot/pull/35696
> Godot 2D performance is usually bottlenecked by the methods used with OpenGL, there are currently drawcalls per quad.
> drawcalls per quad.
Я слышал, конечно, что говнотя это плохо, но не ожидал, что настолько.
У меня нет слов.
Понимаешь.
В универе, сука.
Первокуры дебилы.
На OpenGL 1.0 с его glVertexf2/3
УЖЕ, БЛЯДЬ, ДОГАДЫВАЛИСЬ ЧТО МОЖНО, СУКА ПОЛОЖИТЬ ВСЕ ТАЙЛЫ В ОДНУ ТЕКСТУРУ А К ВЕРШИНАМ КВАДОВ-СПРАЙТОВ ПРИДЕЛАТЬ, БЛЯДЬ, ТЕКСТУРНЫЕ КООРДИНАТЫ И ХУЯРИТЬ ВСЕ КВАДЫ СРАЗУ.
Лучшее в мире советское образование, охоспаде. Оно было недоступно Хуану. Но на то и опенсорц - братушки из России подтянутся и пофиксят баги, а Хуанчик помержит.
Еще бы, такой обсёр, его еще месяца два в срачетреде поднимать на знамя боротьбы с говнотей будут.
1. Это не опенжл 1.0.
2. Ты вырвал фразу из контекста, не понимая как работает движок. Мнение о том как вася написал бы хеллоу ворлд очень важно для нас.
Тебе обсёр, а мне пиар и известность. Учись сынок, как делать просмотры на дизлайках.
Понимаешь, в двадэ можно сколько угодно спрайтов рисовать за один дравкол.
Даже в говномамонтном опенгле, в котором не поддерживается этот ваш инстансинг и мультидров.
>2. Ты вырвал фразу из контекста, не понимая как работает движок. Мнение о том как вася написал бы хеллоу ворлд очень важно для нас.
Движок работает как дебил, если он рисует 1 тайл за один дравкол.
Вась, я понимаю что ты увидел знакомое по хеллоу ворлду слово дравкол, и возбудился, но тайлмапы и так рисуются одним квадом, а то что ты там себе выдумал это дело десятое, еще раз повторю, что ты нихуя не понял сути пулл реквеста, который просто кеширует на стороне движка больше данных, чтобы меньше времени тратить на переключении состояний.
>Конструируй тайлмапы и конверитруй их в картинки. Юзай спрайт для помещения картинки целиком на игровое поле. Интерактивные объекты делай отдельными спрайтами.
Ну собственно я к этому решению и пришел.
----
>>40884
>И ещё к тебе просьба, попробуй собрать бенчмарк тайлмапов от анона из прошлых тредов под андроид и замерить фпс
Экспортнул проект 4anon под андроид в двух видах
Один под разрешение 1440x720, второй под 720х360 с растягиванием через viewport
(Проект не переделывал, просто в настройках изменил разрешение и передвинул контролы, чтобы они попадали в экран)
Экспортировал с debug-keystore
Результаты на пиках:
Для версии с меньшим разрешением рузультаты на 5-10 fps в первых двух сценах лучше, в сцене с тайлмапом - всего на пару кадров больше.
>А 16 и 32 пробовал?
Да, пробовал
>>40928
>Ладно вот такой вопрос - а какой у тебя аппарат и сколько у него RAM (в идеале сколько свободной).
проц: Mediatek MT6739 - 4x ARM Cortex-A53 @ 1.30Ghz
GPU: PowerVR Rogue GE8100
Разрешение 1440x720
Обьем встроенной памяти 16Гб (на момент запуска свободно >2Гб)
Обьем оперативки 2Гб (на момент запуска свободно 880 Мб)
Андроид 8.1.0
>В общем, надо подождать, чувак сделавший порталы, уже делает батчинг
Я посмотрел его изменения в коде, и меня сомнения мучают, Судя по коду и комментам выглядит так будто он просто следит пришла ли команда на смену текстуры в opengl и сравнивает ее с предыдущей, и если новая текстура совпадает со старой, то просто отменяется смену.
Я не спец в opengl и вообще, объясните кто разбирается - я правильно понял или я мудак и там что-то более толковое?
А то если я все-таки правильно понял, то это как-то совсем костыльно выглядит.
>Я не спец в opengl и вообще, объясните кто разбирается - я правильно понял или я мудак и там что-то более толковое?
это называется кешированием стейта. И да, оно толковое. Любое изменение стейта дергает видеокарту - это дорого. И видеокарта настолько тупа что без этого будет менять стейт даже если он такой же как уже установлено
Поэтому сначала придумали батчинг - чтобы одинаковые стейты сортировать по пакетам
Потом придумали вот это кеширование стейтов - чтобы не отправлять то что и так есть. Кеширование + батчинг + сортировка - позволят еще и уменьшить количество дерганий
(ну а потом придумали что все стейты надо ставить один раз и больше не трогать, появился термин pipeline и родились вулканы и дк12, где это легко в основу философии)
Твои подозрения обоснованны. Ты сам того не ожидая, вскрыл самую болезненную тему всего опенсорца в целом. Видишь ли, чтобы выкладывать исходники под открытой лицензией, надо понимать, что ты выбрасываешь на ветер труд, за который мог бы получать деньги. Мы, к сожалению не при коммунизме живём, и кушать за что-то надо. Поэтому в опенсорце есть два вида сорцев: спонсируемые и фанатские.
Со спонсируемыми всё ясно. Разрабу платит бабло крупная фирма, он делает проект и ему помогает сообщество. Выгоду имеют все. Разраб имеет хлеб с маслом. Корпорация имеет бесплатный софт, на разработку которого может влиять. Сообщество имеет бесплатный софт и дополнительную денежку на хлеб с маслом ибо любимый софт бесплатен, и в этот софт можно вносить правки и фиксы.
А фанатские сорсы часто пишутся фанатиками опенсорца, никем не спонсируются, фанатики живут на хлебе и воде (и бородавках с пяток). И частенько такие фанатии - поехавшие. И частенько они пишут костыли и на полном серьёзе считают их венцом творения.
Как мы видим по новостям, годот плавно перемещается от состояния поделки фанатика Хуана к профессиональному опенсофту под крылом майкрософта и эпиков.
>Как мы видим по новостям, годот плавно перемещается от состояния поделки фанатика Хуана к профессиональному опенсофту под крылом майкрософта и эпиков.
И к чему этот дурацкий вывод? Хуан всегда пилил годот профессианально за деньги.
>Как мы видим по новостям, годот плавно перемещается от состояния поделки фанатика Хуана к профессиональному опенсофту под крылом майкрософта и эпиков.
А кто возьмется переписывать тысячи строк Хуановского говнокода, которые уже сейчас делают годот непригодным для разработки игр?
У корпораций есть такой трудовой ресурс. Надо будет - пригонят индусов. Всё решаемо. Модуль за модулем с сохранением интерфейса перепишут. При этом новые модули будут с новым интерфейсом. Старый интерфейс пометят как deprecated и оставят для совместимости на пару мажорных версий.
В большом бизнесе всё решаемо.
Вопрос не в качестве кода, олень, а в том платят деньги разрабу или, нет. Хуангу и так платили, что должно измениться, он перестанет срать кодом?
У майкрософта уже есть бабилонджиэс, нахуй им годот, а эпики задонатили так крошки. Блендеру 3кк, хуангу 0.25кк.
Анон, анооон! А попробуй ещё экспортнуть в хтмл5 и запустить на андроиде. Тоже так всё печально будет?
Цель: выяснить источник тормозов на андроиде, аппаратный или софтварный
В по/рашу, хохлозависимый
В одном из issues попадалось, что тормоза тайлмапа возможно из-за неправильнного выделения памяти, соответственно если у него тайлмапы сжирают 400 метров, а всего на старте свободно 800, то возможно память просто закончилась совсем.
Там зависимость от количества клеток (т.е. обратно пропорционально размеру клетки), так какой то китаец писал, сам я не тестил.
Окей, скачал и запустил 4анон. Всё равно немного 84 мега. Нужны данные с андроида.
ладно окей, сажусь на годот для своей изометрической игоры
Ясно. Хреново.
https://twitter.com/reduzio/status/1225323368855068672
Никаких хейтерков нет. Есть люди, которые хотят пользоваться движком, но недовольны низкой производительностью. Как движка, так и разработчиков.
Наверное для тебя это будет открытием, но все люди мыслят по разному, есть те, кто действительно не представляют себе визуальные образы, а воспринимают все как логические цепочки.
> недовольны низкой производительностью
Дак пусть не делают эрпогэ с открытым миром и корованами. Рано ещё. Мини-игры пусть делают и не бугуртят.
Двачую. И как же здорово, когда два таких человека объединятся, один с образами и второй с логикой.
И ебут друг друга в жоппы
"Видеть" музыку - признак аутизма
>есть те, кто действительно не представляют себе визуальные образы, а воспринимают все как логические цепочки.
Нет.
А вот и не угадал, я хочу запилить несколько игрушек под GPL в F-Droid, а то там пустовато, а потом хвастаться количеством устанровок Годота.
Есть. Я лично видел таких в 2000х на форумах с регистрацией.
Блять, для тетриса не нужен высокий фрейм рейт. Ну по крайней мере на начальных этапах игры, когда скорость низкая. Но уж тайлмап точно не обязателен. Двигай фигуры по координатам, кратным длине квадрата из которого фигуры состоят. Мой Тетрис на тайлмапе, но исключительно по причине удобства. Можно и без него.
Ну я же не только тетрис хотел, а вообще разные олдовые аркадки. Понятно что придется написать свой тайлмап на спрайтах, просто думал воспользоваться готовым, просто как массивом клеток. А так он просто место в билде жрет.
Вообще, годот, как я понял, произрастает из аргентинского движка для казуальных игор под винду, уровня зумы, тривряд, для убивания времени в офисе, алавар ещё была контора, занимавшаяся подобным.
Поэтому совершенно не удивительно, что оптимизация под винду там хоть какая-то есть (для казуальных кликалок), а под андроидом - сорян. Не завезли. Под линуксом я сейчас тоже натыкаюсь на редкие, но обескураживающие недоразумения (например в конфиг записываются имена файлов в нижнем регистре, несмотря на заглавные буквы в именах, отчего в экспортированном проекте аудио невозможно найти на охуительной файловой системе, чувствительной к регистру, и звука поэтому нет).
Затянем пояса братие и ждём 4.0 с вулканом. Верим, ждём, надеемся.
>Затянем пояса братие и ждём 4.0 с вулканом. Верим, ждём, надеемся.
https://twitter.com/MostafaMMThabet/status/1225357645625929728
Можно считать что никакой преемственности нет. Все равно тормозит в данном случае только на андроиде. Было бы время поотлаживал бы, но пока некогда.
Вот-вот. Время андроидо-игор в самом разгаре и даже, возможно, слегка на спад уходит. А они только нашли деньги, чтобы основное пофиксить.
>>41521
Короче говоря, андроид пролетает. То-то я гляжу, Петя Сканер на ютубе, сначала с двадэ на тридэ перешёл, а потом вообще затих. Щас вот недавно анонс какой-то выкатил, попахивающий разводом на бабло. Видимо до него тоже дошло, что для андроеда годот пока ещё слишком сырой и решил стричь бабло на бессмысленных и беспощадных курсах, как это делают друзяшки Хуана.
Для олдовых игор 200 даже много. Можно и в сотню уложиться.
Например, тетрис. Ты посчитал площадь игрового поля 10х20, но большую часть времени заполнена треть-четверть поля. К 200 количество заполненных клеток приближается на грани проигрыша.
Не очень хочется чтобы фпс снижался в зависимости от заполненности поля. Да и в других аркадах типа арканоида обратная зависимость будет.
Тогда предлагаю два хардкорных варианта:
1. Отрисовывать шейдером.
2. Отрисовывать на канве.
Сам как-то хотел тряхнуть стариной и попробовать рисовать на канве, но поскольку я нацелен на пека, то оставил попытки и пользуюсь тайлмапами.
> Отрисовывать на канве.
Так оно ещё и рекомендуется для того же тетриса! Внезапно!
https://docs.godotengine.org/ru/latest/tutorials/2d/custom_drawing_in_2d.html
Не. Я чай пил. И ещё в ньюсаче раковал. Если честно, я не вижу смысла заглядывать. Ведь в годоте всё, абсолютно всё выводится через ГЛЕС-драйвер, выбираемый в правом верхнем углу. То есть, как бы ты не извращался с нодами, в конечном итоге всё выведется на видеокарту и ею аппаратно отрисуется. Кроме ЦПУ-партиклов в ГЛЕС2, которые введены недавно и по сведениям документации, рисуются программно.
Думаю что не очень сложно https://www.reddit.com/r/godot/comments/cz8o6e/how_to_get_child_scenes_transforms_from/
Буквально в прошлом треде обсуждали и перетекли в этот тред. Треды читать полезно. Даю ссылку на последний пост в цепочке: >>35481
Мы правда не называли это чанками, но я думаю, терминология тебе не помешает разобраться. Речь о пуле чанков, реализованном через ветвь нод в памяти, отдельную от дерева.
>интеллектуальную отрисовку только меняющихся тайлов.
Правда что ли? Прям как на GDI или в первом pygame, только я на pygame я сделал тетрис без этой техники дидов. Значит, там нет аппаратной поддержки(((
> Правда что ли?
Ну, пока не получается. Выходит говнокод. Ничо не рисуется, только один тайл. Дебажу...
Да это понятно, но тогда и смысл в годоте теряется. Я ж хотел шоукейс простого кода запилить.
Он держит в памяти только то, что явным образом держишь ты. Полная свобода по менеджменту чанками в твои руки. Отдалённые выгружаешь через queue_free() самостоятельно.
>>41573
>>41577
Короче говоря, интеллектуальная отрисовка по заветам GDI-дидов не потребовалась. Проблема оказалась тривиальнее, пикрелейтед.
Я кстати не уверен что рисовать на канве быстро. Это ж либо опенгл-примитивы, а я слышал они сильно тормозят, поскольку не треугольники, тогда и рисовать надо треугольниками даже линии и подгонять всякие антиалиасинги. Или рисовать в картинку и гонять текстуру каждый кадр.
Да, было 10 на 20, а я пиздюком мечтал, вот бы выпустили модель тетриса побольше. И вот, когда китайцы не доставляют, идёшь и реализуешь мечту самостоятельно!
У тетриса есть жоско прописанные правила, там поле определённого размера должно быть, как в шахматах.
У шахмат есть жестко прописанные правила, там расстановка фигур строго фиксирована.
То что ты запостил это уже не шахматы.
Недавно видел соревнования по реалтайм шахматам. Выглядело очень забавно. Там можно двигать все фигуры одновременно, но у каждой фигуры есть куллдаун после каждого хода.
>Права на Тетрис сейчас принадлежат Нинтендо
У них же были права только на версии для консолей, не?
Это как раз дополнительный аргумент почему в клоне тетриса не должно быть такое же поле.
Это традиция такая, раз в год постить беспруфные маняфантазии насчет тетриса? Опровергаемые пятью секундами в гугде.
> Права на Тетрис сейчас принадлежат Нинтендо
>В 1996 году он с Хенком Роджерсом (англ. Henk Rogers) создал компании The Tetris Company LLC и Blue Planet Software, пытаясь получить прибыль от бренда Tetris. The Tetris Company LLC (TTC) зарегистрировала слово Tetris как торговую марку. С тех пор несколько компаний купили у TTC лицензию на торговую марку, но законность игр тетрамино, которые не используют название Tetris, не оспаривалась в суде. По американским законам, игру нельзя защитить авторским правом (только запатентовать), поэтому основным имуществом компании является торговая марка Tetris. Несмотря на это, TTC преследует клоны игры под именами, непохожими на Tetris. В мае 2010 года юрист TTC послал[14] письмо в Google с требованием убрать с рынка Android Market все 35 клонов данной игры, хотя их имена не схожи с именем «Tetris». Впрочем, по сообщениям прес-службы корпорации Google, Сергей Брин послал Пажитнова нахуй.
Надо бы внести это в шапку ньюфаготреда, чтобы залётным неповадно было хуйню нести.
Скрин посыла нахуй вдогонку.
Не читай советских википедий. Гугли суд 2012, там американский судья перечислил признаки Тетриса защищаемые законом, в том числе поле 10 на 20
Загуглил. Там доебались до клонирования лука и фила. И действительно. Игры-клоны выпускать неправильно и подло. В этом вопросе я полностью поддерживаю сторону обвинения.
Теперь встречный вопрос. Как упомянул анон выше >>41657 я делал клон аппаратного устройства. Насколько юридически законно использовать этот клон как вспомогательную игровую активность в тридэ эрпогэ с открытым миром, домиками деревянными набигающими и корованами за 1999 руб в стиме?
В свое время, Pajitnov не смог запентовать свой invention потому что работал в Soviet Academy of Sciences, в которой все права передавались government сроком на 10 лет. А даже если бы и запатентовал, то срок 20 лет уже вышел.
Мдаа лоханулся паренек. Но вышел из ситуации в итоге неплохо.
https://www.youtube.com/watch?v=edJFocUd10s
они охуели, не успела еще видео не одного полезного выложить уже патреон блять пиарит. Хотябы онлифэнс бы пиарила с учетом что тян
Вместо того, чтобы делать игры, я реализую жсон-схему в годоскрипте.
Благодарствую, будем попробовать.
Что за хуйня с версией Годота 3.2? В версии 3.1 всё работало, теперь VehicleBody стоит на месте.
Надо галочку use as traction на колёсах пометить
У меня примерно такое же было при переходе с 3.0 на 3.1 с анимацией частиц. Бомбил сильно. Вся анимация перестала работать и выводился спрайтлист целиком. И все связанные с анимацией настройки ИСЧЕЗЛИ!!! Как же я бомбил! Как же я проклинал Хуана! А потом методом тыка обнаружил, что анимация подключается отдельным шейдер-ресурсом и только в режиме GLES3. В документации наверное и по сей день не отражено.
Что такое "Ассет"? Именно в годоте
1. Это цифровой ресурс (картинка, звук, 3д модель) - https://docs.godotengine.org/en/3.2/getting_started/workflow/assets/index.html
2. Готовый "строительный кубик", дающий какую-либо функциональность, обычно ставится как аддон в проект, либо плагин в редактор, изредка как модуль в движок. https://godotengine.org/asset-library/asset
Спасибо. Я тут посижу с вами пока не надоест
Я обычно могу расшифровать любые непонятные вопросы, но ты победил, признаю. Какие то квадратные скобочки внутри угловых, массивы из разнородных типов, объясни нормально.
<> - элемент типизирования по шаблону (быдляцк. "дженерик") примеры List<T> где List общий тип, Т уточняющий тип, List<String> означает типизировать общий тип списка до строкового.
[] - элемент описания массива, пример [T1, T2, T3] массив уточняющих типов для шаблона выше.
Gdscript позволяет создавать массивы из разнородных элементов. Но не умеет в типизирование.
Слоуфикс:
>>41977
> Я имею ввиду что-то типа PoolTypedArray<T1, T2, ... Tn>
Вот такое гдскрипт не умеет. Умеет шарп, но та задача, что я решаю в гдскрипте, в шарпе имеет готовые решения, тысячи их.
Решил проблему. Отбой. Любая проблема решаема, если немношк подумать.
Я знаю, что такое дженерики в C# (и в чем разница с шаблонами), но мне кажется ты пишешь про несуществующую фигню, что-то вроде Array<int OR float>. Ну да ладно.
В любом случае PoolTypedArray нету, есть только PoolRealArray, с другой стороны обычный Array таки хранит тип объекта, ты можешь его проверять через typeof(variable)
Именно так. Я просто взглянул на код под другим углом и добавил ещё один if typeof(bla-bla-bla) && data == int(data)
https://www.youtube.com/watch?v=SI1bmViq1JA
Пока думаю, как менять разрешение на мобильных, ибо у меня смена разрешение работает только на десктопе
Это довольно обширная тема, поэтому для начала опиши в общих чертах жанр, компоновку сцены и т.д., какие фичи используются.
Разрешение выставляется где-то в настройках проекта -> window. Также можешь попробовать с/без vsync.
Во-первых, думаю стоит переключиться в GLES2, понятно что отвалится довольно много фич. Среди них - частицы на gpu, текстуры глубины (останутся только нормали), HDR, продвинутые свойства материалов, как микрорассеивания, фильтр постпроцессинга цветовой гаммы, SSAO. Перестанут работать GIProbe, поэтому надо будет запекать тени, что тоже даст большой прирост. Также советуется уменьшать количество одновременно действующих источников света. Нельзя просто воткнуть 5 ламп которые светят на один куб.
Вроде бы для GLES2 надо отключить сжатие текстур ETC2 и S3TC, и вместо этого включить ETC
Подробнее тут https://docs.godotengine.org/en/latest/tutorials/misc/gles2_gles3_differences.html
https://docs.godotengine.org/en/latest/tutorials/3d/baked_lightmaps.html
Также надо будет проверить настройки неба. По-моему, я читал, что процедурное небо тормозит. Но точно не помню.
Так, что дальше. Если у тебя вид издалека, то придется сделать LOD. Он делается легко, надо добавить меши разной детализации к ноде, и скриптом переключать их видимость в зависимости от расстояния до камеры.
Если у тебя коридорный шутан, можешь попробовать перекомпилировать движок добавив модуль https://github.com/lawnjelly/godot-lportal/ и расставив порталы между комнатами.
Если у тебя много однотипных объектов - армии солдатиков, стаки кубов - то тебе надо воспользоваться MultiMeshInstance.
В годоте пока нет окклюжн куллинга, поэтому если у тебя домик в котором тысяча бутылочек, то надо тоже воспользоваться какой-то оптимизацией, или портальной, или подобием чанков.
Да, в случае таких оптимизаций, придется перенести коллижн шейпы уровня в отдельное дерево, а не детьми мешей. Чтобы объекты, которых не видно за стеной, не проваливались.
Если у тебя какие-то сложные рассчеты будут, будет смысл смотреть в сторону C# (пока на айфоны) или сразу C++.
Общие принципы - надо уменьшать количество материалов и шейдеров, переиспользуя их повторно для разных объектов.
Мобилки не любят прозрачность. Надо сводить количество прозрачных объектов к минимуму.
Подробности тут http://docs.godotengine.org/en/latest/tutorials/3d/3d_performance_and_limitations.html
Там также упоминается, что мобилки fillrate-bound, т.е. весь экран делится видеочипом на "квадраты" и мобилка не любит, когда много пикселей выводится в одном и том же квадрате. Т.е. не надо накладывать стеки спрайтов друг на друга.
Можно также почитать гайды мобильной оптимизации того другого движка. Это может включать в себя: побольше статической архитектуры с запеканием теней, поменьше источников света, особенно динамических, поменьше физических объектов, чтобы количество столкновений не росло в квадрате, заменять какие-то объекты на билборды (3д спрайты).
У Годота есть особенность прогрузки шейдеров и моделек при спавне. Чтобы этого не происходило, по видимости, надо делать по аналогии со Скайримом, в котором была комната куда складывались все трупы, а тут надо при загрузке уровня выстрелить всеми снарядами и заклинаниями скрыто от глаз игрока.
Вот все что я вспомнил сходу.
Это довольно обширная тема, поэтому для начала опиши в общих чертах жанр, компоновку сцены и т.д., какие фичи используются.
Разрешение выставляется где-то в настройках проекта -> window. Также можешь попробовать с/без vsync.
Во-первых, думаю стоит переключиться в GLES2, понятно что отвалится довольно много фич. Среди них - частицы на gpu, текстуры глубины (останутся только нормали), HDR, продвинутые свойства материалов, как микрорассеивания, фильтр постпроцессинга цветовой гаммы, SSAO. Перестанут работать GIProbe, поэтому надо будет запекать тени, что тоже даст большой прирост. Также советуется уменьшать количество одновременно действующих источников света. Нельзя просто воткнуть 5 ламп которые светят на один куб.
Вроде бы для GLES2 надо отключить сжатие текстур ETC2 и S3TC, и вместо этого включить ETC
Подробнее тут https://docs.godotengine.org/en/latest/tutorials/misc/gles2_gles3_differences.html
https://docs.godotengine.org/en/latest/tutorials/3d/baked_lightmaps.html
Также надо будет проверить настройки неба. По-моему, я читал, что процедурное небо тормозит. Но точно не помню.
Так, что дальше. Если у тебя вид издалека, то придется сделать LOD. Он делается легко, надо добавить меши разной детализации к ноде, и скриптом переключать их видимость в зависимости от расстояния до камеры.
Если у тебя коридорный шутан, можешь попробовать перекомпилировать движок добавив модуль https://github.com/lawnjelly/godot-lportal/ и расставив порталы между комнатами.
Если у тебя много однотипных объектов - армии солдатиков, стаки кубов - то тебе надо воспользоваться MultiMeshInstance.
В годоте пока нет окклюжн куллинга, поэтому если у тебя домик в котором тысяча бутылочек, то надо тоже воспользоваться какой-то оптимизацией, или портальной, или подобием чанков.
Да, в случае таких оптимизаций, придется перенести коллижн шейпы уровня в отдельное дерево, а не детьми мешей. Чтобы объекты, которых не видно за стеной, не проваливались.
Если у тебя какие-то сложные рассчеты будут, будет смысл смотреть в сторону C# (пока на айфоны) или сразу C++.
Общие принципы - надо уменьшать количество материалов и шейдеров, переиспользуя их повторно для разных объектов.
Мобилки не любят прозрачность. Надо сводить количество прозрачных объектов к минимуму.
Подробности тут http://docs.godotengine.org/en/latest/tutorials/3d/3d_performance_and_limitations.html
Там также упоминается, что мобилки fillrate-bound, т.е. весь экран делится видеочипом на "квадраты" и мобилка не любит, когда много пикселей выводится в одном и том же квадрате. Т.е. не надо накладывать стеки спрайтов друг на друга.
Можно также почитать гайды мобильной оптимизации того другого движка. Это может включать в себя: побольше статической архитектуры с запеканием теней, поменьше источников света, особенно динамических, поменьше физических объектов, чтобы количество столкновений не росло в квадрате, заменять какие-то объекты на билборды (3д спрайты).
У Годота есть особенность прогрузки шейдеров и моделек при спавне. Чтобы этого не происходило, по видимости, надо делать по аналогии со Скайримом, в котором была комната куда складывались все трупы, а тут надо при загрузке уровня выстрелить всеми снарядами и заклинаниями скрыто от глаз игрока.
Вот все что я вспомнил сходу.
А, вот что забыл. Не надо делать архитектуру уровня одним цельным мешем, а надо нарезать на кусочки, иначе не будет работать frustrum occlusion камеры.
Я возможно не очень удачно вываливаю такую инфу.
Попробуй упрощенный план:
1. Включить gles2
2. Уменьшить количество источников света и теней, убрать процедурное небо
3. Запечь тени, не пользоваться gi probe
4. Поменьше перерисовок в одном месте экрана, учитывая что то, что скрыто препятствием, все равно рисуется
5. Снизить количество вершин в мешах, размеры текстур.
5. При необходимости добавить lod/чанки/порталы/мультимеши
Также, прочитал, что в Годоте есть какой-то новый профайлер с синхронизацией, работает по usb-шнурку, суть такова - в редакторе отключаешь источники света, ноды с мешами, и тут же видишь что вносило вклад в тормоза.
Анончик, а можешь накидать подобных советов по оптимизации чисто 2Д проекта (пиксельный платформеро-квест) под мобилки?
А то из всех моих изысканий пока только подходит отказ от тайлмапов, заменой их на статичные пикчи (>>40875
). И то, стабильных 60fps все равно не получается добиться, постоянно идут провалы.
> постоянно идут провалы
Возможно, у тебя по логике игры грузятся объекты, например, пули для оружия, у которых в _ready() что-нибудь долгое вычисляется?
Всё очень просто, с китайцев спросу нет, они не люди, с тебя будет, поскольку ты хоть и сноуниггер но по прежнему белый и географически по прежнему в европе.
Да у тебя вроде и так все нормально было, просто телефон слабый? Пока слежу за прогрессом нового батчинга теперь тут https://github.com/godotengine/godot/pull/35957
Обещают 5х прирост на тайлмапах, сегодня соберу и погоняю.
Блеать. Я так и думал. То есть, поле 12х24 не поможет? Надо туда чисто свои игры пихать и внешний вид делать непохожий?
Качаю
git fetch origin pull/35957/head:batch-2d
git cherry-pick a78034682a7e7038c8b0111e42c3325bc92a2337
Гитобог, расшифруй команды. Я понял только что качаешь головную ветку бранча 35957
Сам полчаса составлял. 1 команда качает пулл-реквест 35957 и создает бранч под названием batch-2d.
Черри пик мерджит коммит под указанным номером оттуда в мой мастер, только эти 4 измененных файла, иначе он мне весь годот 4.0 выкачает.
>у тебя весь движок 3.2,
Да.
> эти 4 файла из 4.0
Тут я сам не до конца понял, но думаю так: пулл реквест привязан к мастеру
>lawnjelly wants to merge 1 commit into godotengine:master from lawnjelly:batch-2d
А в годоте гитхаб организован так, что мастер - это текущая рабочая ветка преальфы 4.0
Во всяком случае, когда я попробовал сделать просто pull этого PR, он мне скачал 26789+ изменений файлов. Возможно, если я переключусь на этот новый бранч batch-2d, То у меня будет мастер 4.0 + эти 4 измененные файла.
С нетерпением жду, чем всё закончится. Было бы круто подрубать фиксы из мастера в стабильную сборочку. И желательно, чтобы стабильность не херилась.
И ещё вопрос как лучше сделать вызов окна выигрыша. В моей реализации я просто включаю скрытую ноду окна выигрыша Короче говоря хочу меню выбора уровней как в Энгри Бердс и прочих подобных дрочильнях.
>Возможно, у тебя по логике игры грузятся объекты, например, пули для оружия, у которых в _ready() что-нибудь долгое вычисляется?
Вот именно, что нет. Просто статичный уровень, персонаж на нем и немного вывода на экран (НЕ в консоль) для дебага. И просто гуляя туда-сюда периодически получаю провалы на 5-10 fps.
-------
>>42076>>42076
>Да у тебя вроде и так все нормально было, просто телефон слабый?
вот конфигурация >>41078
не хайенд конечно, но в моем понимании тянуть, тянуть то должен.
-------
>>42076
>Пока слежу за прогрессом нового батчинга теперь тут https://github.com/godotengine/godot/pull/35957
>Обещают 5х прирост на тайлмапах, сегодня соберу и погоняю.
Анон, держи в курсе, пожалуйста. Если действительно хотя бы в 2-3 раза прирост будет, то тоже дерну эту ветку и попробую собрать.
-------------
> Дана одна сцена и меню выбора уровней. Необходимо, чтобы при нажатии, например, на кнопку уровня под номером "2" загружалась сцена с дополнительным условием, например расположение точки финиша на сцене.
Сцены, которые ты грузишь кнопками - это игровые уровни. Каждый твой уровень должен иметь функцию, которая в качестве аргумента принимает координаты точки финиша. То есть иметь единый интерфейс. После этого в коде кнопок у тебя стоит вызов этой функции.
Это только один из возможных вариантов.
Служебное меню, доступное в любой момент выполнения приложения должно быть синглтоном (великим и ужасным антипаттерном, за который не перезванивают). Добавляешь сцену с выбором уровней в автозагрузку, вешаешь на нее кнопку Esc например или Tab, по которой она появляется и скрывается. Из этой сцены кнопки выбора уровней задают параметр активной сцены в движке, которая есть игровой уровень, как написано выше. Второй вариант передачи параметров в игровой уровень: держать переменную в нём. Если загруженная главная сцена нуждается в параметре, она обращается к синглтону и берет эти данные у него. Я пользуюсь этим способом, у меня в авто загрузке всегда висит синглтон world, который, как видно из названия, держит в себе всю актуальную информацию об игровом мире (даже если это "мир" настольной игры). Этот же файл удобен как данные для файла сохранения. Способ я редко афиширую. Из-за антипаттерна в составе.
Не появилось ли годных эмуляторов андроида? Помню щупал парочку в дремучих нулевых, но работали они паскудно.
А хотя, что толку от эмуляторов? Они же на железе пекарни будут выполняться и там всё предположительно тормозить не будет.
Выставляю в редакторе силу тормоза (brake) 100500, а годот сбрасывает её до одного. Что блядь удивительного, так это то, что в оф. руководстве написано, что BRAKE ОКАЗЫВАЕТСЯ МОЖЕТ ПРИНИМАТЬ ЗНАЧЕНИЯ БОЛЬШЕ ОДНОГО, но как это сделать не уточняется. Только потом узнал, что значение надо менять не через редактор, а через К О Д
Пару лет назад пользовался Nox, чтобы на компе играть в какую-то ферму, правда со временем он разбухал все больше и больше, да и скорее всего сливает все что на него устанавливаешь китайским авторам. Из забавного юзкейса - нашел в дампе памяти 3д модельку и выковырял ее. Искал чит энжином по примерному значению float. Правда, к этому времени хакеры вытащили ее то ли расшифровав сетевой трафик, то ли риппером с буфера opengl и выложили
Я написал код:
# Called when the node enters the scene tree for the first time.
func _ready():
pass
const SPEED = 400
const GRAVITY = 12
const JUMP_POWER = 450
var velocity = Vector2()
var jumps = 0
func get_input():
var veloc = Vector2()
if Input.is_action_pressed('right'):
veloc.x += 1
if Input.is_action_pressed('left'):
veloc.x -= 1
return veloc*SPEED
func _process(delta):
var veloc = get_input()
velocity.x = veloc.x
velocity.y += GRAVITY
if Input.is_action_pressed('up'):
if jumps > 0:
velocity.y = -JUMP_POWER
jumps -= 1
velocity = $kinematic.move_and_slide(velocity)
var coll = $kinematic.move_and_collide(Vector2(0,0.001),true,true,true)
if coll != null:
jumps = 1
и он не работает, когда игрок движется влево или вправо.
Я написал код:
# Called when the node enters the scene tree for the first time.
func _ready():
pass
const SPEED = 400
const GRAVITY = 12
const JUMP_POWER = 450
var velocity = Vector2()
var jumps = 0
func get_input():
var veloc = Vector2()
if Input.is_action_pressed('right'):
veloc.x += 1
if Input.is_action_pressed('left'):
veloc.x -= 1
return veloc*SPEED
func _process(delta):
var veloc = get_input()
velocity.x = veloc.x
velocity.y += GRAVITY
if Input.is_action_pressed('up'):
if jumps > 0:
velocity.y = -JUMP_POWER
jumps -= 1
velocity = $kinematic.move_and_slide(velocity)
var coll = $kinematic.move_and_collide(Vector2(0,0.001),true,true,true)
if coll != null:
jumps = 1
и он не работает, когда игрок движется влево или вправо.
Так, ну на первый взгляд:
1. надо перенести это в _physics_process
2. В move_and_collide вектор надо домножать на delta (в move_and_slide не надо)
3. velocity который ты рассчитываешь, вообще никак не используется?
Неправильно. Ты просто указываешь направление на пол единичным вектором Vector2.DOWN если пол внизу. И после этого у тела заполняется свойство is_on_floor()
Другое дело, если тебе надо цепляться за стены. В таком случае тебе вообще лучше рассмотреть переход плеер-контроллера на полноценный RigidBody c полноценной симуляцией физики, чем ебаться с этим кинематическим велосипедом.
> Ты просто указываешь направление на пол единичным вектором move_and_slide(velocity, Vector2.DOWN) если пол внизу.
Быстрофикс.
Если что я первым делом заподозрил глюк отладчика и перезапустил редактор.
Бля, утро вечера мудренее. Это похоже компилятор скрипта преобразовал
> a = b()
> return a
в
> return b()
Под студией нормально вроде пишется, забудьте о моем глупом вопросе
Хотел вчера высказать такое предположение, но не думал, что гдскрипт делает такие оптимизации. Может, у тебя реально не тот if выполняется?
Да нет, иф именно тот.
Помогите новичку. Как писать на C#? Он выдаёт только GDScript
Надо качать с сайта версию с c#. Или собрать самому. И иметь в виду что c# на айфоны пока не сделали, а в webassembly в альфе.
Управление в 3д редакторе:
Пр. кнопка мыши - вращать камерой
Ср. кнопка мыши - вращать вокруг выбранного объекта
Шифт + Ср. кнопка мыши - перетаскивание камеры редактора
Пр. кнопка мыши + WASD - движение как в шутере
F - навести камеру на выбранный объект.
Вкусовщина. Мне гдскрипт своим внешним видом нравится Такой-то питоно-луа-паскаль. А вот слоупочность его - разочаровывает.
>>42098
Потестил сегодня вечером немного, результат не то чтобы впечатлил, но около x2 прироста на простейшем примере мигания клеточками дает.
карта 40x80 клеток (тайл 8x8 пикс)
14 fps Debug, no batch
26 fps Debug, batch
17 fps Release, no batch
33 fps Release, batch
карта 20x40 (тайл 16x16 пикс)
19 fps Debug, no batch
26 fps Debug, batch
23 fps Release, no batch
33 fps Release, batch
Ну неплохо. Лишние фпс не помешают. Удачно я зашёл перед сном.
Поменьше слушай пиздаболов.
Либо, если ты имеешь в виду, что у тебя уже есть .cs файл, то у каждой ноды, в свойствах, самое последнее свойство Script -> Load...
Move_and_collide для камеры не работает. Я очень тупой но мне очень нужно.
Опиши внятнее что ты делаешь.
Если контроллер игрока - то, логично, ты можешь приделать камеру нодой к kinematicbody игрока, которое умеет move and collide.
Если ты делаешь какую-то стратежку, то можно просто камере задавать translate.
Если у тебя катсцена, то вообще вроде бы можно нарисовать путь для пролета камеры анимацией.
Так а второй тогда как включать? Нет, ты не понял. Я хочу, чтобы оно всё автоматом шло. Я передаю сцене метки с координатами 1,2,3.., и они по очереди меняются
Разберешься, в общем все основное в первой половине, а во второй это уже как ты сам захочешь задавать области, их формы и тд
Я все сильнее упростил, теперь можно просто прикрепить к ноде со скриптом список всех триггерных зон, и они будут срабатывать по порядку. А там уже рисовать их на карте как душе вздумается.
мне проект уже 16 числа сдавать, вместо разработки твоего пикрелейтед я почти неделю работал над красивыми шейдерами
Да, шейдеры сложно, я их пока не осиливаю.
До конца разобраться не вышло, продолжу завтра.
Общая идея такая - импортируем одного персонажа, импортируем второго. Сохраняем анимацию первого в отдельный файл .anim. Загружаем второму. Он воспроизводит анимацию. Проблема с T-позами. Она начинает проигрываться с той позы, в которой был персонаж. Надо как-то их сначала в блендере приводить к T-позе перед экспортом, возможно.
> я не умею по нормальному учится, только вот так, опытом
Попробуй клиповым мышлением затащить:
https://www.youtube.com/watch?v=-wBBEmq8ku0
Спасибо за твой труд. Помни, что основная задача: прикручивать скелет без модели к модели без скелета во время выполнения игры в движке. Очевидно, что файл .аним будет жёстко привязан к определенным костям скелета. Собственно, это же мы наблюдаем при моддинге скайрима. Сначала мы ставим набор анимаций, ставим требуемый скелет, затем запускаем утилиту ФНИС, которая чототама волшебное генерирует, а по факту она генерирует именно аналог .аним-файлов.
И остаётся главный вопрос: как быть с весами вершин меша?
Кто-нибудь непременно делал. Но гуглить лень. Пример из документации ( https://docs.godotengine.org/ru/latest/tutorials/3d/using_multi_mesh_instance.html ) тебя не устраивает?
Напихай 15х23 например
А что бы и не постить, если в тему? Проект был написан за один вечер 3 месяца назад, выложен на итч и забыт. А тут ИТТ вскрылись новые данные, позволившие немного его пофиксить (перевести с тайлмапа на draw_texture). Что в свою очередь немношк пощекотало моё ЧСВ в том плане, что мой код настолько инкапсулирован, что мне было достаточно пары десятков минут, чтобы поменять способ отрисовки, не переделывая другие участки. В существующие реализации тетриса не смотрел принципиально. Знаю только что вся логика основана на проверках возможности поместить фигурку в новое расположение.
Весь тред ждёт героя, который выложит хоть что-то на gotm и расскажет нам. Может им будешь ты?
Да, там вроде все просто. Работает нормально. Только нет описания игры, реализации донатов и непонятно кто разработчик, когда находишь игру.
Нихуя не понел, как играть. Начинается бой. Кораблики куда-то летят. Мышкой скроллится игровое поле. И? Кнопка документации в главном меню не работает. Экранных подсказок нет.
Там тыкаешь мышкой на клетку, подсвечивается где можно строить здания. Строишь здания нажав на голубую кнопку с чертежами.
Как мне сделать так, чтобы было понятно?
Если выделить уже построенное здание, можно будет задавать маршрут корабликам.
> Как мне сделать так, чтобы было понятно?
Ну, как минимум, написать мини-гайд в главном меню. Идеально же - делать всплывающие подсказки по наведению на объекты мышкой и при достижении ключевых этапов игры. И не забыть добавить отключаемость этих подсказок в настройках, для продвинувшихся игроков.
Я записал твои советы. Пока что временно влил версию с "документацией". Надеюсь, она поможет кому-то.
>всплывающие подсказки по наведению на объекты мышкой
У него же вроде для андроида, какие еще всплывающие? Надо сбоку где то делать.
Я добавлю пропуск ходов. Версию с долгим "ходом" поставил для того, чтобы было время покликать. Чем дальше по ходам, тем больше микроконтроля и начинаешь не успевать. Так что пропуск хода - идеален.
Он имеет ввиду, как будто ты строишь здание, и если тебе не хватает денег - вылезает ошибка. Тоже самое с обучением - можно сделать, "если ход = 0 и уровень бота лоу - вывести подсказку на экран". Это действительно полезно. Потому что я завяз в разработке и не вижу пользовательского опыта, а уже кликаю по привычке и думаю, что все понятно.
Ну и поскольку игра предполагает ПвП то идеальный вариант уже известен и юзается большинством настольных онлайн-игр: есть отсчёт, по окончании которого начинается матч, и есть кнопка готов у каждого из участников. Если все участники кликнули кнопку - отсчёт обнуляется и матч стартует. При игоре с ботом - бот очевидно тоже нажимает эту кнопку у себя, завершив свои действия.
А я имею в виду, что подсказки в мобильных играх должны не вылезать в том месте, куда кликнули, а постоянно висеть, например, после выбора юнита.
Да. Я добавлю это в ближайшие дни. Пока что меня очень дико раздражает тот момент, что я совсем забыл про подсказки.
На данный момент ещё раз перебилдил. Теперь начало первого и второго хода оповестит Вас об основных двух возможностях - строить здания и изменять маршруты.
>>43110
Да, конечно. Я постараюсь поработать над этим.
Ваше впечатление как первого затащившего изи бота?
Основная концепция в трате ресурсов. Потеря здоровья главной базы до определённого числа наиболее выгодна, чем потеря ангара. Так что до 5 здоровья, вы стараетесь убивать вражеские ангары, а после защищать ими главное здание. Даже убийство 1 вражеского ангара даёт вам преимущество в 1 урон в ход, что позволяет полностью дефиться своими кораблями и наносить 1 урон, получая преимущество. Лоу бот использует раш тактику - все в мейн здание. Что и делает его лёгким.
https://www.youtube.com/watch?v=3EbrCXsgMV8
Управление пока подглючивает, неудобно. Зависает. Забывает проложенные маршруты.
Ты их достроил? Довел до базы врага нажав на конечную точку или здание? Как мне сделать так, чтобы это не было проблемой? всегда устанавливать маршрут?
Так же интересно, с какого устройства играл. Что значит "управление подглючивает"? Прям лаги? Или при нажатии не нажимается? Проблемы с выделением клеток или камерой?
> Как мне сделать так, чтобы это не было проблемой?
Индикация прокладки маршрута. Ячейка текущей конечной точки мигает, означая, что маршрут не проложен. При клике на ячейке со строением маршрут подсвечивается целиком, сигнализируя что успешно проложен. Если игрок бросил прокладку (или не успел) то маршрут докладывается автоматически по алгоритму бота.
Сейчас маршрут зеленый, если не проложен. Красный - текущий. Единственный способ, чтобы маршрут сбросился автоматически, поставить новое здание на маршруте (корабль не может пролетать через здания и перестраивает его до главной базы).
Я записал твои замечания. Спасибо, что делаете игровой опыт других игроков лучше.
Анон, чтобы избежать любых лицензионных претензий в будущем, и при этом, чтобы добавить в свою тридэ-эрпогэ ностальгии по 90м, сделай вымышленный игровой гаджет с картриджами-экранами. Суть токова. Без картриджа девайс не работает. Картридж вставляется сверху и на его лицевой части имеется ж/к-экран с раскладкой для игры и чип-контроллер. У девайса есть только кнопки для управления игрой. На локациях игры можно найти картриджи с такими играми, как крестики-нолики, пятнашки, и т.п. 2х-3х игор-картриджей будет достаточно, чтобы вызвать у игрока за 40 стойкий приступ ностальгии.
Сам код у area: overlaps_body(get.parent().get_node('car_vehiclebody'))
На первый взгляд никакой разницы, тоже сравнение строки со строкой, как и группы, но в случае изменения имён объектов, тебе придётся лезть в код и вспоминать, где у тебя имя захардкожено.
Так что совет в силе - юзай группы.
>>43160
Форматирование не поддерживается. Ебанутое ретроградство с поддержкой вакабамарк ещё и съедает звёздочки. Юзай пастебин или скрины.
Я с винды мышкой.
> Что значит "управление подглючивает"?
Было неудобно. Другой анон прав, не вполне понятно что ты в режиме прокладки маршрута и он не закончен. Я думал, что маршрут закончен, нажимал на другой домик, а маршрут начинает прокладываться взад. Нажимаю на кнопку в углу, а она не отжимается. И вообще необходимость прокликивать каждый домик, потом кнопку, потом пару точек, привело к тому что я не успеваю с 5 домиками прокликать всем маршруты.
Зависания были, не понял чем вызваны, улетают только первые корабли, задние стоят, при столкновении замирают, взрыв не показан, потом игра зависает. Сначала думал что это при повторной игре, но и при обновлении странички такое 2 раза словил.
Зарашил среднего бота без всякого ресурс менеджмента, просто посылая 3-х в обход, и строя заводы в передних двух клетках.
а, забыл, что надо просто free писать
queue_free не удалаяет ноду, а только ставит ее в очередь на удаление к следующему кадру. Это надо, чтобы игра не упала, если нода используется где-то в списках внутре движка.
Я не очень понял по описанию, но вроде суть примерно такая - в gdscript некоторые конструкции вида
var a = Class1.Class2.func()
теряют временный объект, поэтому надо разбить на
var a = Class1
var b = a.Class2.func()
Я не совсем понимаю, как мог забагаться взрыв. Я тоже тестил с винды, и такого у меня совсем не наблюдается.
Как мне сделать "понимание" "прокладки маршрута" лучше?
На данный момент пока что запиливаю, чтобы перепрокладывался только маршрут до точки, где его сбили зданием и складывался с куском, где его никто не трогал. Надеюсь, это облегчит участь игрока.
Действительно, ничего не дало.
А как ты хранишь скрипты, прямо в сценах? Попробуй просто перезагрузить проект.
> get_node(/root).add_child()
Это делается через автозагрузку в настройках проекта. Только через это меню ты сможешь добавить чайлд руту.
Покормил
Насколько я помню, все очень просто - нельзя вызывать add_child из ready, потому что, собственно, parent node is busy setting up children. Как и написано, ты можешь вызвать call_deferred("add_child"... чтобы добавить в следующем кадре, либо вызвать add_child в первом вызове _process.
Это копия, сохраненная 31 мая 2021 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.