1704529721509.png1,4 Мб, 1024x1024
Godot #44 # OP 926070 В конец треда | Веб
Добро пожаловать в тред любви и взаимопомощи, шампанского и оливьешки!
Шапка: https://hipolink.me/godothread
Предыдущий: >>919752 (OP)
Архивный: >>914638 (OP)
2 926072
>>926069 →
Не, ну это то понятно. Всегда надо ставить паузу на время сохранения.
3 926073
>>26072
Ну, в таких играх как "костры-бомжи-души", например, пауза не предусмотрена по геймплею, поэтому на такой случай, можно реализовать фишку с правами доступа. Один дополнительный энум и дополнительный свич{} в функциях.
4 926074
4 года назад, когда я был молодой и глупый, и ещё участвовал в ТВГ, я делая сайвы-лоады, пришёл к выводу, что это настолько фундаментальная система, что её нужно делать ДО начала работ над основной игрой.
Почему?
Потому что действующий и отлаженный механизм сохранений/загрузок подавляет необходимость в "магических числах". Обычно при быстром девелопе мы как делаем? "Нууу, пусть скорость будет 500, а высота прыжка 30, потом переделаю..."
А с отлаженным механизмом, мы можем удобно и красиво вписать:

> var move_speed = SLMGR.get_data(self, 500)


> var jump_speed = SLMGR.get_data(self, -30)


Здесь SLMGR (Save Load Manager) - это тот самый словарь-синглтон, и первым параметром приходит инстанс-нода, из которой при желании можно получить уникальное строковое имя и искать в базе данных как ключ. Второй параметр - дефолтное значение, которое вернётся, если не найдено в базе.

Магические числа вроде как и остались, а вроде как они уже и красиво обёрнуты в метод получения данных, и при необходимости уже файл данных может быть проанализирован отдельно, и скорректирован для задания начальных значений при старте новой игры, и не придётся лезть в скрипты, чтобы переделать где-то в глубине скриптов 500 на 450.
Мы можем внутри SLMGR установить состояние при котором он будет создавать все отсутствующие ключи, при обращениях к нему, и при запуске проекта получить огромный стартовый файл со всеми магическими числами ото всех объектов. Постоянно это делать не стоит. Из этого файла отбираем нужные ключи, правим и уже его грузим при старте игры как эталон начального состояния игровой сессии. Так можно легко реализовать уровни сложности, например, заложив в игру несколько стартовых эталонов с разными дефолтными значениями и пусть игрок выбирает из них перед стартом.
5 926075
>>26074

> > var move_speed = SLMGR.get_data(self, move_speed, 500)


> > var jump_speed = SLMGR.get_data(self, jump_speed, -30)



> и первым параметром приходит инстанс-нода, из которой при желании можно получить уникальное строковое имя, объеденить со вторым параметром и искать в базе данных как ключ. Третий параметр - дефолтное значение, которое вернётся, если не найдено в базе.



Быстрофикс.
6 926095
Делайте игры, игры сами себя не сделают. Год пройдет и не заметите, а игру так и не сделали.
7 926097
>>26095
Да делаю я делаю!
9 926116
>>26102
Нихуя полезного, автор похож на учителя информатики, обесняет так же хуёво.
10 926117
>>26116
Старые видосы Пети Сканера - и то полезнее.
11 926174
>>26116
новичкам норм для вката
yikshd13uxac1.gif13,1 Мб, 1134x629
12 926225
image.png3 Кб, 234x315
13 926227
>>26225
Как он сделал просвечивание персонажа через стены?
14 926230
>>26174
Я в этом вопросе последовательный сторонник Романа Сакутина: он говорил что так называемый "новичковый код" - это попытка безруких инфоцыган замаскировать свою безрукость. Грамотный, красивый, эффективный код именно новички поймут намного лучше.

Я не спорю, Сакутин сам тоже инфоцыганин, ни в коем случае не смотрите его. Пердаки сгорят нахуй. Я предупредил:
https://www.youtube.com/watch?v=RBk49B0lFaQ
15 926238
>>26227
Прозрачный спрайт персонажа на самом верхнем слое, в дополнение к основному или что-то вроде того.
16 926331
Новогодние праздники я посвятил фреймворку для шестиугольных карт.
Всё работает в нативной для хексов координатной системе:
q, r, s, где q + r + s == 0
Сделал рендеринг с нуля и всякие helper-классы.
Возможно когда-то оформлю это в полноценный аддон, потому что существующие решения меня не устраивают.

Сделал на этой основе простенькую генерацию мира в нативных для хексов координатах.

Ссылка для тех кто любит копаться в неоформленных проектах: https://github.com/1ort/hexgrid/
17 926339
>>26331

>1


Заверни эту на сферу, будет круто.
18 926346
>>26339
Да, у меня была такая мысль, только вот сферу невозможно замостить полностью только шестиугольниками. Понадобится, ЕМНИП 12 пятиугольников дополнительно.
Алсо есть вот такой вариант с псевдо-сферой: https://www.youtube.com/watch?v=mWIIy4eh6bE

Но тут мы имеем свои подводные в виде траблов со спрайтами.

Третий вариант - визуально оставить как есть, но добавить бесшовный wrapping по всем трём осям с возможностью сдвигать карту
19 926360
>>26346

> сферу невозможно замостить полностью только шестиугольниками


Видос не смотрел, может там про псевдосферу именно это говорится, что я напишу сейчас. Сферу можно получить "надуванием" куба. В годоте 3 в тайлмапе гексы получали сдвигом тайлмапа по рядам на половину длины. Всё остаётся квадратным, но полностью замощённая сфера - вуаля.
20 926364
>>26360

>Видос не смотрел


Там одного взгляда на превью достаточно чтобы понять что происходит
21 926365
>>26346
Попадалась странная статья, может ты что поймешь. https://mirror.xyz/avsa.eth/thyWt1xkoxjbV7Ai7AU4xEa-8t50Gj5dJCAj4mmbq-s
22 926449
>>26365

> mirror.xyz/avsa.eth


Чота ссыкотно такое открывать. Похоже на фишинг. Зарепорчу-ка я тебя. АБУ узнает своих.
1654744174363.png457 Кб, 1130x695
23 926462
>>26449
Судя по всему автор Web3- криптоанархист и в другом месте ее не постил. Понимаю твои опасения, вот скрин презентации, вроде бы тут вся суть. Остальное касается irl earth географии
image.png90 Кб, 1889x966
24 926487
>>26331
Теперь я умею генерировать сколько угодно островов на глобальной карте. Также могу генерить и тайлы-океаны. Каждый остров может иметь свои настройки (Только я этого пока не реализовал)

Реквестирую идеи, что можно из этого сделать
25 926489

>926487


Это 2D? Добавь высоту. Камеру сбоку поставь. Сделай что-нибудь в духе цивилизации.
26 926491
>>26489
Это 2д, значение высоты у каждого гекса есть. Цвет определяется по матрице высота - влажность (или температура) путём наложения двух шумов.

Вопрос больше про геймплей был
27 926494
>>26487
В будущем генератор планет
28 926550
>>26487

> что можно из этого сделать


Вселенную-наоборот с Толщеходами. Очевидно же.
Сделой ассет-заготовку для хекс-ртс-игор. Выложи в ассетлиб. Получай донаты.
29 926551
>>26491

> Вопрос больше про геймплей был


Идешь в АААА-тред >>605406 (OP) выбираешь подходящий кириллопост и реализуешь.
30 926553
Что можно использовать для уникальной идентификации сцен? Нодпас не катит - он может меняться. Нода как таковая тоже меняется, если ее сохранить и загрузить обратно то у нее сменится ее внутренний айди и годот это считает уже другой нодой. Подошел бы некий UUID, но его, как я вижу, нет у сцен.
32 926557
33 926558
>>26555
Эта штука лишь реализует тип uuid. С тем же успехом можно просто рандомное число той же размерности использовать.

Мимокрок
34 926561
>>26558
Тогда пусть генерирует уникальные айдишники на любом из онлайн-сервисов и вручную вписывает в свои сцены.
35 926584
>>26487

>что можно из этого сделать


Сделай чтобы твое говно не тормозило на картах размером >100.
36 926589
>>26584
100 чего, микромортов?
37 926591
>>26584

>тормозило


Схуяли оно должно тормозить?
Ты репу открывал? Запускал?

Там нагрузка только в момент генерации.
Сами гексы отрисовываются ровно один раз.
38 926595
>>26591
upd.
Оно действительно виснет нахуй при генерации больших карт.
Буду думать как оптимизировать генератор
39 926645
>>26595
Ветку не читал, вбрасываю ответ чисто по этому посту.

>как оптимизировать генератор


Разбить генерацию на части. Выполнять каждый фрейм по чуть-чуть, ограничив время выполнения. Например, если в теле генератора есть циклы - за один вызов генерации выполнять только одну итерацию цикла. Опционально отрисовывать прогрессбаром готовность.

const FRAME_TIME = 10
func _process(delta: float) -> void:
far start_time = Time.get_ticks_msec()
while Time.get_ticks_msec() < start_time + FRAME_TIME:
_ var progress = generator.do_generation_part()
_ $progressbar.value = progress
_ if progress >= 1.0: # 1.0 это 100%
_ _ self.set_process(false)
_ _ end_generation()

Да, это не оптимизация. Но зато можно такую генерацию делать загрузочным экраном. И даже выполнять [псевдо]параллельно всему остальному, не мешая геймплею.
40 926646
>>26645

>far


var
41 926648
>>26645
Не до конца понимаю как замедление генерации поможет её ускорить, но твой тейк про разделение на чанки понятен.
Алсо годот нормально умеет в мультипоток, так что буду экспериментировать в эту сторону
42 926651
>>26591
>>26331
Обесни, а чем стандартные гексы не устроили?
43 926653
>>26651
Так он же карты сделал
44 926655
>>26653
Я может слишком молод, и слишком много слушаю иностранную музыку, но... А в чём разница?
45 926656
>>26655
Я имею ввиду, почему не сделать карты на основе стандартного тайлмапа? А не велосипедных классов.
image.png60 Кб, 745x536
46 926657
>>26649 (Del)
Потому что это это не гексы, а прямоугольники со сдвигом.
При таком представлении чтобы посчитать дистанцию, покрутить гекс вокруг другого/нарисовать кольцо или линию тебе либо придётся переводить их в трёхосевую систему координат, либо потеть и изобретать велосипед.

Можешь почитать это
https://www.redblobgames.com/grids/hexagons/#coordinates-comparison

>>26656
Я всё ещё могу использовать гекс тайлмапы для отрисовки
47 926659
>>26657
это
>>26651
сюда
48 926660
>>26657
То есть у тебя изначально трёхосёвая система координат?
49 926661
>>26660
Всё так. И все вычисления проводятся в ней
50 926663
>>26657

> Я всё ещё могу использовать гекс тайлмапы для отрисовки


>>26595

> Буду думать как оптимизировать генератор


Вот тебе и оптимизация подъехала. Быстрые искаробочные тайлмапы, вместо массивов велосипедного вектор3и.
51 926665
>>26657

> чтобы посчитать дистанцию, покрутить гекс вокруг другого/нарисовать кольцо или линию тебе либо придётся переводить их в трёхосевую систему координат, либо потеть и изобретать велосипед


На дисплей всё равно в двухосевой выводить.
Поэтому чтобы не изобретать велосипед, ты изобрёл три?
1. генерируем в трёхосевой
2. переводим в двухосевую
3. переводим в трёхосевую

Нет, я рили не въезжаю.
52 926667
>>26648
Не замедление. Просто за один кадр не пытаться сделать всю генерацию, а выполнять лишь часть, ограниченную каким-то интервалом времени. Тогда у тебя не будет происходить общий зависон.
53 926668
>>26661
Звучит классно, обязательно пощупаю если ты выложишь в открытый доступ
54 926670
>>26663
И давно твои быстрые искаробочные тайлмапы умеют в генерацию карт? Повторюсь - тормозит именно она. Генератору плевать как ты будешь выводить их.
По поводу способа хранения - я думаю как можно это оптимизировать.

>>26665
Я не понимаю откуда ты взял три пункта.
Логика такая:
1) Генерируем в трёхосевой множество тайлов (гексов). Ни генератор ни гексы ничего не знают о дисплее и о том как они будут выводиться. Это просто модель.

2) Отдельная нода (HexLayout) знает как гексы маппятся на 2д-плоскость. У неё получаем множество вершин для каждого гекса и рисуем полигон на канвасе (HexCanvas).
HexCanvas зависит от HexLayout чтобы знать как рисовать гексы.

HexOverlayCanvas - тот же класс что и HexCanvas, только используется чтобы рисовать всякое поверх. Линии, контура выделений и тд чтобы не перерисовывать карту на каждый чих.

>>26667
Спасибо, анончик. Я понял, о чем ты.
55 926672
>>26668

> если ты выложишь в открытый доступ



Оно в принципе уже в открытом доступе. Сейчас курю доку, как это оформить в полноценный аддон и выложить в asset library
image.png68 Кб, 1173x971
56 926694
Границы регионов. Пытаюсь разобраться как посчитать углы чтобы нарисовать их в виде линий непосредственно по граням хексов.
image.png411 Кб, 1280x842
57 926696
Искаропка-кун, попробуй так же отрисовать границы гексов на своих быстрых тайлмапах
58 926700
>>26672
Ссылочку не кинешь?
59 926725
>>26700
Выше по треду:
>>26331
60 926749
>>26696

> попробуй так же отрисовать границы гексов


Шейдер поверх накину. Но лень.
61 926750
>>26749

>пук


И как же должен работать твой шейдер?
Напомню, у тайла на тайлмапе всего 4 соседа. Или 8, если считать диагонали.
62 926761
>>26725
Спасибо, анончик, я не самый внимательный...
63 926770
>>26750
Естественно, я не буду ебать мозги ни себе ни людям с ебанутыми генераторами соседних тайлов. Я возьму шум, на основе этого шума получу континенты. Этот же шум передам в шейдер, а дальше отсечение больших и меньших значений от уровня океана. Хуяк-хуяк и в продакшен. Пока ты какую-то тормозень велосипедишь, пердонюх.

Игроку ведь похуй как это реализовано. Игроку нужен фан, а не рассуждения о удобстве трёхосевых координат на плоскости.
64 926771
Как делать игры? Если дизмораль.
65 926789
>>26656
А я часто замечаю в ассетлибе аддоны, которые делают то, что и так есть из коробки.
Просто движок уже достаточно большой с большим количеством функций, их не все читают и изучают.
66 926791
Так ладно нахуй, попробую на вкус этот ваш гд скрипт. Поясните есть какая-нибудь топ хуйня чтобы такому lowIQ еблану как я занюхнуть программирование на ГДскрипте?
67 926792
>>26771
Это тебе в другие разделы тематические, там где по психиатрии.
68 926841
У меня мозг опух, пока я пытался разобраться,
Как по-быстрому поменять цвет фона кнопки при нажатии на неё? Никто такое не делал?
69 926842
>>26841
modulate
70 926868
Посоветуйте гайды на гд скрипт для чайников
Хеллоу ворлд и синтаксис я так то и из документации могу освоить, но методы и классы вот для меня тёмный лес.
И ещё вопрос. Как происходит перемещение объекта/границы столкновения, перенос множества точек, или объекта в целом?
image.png766 Кб, 1534x502
71 926889
Сап годач. Есть пара вопросов.
1) Есть ли ультимативный гайд по интерфейсу? Где на примерах объяснялось бы, как запилить диалоговую систему, штуки вроде чтения записок, журнала заданий, эффектов на экране и все в таком духе.

2) Какой лучше шаблон для рисования тайлмап для 2d платформера использовать? На пике ок? Или есть получше варианты?
1704971617164.mp4353 Кб, mp4,
398x666, 0:23
72 926899
>>26842
Точно!! спс
сделал вот такой кал, пока без сохранения
73 926901
>>26889

> ультимативный гайд


Это как? Один видос на 10 часов? Не встречал. Серии видосов есть. Будешь?
https://www.youtube.com/watch?v=dMYv6InQgno&list=PLcZp9zrMgnmOOQXevC-2CfH67QP3mB4wv
Ссылочка с плейлистом.
75 927015
>>26941
И работает шустро.
76 927033
>>26941
Да, именно так! А потом всё это выводишь во вьюпорт-текстуру и делаешь дисплеи компов в своей триде-игоре.

И вот такие штуки для целей игры нужно делать мимоходом, не отвлекаясь от основного девелопа.

И вот скажите мне, геймдев не вершина ли айти?
77 927047
>>27033
Более того - годот позволяет на изичах вставлять в свои новые игоры свои старые игори. Я так уже сделал, зависимость есть.
image.png1,2 Мб, 1280x720
78 927055

>Dev snapshot: Godot 4.3 dev 2


https://godotengine.org/article/dev-snapshot-godot-4-3-dev-2/

Не ждём, а готовимся!
79 927058
>>27047
Ну так показывай.
80 927061
>>26696
Добавил рандомно раскиданные города и дороги между ними.
Для генерации дорог использовал кастомный AStar3D.

Не смог до конца поправить то, что астар постоянно срезает углы, от чего в некоторых местах находится несколько паралельных дорог
81 927062
>>27061
А ты объединяй параллельные дороги в шоссе
82 927122
Туплю весь день, как мне сделать так чтобы при падении хелсбара до 25% и ниже воспроизводился звуковой файл по кругу. Через _process почему то не работает.

И еще вопрос, другой. Загрузил в аудиостим рандомазер несколько звуковых дорожек, хочу чтобы они в случайном порядке играли друг за другом, а он играет одну и останавливается. Что делать?
83 927146
>>27122
Со звуками лучше работать на основе сигналов (событий), а не process.
Скорее всего ты в process постоянно вызываешь play(), но в годоте это означает не "продолжить играть, если играет", а "сбросить и играть сначала", Тебе надо самому проверять if not sound.playing: sound.play(). либо пользоваться сигналами.
В годоте сделано спорно на мой взгляд, loop относится не к плееру, а к импортированному файлу. Поэтому в годоте есть два подхода
1. При импорте указать, что файл будет loop. Тогда он всегда будет зациклен. ЕМНИП он не будет присылать сигнал finished. Но это позволяет сделать бесшовный звук. Но если хочется разорвать loop придется как то мутить с таймерами (проверять текущий таймстамп плеера)
2. При импорте указать что файл не loop. Тогда он будет присылать сигнал finished. И в нем ты уже по своей логике можешь начать играть повторно, или другой звук. Но там по идее может быть микрозадержка между повторами.

>Загрузил в аудиостим рандомазер несколько звуковых дорожек, хочу чтобы они в случайном порядке играли друг за другом, а он играет одну и останавливается. Что делать?


По идее то же самое. Нигде не сказано что рандомайзер будет играть их по кругу. Ты либо переимпортируешь все файлы как loop, либо обрабатываешь событие finished и заново делаешь рандомайзеру play, а он уже выберет какой файл играть согласно mode.
84 927149
>>27146
По поводу лупа - помню еще поведение разных звуковых форматов отличалось. Может в четверке унифицировали, хз.
85 927153
>>27149
Не само поведение, а в 3 импорт ogg был с лупом по умолчанию и надо было заходить снимать галочку с каждого.
86 927156
>>27146
О спасибо, то что надо. Правда теперь у меня звуковой сигнал резко обрывается когда значение хелсбара выходит за установленные рамки.

И соответственно еще вопрос с которым мучаюсь, как мне звуки и анимации проигрывать до конца при их смене на другие? Пробовал await animation_finished но что-то не то. Может не так пишу. Думаю что можно сделать через animation tree, но хочется более простое решение. Ну и звуки там не сделать вроде.
87 927169
>>27156
Тебе нужен пул аудиопотоков. При проигрывании, будет выделяться свободный, если свободного нет, гасится самый давний. Ну и свою логику использования добавляешь. https://kidscancode.org/godot_recipes/4.x/audio/audio_manager/

>анимации проигрывать до конца при их смене на другие? Пробовал await animation_finished


Сходу сложно что то посоветовать, не зная жанра игры. Ну типа советую конечный автомат (fsm)
88 927183
>>27061
Переписал алгоритм генерации дорог. Удалось избавиться от всех артефактов
89 927189
Я ЕБАШУ ЛЕКАРСТВА, СОЛЬ, У МЕНЯ СТОМАТИТ, НО Я НАХУЙ СДЕЛАЮ ИГРУ БЛЯТЬ. Я СДЕЛАЮ СВОЮ ИГРУ СУКА. GODOT БЛАГОСЛОВИ МЕНЯ.
1705076409447.jpg126 Кб, 1200x520
90 927190
>>27189
Благословляю тебя!
91 927217
>>27189
ибо всякий просящий получает, и ищущий находит, и стучащему отворят.
92 927246
>>27190
Литералли ми.
1705111838568.jpg48 Кб, 628x648
93 927265
Сап, аноны. Кто-то может внятно объяснить, когда конкретно нужно RefCounted использовать? Я просто ещё на шарпе пишу, и не очень понимаю, зачем это вообще нужно, когда там есть свой сборщик мусора. Да и в описании RefCounted написано, мол, после того, как обнуляется счётчик ссылок, мусор ещё какое-то время будет в памяти висеть, пока его сборщик шарпа не соберет.
94 927309
>>27265
Не используй refcounted в шарпе. Вообще не используй. Совсем. Он только для гдскрипта, который вообще без сборщиков мусора. В шарпе используй стандартные шарп class если тебе нужен POCO объект.
95 927396
Насколько надежно полагаться на имена нод внутри одного родителя? То есть, если я динамически добавляю-удаляю ноды, есть ли риск что новая нода получит имя старой, только что удаленной?
96 927400
>>27396
По моему как раз получит повторно, если ты про Node@1, Node@2. Хотя я давно смотрел.
97 927403
>>27400
Да, про это. Жаль.
98 927418
>>27396
А ты так же динамически задавай имена сам при создании, если ты их создаёшь относительно редко, то например можешь добавлять эпоху в мс или даже в секундах к имени
99 927421
>>27418
>>27403
А я предлагаю запилить менеджер имён на уровне игровой логики, чтобы у него был метод get_name() возвращающий уникальный стринг.
100 927424
>>27421
Сделал через ноду-компонент, которая выдает числовой айди и устанавливает его в мету своего родителя. В мету - чтобы не лезть в родителя и не трогать его внутренние переменные. Прикрепил эту ноду ко всем нужным сценам.

Басикалли, зис:
get_parent().set_meta("uid", some_big_number)
Читаю так:
obj.get_meta("uid")

Впервые использовал мету годота. Нишево, но удобно.

https://github.com/godotengine/godot/issues/18591
https://forum.godotengine.org/t/what-is-the-purpose-of-object-meta-data/27571
101 927426
>>27424
Метаданные много где используются. Ближайший пример - аддон диалоджик.
102 927432
>>27426
Найс. Им про метадату нужно чаще в доках/гайдах упоминать.
103 927457
Ребята... Вы же тут все в соло что-то делаете? Подскажите, вы в моделинг 3д вкатывались? Если да, то сколько примерно у вас уходило времени например на то, чтобы научиться нормально моделить оружие и людских персонажей?
104 927473
>>27457
Я в блокбенче херачу модельки. Главное не охуевать с комплексной геометрией и тем более анимацией.
105 927474
>>27457

> нормально моделить оружие и людских персонажей


Если ты не человек-оркестр, мессия, рождающийся раз в тясячелетие, то даже и не думай о том, чтобы тащить в одиночку такие вещи, качай готовые анимированные модели с миксамнимо, и не выёбывайся.
106 927480
>>27473
Тоже недавно вкатился в блокбенч. Неплохо знаю блендер, но понял что нужно упростить модели для скорости их создания. Да и пиксель арт люблю.
107 927484
>>27474
Готовые модели мне не подойдут. Я сурьёзный гамедевелопер и делаю хорошую игру.
108 927486
>>27484
Да-да, мы все здесь такие. >>27190
109 927487
110 927496
>>27457
Я не считал, технологические предметы не очень долго, там все таки по чертежам можно, может полгода-год, гуманоидов даже не начинал еще, ну как кучу курсов пересмотрел, там столько нюансов в анатомии. Наверное года 2-3 минимум на просто приятную аниме девочку. Да сам процесс даже с готовыми долго занял, освоить риги, миксамо, каскадер, собрать все это в анимейшн три может месяца три-6 занять.
image.png2,9 Мб, 1920x1080
111 927503
>>27496
Тем временем самая продаваемая игра в мире.
112 927506
>>27503
Ну да, а потом идет GTA V
Или например рядом с террарией RDR2
Не все так однозначно
Второй раз продать кубы еще поди попробуй.
113 927507
>>27506
А, и если говорить про анимэ, то сразу после гта5 по скачиваниям идет ф2п геншин
2024-01-08 02-17-06.mp42,6 Мб, mp4,
1280x720, 0:24
114 927508
Эх, пару лет назад я едва мог скопировать чей-то туториал, а сейчас уже могу что-то сделать минимум, но всё же почти без помощи...
Может, через 10 лет на Годоте8 таки выпущу свой первый Понг
115 927540
>>27506
И каковы шансы у тебя повторить визуал РДР2 или ГТА, и каковы шансы повторить визуал майнкрафта? Кроме того, в РДР2 и ГТА люди все равно в геймплей играют, а не в графику. Тогда как графонистые безгеймплейные залупы помирают никем не замеченные на дне стима.

Люди играют в геймплей. В игру. То, что крупные компании способны прицепить к крутому геймплею крутую графику - это бонус, а не основа. Если ресурсов мало и ты работаешь один, то разумней фокусироваться на более важном геймплее, чем на графоне. Я так щитаю. Впрочем, ты и сам это поймешь через пару лет твоего геймдевного приключения.
116 927545
Просто проинформирую вас что get_nodes_in_group раза в два медленней чем parent.get_children. Так что замена родителей на группы ради повышения гибкости такая себе идея.
117 927580
Годачеры, объясните мне, пожалуйста, как работает call_deferred()
Вот тут есть объяснение https://dzen.ru/a/YBKPwfJr9iwWW5iD
Но я тупой не понял, каким образом call_deferred() спасает положение? Если отслеживание сигнала уже прошло. Разве не нужно его добавлять тогда в B1?

И вообще, разве отслеживание сигнала не работает всегда? Почему не срабатывает без call_deferred()?
118 927582
>>27580
Алсо, объяснение из доки:

>Idle time happens mainly at the end of process and physics frames. In it, deferred calls will be run until there are none left, which means you can defer calls from other deferred calls and they'll still be run in the current idle time cycle. If not done carefully, this can result in infinite recursion without causing a stack overflow, which will hang the game similarly to an infinite loop.



>This method supports a variable number of arguments, so parameters can be passed as a comma separated list.



Ситуацию не прояснило
119 927583
>>27457
Не могу позволить себе тратить время на прокачку скиллов в визуал. так что отдаю графон, анимации и саунд на аутсорс. С меня код и все остальное
120 927584
>>27580
Я понимаю это так.
Колл деферред, это когда написал пост в тред, отошёл покурить, по пути похавал на кухне, посмотрел ютубчик на толчке, посрал. Покурил ещё раз. Возвращаешься к пека, а там пост твой не отправленный. Вводишь капчу и отправляешь.
121 927585
>>27584
Как тогда понять, завершения каких процессов ждет call_deferred?
122 927594
>>27585
Я же описал.
Ждёт пока годот покушоет, покакоет, покурит, рыгнёт, почешет пузо, и присядет отдохнуть. "О, у меня тут деферед коллы навалены, а ну, колл, колл, колл!"
123 927598
Подскажите, если в блендере сделать 1 из 2 способов с видосов:
1.https://www.youtube.com/watch?v=G4VEHi3dI6w&ab_channel=ALLTHEWORKS[РАСКРЫТЬ] Сделать деревья через ноды, то создаваемые после модели можно ли будет экспортировать в ГОДО ?
2. https://www.youtube.com/watch?v=zk6aUkl115E&ab_channel=CGIGuru[РАСКРЫТЬ] Создания через привязку листьев через ту же сферу, саму сферу спрятать как альфа каналом, в рендере самого блендера выглядит норм, а если перенести в ГОДО кто нибудь сталкивался ?
124 927602
>>27594
Почему они тогда не работают в движке по умолчанию? Или почему их не использовать всегда, типа:

_ready():
call_deferred("eat")
call_deferred("poop")
call_deferred("sleap")
125 927603
>>27602
Потому что по умолчанию нужно вызывать методы сразу, а не отложенно. Отложенный вызов наоборот требуется редко.
image.png7 Кб, 285x141
126 927611
Что это за фигня вообще? Зачем она нужна?
127 927613
>>27611
Поле для заметок на полях.
128 927615
>>27613
Оно потом показывается где-нибудь в тултипах, или так и остается только в этом поле?
129 927632
>>27615
Я не в курсе. Сам проверь.
130 927639
>>27583
А можешь подробнее об этом? Я сам тоже нихуя не умею кроме сценариев и кода, ну может быть дизайна персонажей и интерфейса но это нужно суждение профессионалов уже.
131 927642
>>27639
Тоже думал что легко смогу в дизайн персонажей. Хуй там. Чтобы задизайнить оригинального, приятного и удобного для игры персонажа придется постараться.

И нет, анимедевочки с цветыми волосами - не оригинальные персонажи.
132 927644
>>27642
Хуй ебёшь? Про аутсорс расскажи, пожалуйста.
133 927645
>>27545
Особо не закапывался в это и группами не пользуюсь, но подозреваю что там сравнение строк участвует.
А насчет parent.get_children, можешь сравнить еще просто с массивом нод, который сам заполняешь, думаю это еще быстрее будет.
134 927646
>>27644
Я не тот анон.
135 927650
>>27580
Вызов call_deferred происходит "между" кадрами.
Полного описания всех процессов, вроде бы, нигде не находил.
Очевидные два - это физика и дерево нод.
Говоря терминами программиста, когда происходит инвалидация итератора
Пример 1 - движок перебирает в цикле все ноды и вызывает у них процесс. Ты в процессе хочешь сделать add_child или remove_child. Если это сделать сразу, то получится, что дерево, которое перебирал движок, уже не соответствует реальности.
По сути то, что описано в статье, этот случай, поскольку связан с _ready, то есть именно с тем в какой момент создаются/удаляются ноды.
Пример 2 - физический движок это черный ящик с коллбеками, внутри него на c++ есть ссылки на разные объекты. Если поменять какой то объект в произвольный момент, то все упадет.

>>27582
Это значит, что сначала в кадре выполнились все _process, и некоторые могли составить список deferred вызовов. Теперь, между кадрами, начинается вызов deferred, всех из списка пока он не опустеет. Но, видимо, если внутри deferred вызова взывать другую функцию deferred, она добавляется в текущий список, который сейчас обрабатывается, логично ведь мы между кадрами и свободны. Но может быть ситуация, что ты из deferredA вызвал deferredB(), а из нее deferredA(), и они будут бесконечно добавлять друг друга по кругу и все встанет

>>27602
Это будет геморно (у тебя исчезает все автодополнение и проверки типов например), это будет вносить задержку (даже откладывать что то на 1 кадр заметно - помню тут анон жаловался что у него персонаж появлялся на сцене смотря влево, а потом флипался смотря вправо), и скорее всего потом появятся ситуации где тебе нужен условный deferred_from_deferred.

В Самодумии мне понадобилось 2 раза call_deferred (конечно потому что это игра на джем и некогда продумывать архитектуру)
1 раз это опять add_child, плюс там я еще жду 2 кадра чтобы я получил доступ к global_transform (такой подводный, ведь если ты deferred add_child, то глобальная координата на этот момент неизвестна)
2. Мне надо было чтобы первый button получил фокус автоматически из _ready и там тоже она была не готова это сделать.
135 927650
>>27580
Вызов call_deferred происходит "между" кадрами.
Полного описания всех процессов, вроде бы, нигде не находил.
Очевидные два - это физика и дерево нод.
Говоря терминами программиста, когда происходит инвалидация итератора
Пример 1 - движок перебирает в цикле все ноды и вызывает у них процесс. Ты в процессе хочешь сделать add_child или remove_child. Если это сделать сразу, то получится, что дерево, которое перебирал движок, уже не соответствует реальности.
По сути то, что описано в статье, этот случай, поскольку связан с _ready, то есть именно с тем в какой момент создаются/удаляются ноды.
Пример 2 - физический движок это черный ящик с коллбеками, внутри него на c++ есть ссылки на разные объекты. Если поменять какой то объект в произвольный момент, то все упадет.

>>27582
Это значит, что сначала в кадре выполнились все _process, и некоторые могли составить список deferred вызовов. Теперь, между кадрами, начинается вызов deferred, всех из списка пока он не опустеет. Но, видимо, если внутри deferred вызова взывать другую функцию deferred, она добавляется в текущий список, который сейчас обрабатывается, логично ведь мы между кадрами и свободны. Но может быть ситуация, что ты из deferredA вызвал deferredB(), а из нее deferredA(), и они будут бесконечно добавлять друг друга по кругу и все встанет

>>27602
Это будет геморно (у тебя исчезает все автодополнение и проверки типов например), это будет вносить задержку (даже откладывать что то на 1 кадр заметно - помню тут анон жаловался что у него персонаж появлялся на сцене смотря влево, а потом флипался смотря вправо), и скорее всего потом появятся ситуации где тебе нужен условный deferred_from_deferred.

В Самодумии мне понадобилось 2 раза call_deferred (конечно потому что это игра на джем и некогда продумывать архитектуру)
1 раз это опять add_child, плюс там я еще жду 2 кадра чтобы я получил доступ к global_transform (такой подводный, ведь если ты deferred add_child, то глобальная координата на этот момент неизвестна)
2. Мне надо было чтобы первый button получил фокус автоматически из _ready и там тоже она была не готова это сделать.
136 927651
>>27650

> Если поменять какой то объект в произвольный момент, то все упадет.


P.s. тут они кажется делают так - в годоте есть "копии" физических объектов из физдвижка, если ты что-то поменял, то ничего не упадет, но физдвижок просто перезатрет твое изменение в следующем кадре. Чтобы вносить изменения, надо делать это только там где предусмотрено - в integrate_force() или через physicalserver.set(...)
137 927663
>>27598
1. Да, в геометри нодах надо чтобы была нода realize instances и можно сделать apply и получить статичную модель. Которую можно обычным образом экспортировать. Но моделька может выходить тяжелой.
Хотел как то воспроизвести нечто подобное нодам в самом годоте, чтобы одинаковые листики рисовались через multimesh, но руки не дошли.
2. Не понял вопрос честно говоря. Если сфера отдельный объект, то ее лучше как то совсем скрыть или вообще использовать только позиции листьев, а саму сферу удалить.
Вообще самые легковестные деревья не используют отдельные объекты листьев. Самое простое дерево это два квадрата пересекающихся с текстурой с листьями и прозрачными дырками. Ну или как вариант если ты запечешь на эту сферу текстуру листьев.
Можешь так же поискать что именно для деревьев в годоте делали. Этокак минимум какой то генератор попадался, и еще плагин для импостеров (это когда 3д дерево впекается в 2д спрайт, для рисования кучи деревьев на большой дальности), и всякие плагины на scatter (чтобы расставлять кучу одиинаковых объектов автоматически через multimesh)
138 927673
>>27639
Ну, тащемта секретов тут нет. У меня есть четкое видение визуала/звука, есть референсы, нормально составленное тз. Далее идут на какой-нибудь сайт по типу https://gamedev.ru и там на форуме ищу людей для разовых заказов по своим нуждам (там есть раздел с поиском работы)
139 927674
>>27673
Благодарю!
140 927676
>>27603
>>27650
Спасибо, аноны, за объяснение и подробные ответы. Вроде понял
141 927721
>>27663
Спасибо большое за ответ.
По поводу 2 квадрата с текстурой дерева, и прозрачным альфаканалом видел, так делают и траву и кусты и деревья, но если посмотреть на них сверху выглядит стремно.
Что до тяжести, больше всего это и напрягает, посмотрел кучу видосов как делают растительность разного рода в блендере, вроде часть простая, но выглядит тяжелой. Даже про те же 2 квадрата, видел много кто так делает, но говорилось в одном из видосов, что создания большого количества такие моделей нагружает видюху, посколько она пытается высчитать кучу наложений друг на другу прозрачных альфа каналов, и ладно если у тебя дерево из 2 таких 2д спрайтов, а если каждая ветка такая?
Я вот и думал, лучше ли склипать 2-3 дерева lowpoly самому, или поебаться с генерацией деревьев этих, с помощью стороних программ или же аддонов к годоту.
142 927738
>>27721
Там есть спец режим прозрачности для материала листвы, alpga scissor и с 4-ки alpha hashing
https://docs.godotengine.org/en/stable/tutorials/3d/standard_material_3d.html#transparency
143 927740
>>27721
Конечно лучше слепить самому, нр советую скачать на скетчфабе разных, засунуть в движрк и пощупать производительность и визуал.
144 927757
>>27738
>>27740

Два чаю, от души анон
145 927877
Вопрос: Как лучше реализовать квестовую систему в игре? Пробовал всякие туториалы, но они слишком продвинутые для меня.
Как, например, подключить джава-док и вообще нужен ли он, если у меня, скажем, сотня квестов всего?
Screenshot from 2024-01-16 03-19-41.png111 Кб, 1571x947
146 927903
Анон, графики выглядят как-то страшно для небольшой мобильной дрочильни.
Все ли ок?
image.png16 Кб, 407x310
147 927904
>>27903
Тут не ок. У тебя потерянные ноды-сироты болтаются. В идеале там должно быть 0. Ты где-то удаляешь ноду у родителя, но не освобождаешь ее.
image.png38 Кб, 580x542
148 927905
Кстати про мобилки. Как на мобилке лучше реализовать "альтернативный огонь" из условного "оружия"? На пк вот все понятно - левая мышь, правая мышь.

Тач-кнопки для перпеключения режима огня не хочу - моя дрочильня слишком проста для кнопок. Один палец / два пальца кажется неудобным - моя игра в горизонтальном режиме, а у людей, как правило, всего по одному большому пальцу на каждой руке.
149 927909
>>27905
двойной тап, жест, долгое нажатие
150 927974
>>27905
Визуальную кнопку переключения типа огня попробуй.

А вообще, не забывай, что для мобил есть геймпады, и что при наличии геймпада в ОС, годот автоматически видит его и принимает с него инпут. И поэтому забинди управление на геймпад, и при активации этого управления убирай с экрана всё что относится к тач-управлению. Твои игроки тебе спасибо скажут. Посоветуют твою игру друзьям. Станешь богат и знаменит. Тяночка твоей мечты сама найдёт тебя и сама предложит тебе встречаться. А если у тебя уже есть тяночка, то она не откажется от жмж. А если ты тяночка, то инвертируй предыдущие два предложения на кунчика.
151 927991
>>27645

>А насчет parent.get_children, можешь сравнить еще просто с массивом нод, который сам заполняешь, думаю это еще быстрее будет.


Проверил. Все так.
152 927997
Блять как реализовать логику инвентаря и подбираемых предметов?
У mr D дошел до этого урока но он во первых нихуя не обьясняет + он на старой версии и там дохуя чего изменилось

Вот лежит на карте предмет нагенерированый главной сценой и добавленый как чайлд сцене items, содержит текстуру и имя, вот функция у персонажа get_item на кнопку
Как мне сделать чтобы она проверяла рядом ли предмет с персонажем, удалить его с карты и добавить в инвентарь grid conteiner как дитятко

У меня голова дымится от этой хуйни
153 927998
>>27997
Делай коллизию персонажа/мышки и предмета. По коллизии удаляешь предмет из мира и добавляешь в инвентарь.

Я бы еще советовал подумать нужен ли тебе инвентарь вообще, или достаточно простого неинтерактивного списка.
154 927999
>>27998

>По коллизии удаляешь предмет из мира и добавляешь в инвентарь.


Как логика кода выглядит? Ее в скрипте персонажа писать?
155 928005
>>27997

> У меня голова дымится от этой хуйни


А игра ещё не начиналась, заметь. А я говорил, геймдев - вершина айти. Без 10 лет формошлёпства в тырпрайзе в геймдев соваться - сомнительная затея.
>>27999

> Как логика кода выглядит?


1. Предмет - это абстрактная математическая сущность. В программировании это будет отдельный класс.
2. У него будут поля, указывающие на его представление в интерфейсе инвентаря и на его представление в игровом мире.
3. Предметы игрового мира должны быть через связь с базой данных быть привязаны к классу инвентарного предмета, например через композицию, иметь накинутый сверху компонент "подбираемый предмет"
4. Вот в скрипте этого класса логику и надо писать. В общем случае, нужны методы, задающие поведение при подборе игроком получающие от игрока ссылку на его инвентарь, делающие там соответствующие записи и уничтожающие свой объект-хост вместе с собой (или выключающие видимость, но это уже вопросы оптимизации, опустим пока).
5. Инвентарь это тоже должна быть математическая абстракция, манипулирующая через сигналы и ивенты своим отображением в интерфейсе, но зачастую код инвентаря ебашат в сам ГУИ. Осуждаю.
6. Что бы ты не выбрал, логика инвентаря у тебя всегда будет разновидностью CRUD из тырпрайза. И если ты в геймдев из тырпрайза пришёл, то с крудами проблем не должно возникнуть. Просто пилишь круд. И всё как бы. Ему приходят новые записи в базу данных, он их выводит в листбокс. Можно перемещать, изменять, удалять.
7. В некоторых играх в инвентарь можно пихать объекты контейнеры. Некоторые объекты могут стакаться, это можно реализовать через создание контейнера идентичного по внешнему виду предмету который стакается. В общем, полезно уметь создавать коллекции типа "коллекция".
156 928008
>>28005
Я неебу что такое круд и я нихуя не понял
157 928012
>>28008
Ты - это я, антоша.
Тоже скоро начинаю пилить инвентарь. И сука, пока это самое сложное из всего. А еще его нужно будет как-то с сохранениями коннектить...
158 928014
>>28005

>Без 10 лет формошлёпства в тырпрайзе в геймдев соваться - сомнительная затея.


Либо надо СИЛЬНО упрощать. Берете свои графонистые фуллбоди 3д, свои открытые миры, свои инвентари, и делите все эти хотелки на 10.

>>28008
Упрощая, можешь сделать так: у каждого предмета area2d. У персонажа area2d. Делаешь сигнал на их коллизию. Персонаж наступает на предмет. У персонажа триггерится сигнал, в нем вызываешь функцию get_item, передаешь ей предмет, с которым произошла коллизия. Добавляешь текстуру и имя предмета в инвентарь. Картинка и текст. Тут я хз как ты добавлять будешь - зависит от реализации твоего инвентаря. Я бы сделал тупо словарь имя:картинка. Сам предмет удаляешь из мира через ту же функцию внутри игрока, remove_child, queue_free. Если предмет нужно из инвентаря-словаря поставить обратно в мир, берешь имя из словаря, по нему берешь сцену, создаешь новую сцену и ставишь ее в мир в нужное место. Из словаря удаляешь.

Все, проще не будет. Если все еще сложно и непонятно - отложи этот проект, сделай 3-4 игры попроще, потом вернешься с опытом.
159 928015
>>28005
Кстати, на счет CRUD. Логика - логикой, но насколько вообще реально и удобно использовать sql для подобных задач в связке с годот? Есть ли адекватные примеры/туториалы?
161 928031
>>28014
Хммм, ну это надо разобраться как сигналы юзать, вроде понял

Этот ютубер просто делает сцену, в нее сует плашку текстурой, в нее скролл контейнер, и в нутрь него грид контейнер
Предметы добавляются в грид контейнер как дети и сразу отображаются, хз может потом поменяет в следущих уроках
image.png6 Кб, 647x27
162 928043
Снова вернулся к годот спустя время и снова эта же ебучая ошибка (пик)

Код игрока:
var Main_instances = GlobalResourceLoader.Main_instances
func _ready():
Main_instances.Player = self

Ресурс:
extends Resource
class_name Main_instances
var Player = null

Ресурс лоадер
extends Node
var Main_instances = preload("res://Resources/Main_instances.tres")

Что не так блять? Что этому говну не нравится? Почему он сука просто не может закинуть player в player блять?
163 928060
>>28043
Не работал с ресурсами, а что непонятно в ошибке? У Resource нет поля Player. Проверяй что у тебя загрузилось. Может быть надо объявить тип переменной. А откуда вообще тут появилась нужда в ресурсе?
164 928066
>>28060
>У Resource нет поля Player
А это что?
var Player = null

>Может быть надо объявить тип переменной


Делал вот так, тоже не помогает
var Player:CharacterBody2D = null

>А откуда вообще тут появилась нужда в ресурсе?


Нужно сконнектить скрипт, где меняется уровень, когда player проходит через дверь
165 928085
>>28014

> Упрощая, можешь сделать так: нахуячить абы чего абы куда и через неделю игра в производственном аду крошится в рандомных местах, предметы дюпаются, сейвы херят прогресс квестов, нихуя не можешь понять, где в этой каше с лапшой что фиксить.


Упростил твой пост до одной строчки.
166 928087
>>28008

> и я нихуя не понял


Перечитай начало поста, первую строку. Дальше можешь не читать.
>>28012

> Ты - это я, антоша.


И ты перечитай:

> А игра ещё не начиналась, заметь. А я говорил, геймдев - вершина айти. Без 10 лет формошлёпства в тырпрайзе в геймдев соваться - сомнительная затея.

167 928090
>>28066
В том то и дело, что var Player - в Main_instances, а тебе пишет, что Player нет в Resource.
А что если написать var Main_instances : Main_instances= GlobalResourceLoader.Main_instances
А не может ли быть этой путаницы из за того что у тебя имя переменной и имя класса одинаковое? Так вообщем то не принято делать. Делают к примеру Player player.
168 928098
>>28090

> Так вообщем то не принято делать.


Откуда это знать школьнику, возомнившему себя кодзимой?
Снимок экрана от 2024-01-16 21-10-44.png163 Кб, 1366x768
169 928104
что ему не нравится? два других предмета спавнит нормально а тут проблема с путем которой нет
спрайт никак не перемещается или типа того
170 928106
>>28104
вот список из которого выбирает имя по индексу от нуля до двух
далее _ready вызывает функцию set_item которая передает в нее имя из списка, в set_item уже имя подставляется в название ссылки на файл

На что он блять ругается?
Снимок экрана от 2024-01-16 21-17-28.png10 Кб, 650x145
171 928108
фыфы.png25 Кб, 847x162
172 928109
>>28104
Дико извиняюсь что надристал в тред
Снимок экрана от 2024-01-16 21-30-18.png94 Кб, 1366x768
173 928112
Нашел ошибку, в списке имен было не apple a aplle
174 928149
У мен такое дерево
Root
UI
Control
Plashka (текстура)
Scroll conteiner
Grid conteiner
Item apple
Item hui

Tilemap
Player
Items on map (сюда добавляются предметы при генерации)

И у меня плашка интерфейска как бы привязана к тайлмапе и двигается вместе с ней пока я бегаю, а надо чтобы в углу экрана постоянно была как везде сделано
Как фиксить?
175 928154
>>28149
Один из способов это размещать весь гуй дочерним к CanvasLayer.
Там бывают неочевидные приколы, но для новичка простой способ
176 928155
>>27903
как накатить такие графики?
image.png26 Кб, 988x300
177 928201
>>28155
Включаются в дебаггере.
178 928204
Насколько требовательны массивы и словари, если я создам скажем словарь, в который вложены несколько массивов, куда вложены словари и так 5 раз вложений, самих данных не очень много, пугает именно монструозное ветвление этого говна?
179 928206
>>28204
У меня словарь с "айди объекта: [аррей даты]", где аррей - 10к записей. И так с каждым объектом. Объектов 5-15 на уровень. Потери производительности не заметил, памяти 400мб улетает. Зависит от твоих данных короче.
180 928215
Я запутался со словарем, мне условно надо значение ключа, второго по порядку в словаре, как мне его получить?
181 928218
>>28215
Все вопрос снят, я разобрался.
182 928219
>>28218
А нет, не разобрался, такое вообще возможно?
183 928220
>>28219
dict.keys()[1]

?
184 928261
Вот в предмете есть скрипт при нажатии кнопки он удаляется со сцены
Но как мне его название добавить в словарь инвентаря, который лежит в скрипте игрока, как ключ с дефолт значением 1?

Как вообще можно реализовать словарь инвентаря, чтобы из него можно было и название и количество получить?
image.png32 Кб, 388x353
185 928263
Почему все сигналы коллизий есть только у area2d? Почему их нет у characterbody2? Как у игрока я могу вызвать get_overlapping_bodies()?

1) Есть игрок, есть дверь (в скрипте, куда ведет дверь и т.п.).
2) Игрок рядом с дверью -> func _on_body_entered() даем игроку знать, что он рядом с дверью
3) Игрок жмет кнопку, дверь должна отправить сигнал с данными о себе в сцену, которая меняет уровень

Так вот, как двери дать знать, что игрок нажал кнопку? func _on_body_entered() отрабатывает то единожды, а не следит за состоянием игрока.
Через синглтон пилить с отслеживанием переменной через process? Или через _on_body_entered давать player данные двери в какие-нибудь переменные, и уже оттуда посылать сигнал?

Есть изящное решение?
186 928266
>>28263
добавить чарактеру аналогичный area (возможно чуть другой формы/размера, например больше для интеракций, меньше для хитбокса), поместить его в отдельный слой физики по необходимости.
187 928267
>>28263
Кроме body_entered есть и body_exited
188 928278
>>28266
А, точно... Спасибо анонче
189 928279
Чем дешевым можно нарисовать 3д шлейф, аля сильно упрощенный дым? Сходу сделал партиклями - больно ударило по фпс.
190 928281
>>28279
Добавлю что делаю с расчетом на слабые мобилки, поэтому надо что-то реально простое.
191 928297
Как по вызову функции добавить ключи 'хуй' в словарь "жопа" ?
if жопа.has(хуй) = false:
Жопа += хуй
?
192 928300
>>28297
Уже нашел ответ в документации
193 928303
>>28279
Попробуй этот аддон https://github.com/HungryProton/proton_trail
Я им вроде пользовался в 3-ке, но сейчас он для 4-ки.
Другие аддоны для 4-ки требуют или с++ модуль или C#
Еще в 4-ке вроде какая то специальная нода добавлена parcticle trail, но я не знаю как она на мобилках и вообще.
194 928441
>>28303
Спасибо.

Подошло решение через обычные партикли, но с лимитом фпс в самих партиклях. Свойство fixed_fps. Поставил 25, ведь как известно больше глаз не видит!!1 Тем более глаз мобильных геймеров.
195 928445
Короче такая проблема. Я беру строку "|что-т|о.|" и начинаю её проверять на наличие этих самых "|". Если вижу эту херню, то удаляю её из строки и делаю пометку где она была. Сама проверка идёт не через простой цикл, а через таймер. Собственно таймер завершился - проверяем следующий символ в строке и т.д. Проблема вот в чём: как узнать что у нас суканах конец строки и остановить таймер? Считаю по индексам типа "строка[индекс]" и когда перехожу через количество символов в строке годот выдаёт ошибку, как и должен собственно. Мне бы при этой ошибке таймер просто остановить а не убивать весь процесс.
А там же ещё из-за того что удаляю "|" длинна строки меняется постоянно, так что даже по длине не посчитать.
196 928449
>>28445
Блятд вроде справился. Смотрю каждый раз равен ли индекс длине всей строки.
197 928451
>>28445
Попробуй такой вариант: в таймере отрезаешь от входной строки один символ, проверяешь его, если он нужен, помещаешь его во вторую, выходную строку. Если символ не нужен, он просто исчезает, а входная строка уже обрезана. Если входная строка нулевая - процесс завершён.

Хотя... Этот вариант ничем не лучше. Тоже два ифа будет.
198 928455
Если я создам список "жопа = [хуй1, хуй2, хуй3]"
И ниже функцией буду в переменную "жопа" присваивать элемент списка "хуй2"
Жопа = жопа[1]

То жопа останется списком или станет переменной со строкой "хуй2" внутри?
199 928469
>>28455

> станет переменной со строкой


Это. Но если ты сделаешь статическую типизацию:

> var jopa : = []


То при попытке записать в неё строку проект упадёт в исключение.
200 928471
>>28455
Зачем так делать? Заведи новую переменную,иначе потом не разберешься в лапше которую наворотид.
201 928473
>>28469
Тогда я блять непонимаю почему обьекты недобавляются в массив инвентаряй
>>28471
Это так подбираемый предмет устроен

Там с списке разные названия итема, одно из которых выбирается рандомно и так устанавливается спрайт для него

Простенькая система

Но почему то он не хочет добавляться в грид контейнер, домой приду скину код
202 928474
>>28445
Звучит как жуткий оверинжиниринг. Зачем удалять это из строки? Если ты делаешь какие-то спецэффекты при выводе, просто пропускай этот символ, выставив нужные тебе флаги и все.
Упрощенный псевдокод
while index < my_string.length():
_var c = my_string[index]
_if c == '|':
__flipflags()
_else:
__print(c)
__break
_index += 1
203 928475
>>28473
Вопрос не в этом. Вопрос - зачем делать так?
Почему нельзя написать other_var = var[key]? Почему понадобилось именно в эту же переменную присваивать var = var[key]?
Или ты пытаешься изменить что-то в словаре?
var[key] = new_value
var["твой_ключ"] = new_value
Словари работают примерно одиноково во всех ЯП
Если ключа нет, создается пара ключ-значение
Если ключ уже есть, то значение для этого ключа заменяется.
204 928482
>>28473

> Тогда я блять непонимаю почему обьекты недобавляются в массив инвентаряй


Ну если ты не понимаешь, нам-то как понять? Экстрасенсов в тред не завезли. Показывай портянку кода, что ты там нахуевертил?
205 928487
>>28475
Ну генерится при запуске сцены условное яблочко, нахуй там продолжать хранить список названий итема для генерации если можно туда просто присвоить имя и список как бы самоудалится
206 928488
>>28482
Как с заводика прийду
207 928489
>>28475
В самой сцене итема хранится список с названиями и при добавлеии экземпляров этого итема на условную карту у него под функцией _реади выбирается рандомное имя и присваивается уже в туже переменную где был список
208 928497
>>28487
Ты не там оптимизируешь. Не неси хуйню. Ты сам себя запутаешь такими широкими трактовками содержимого переменных.
209 928504
>>28497
Хули там путаться
item name = [apple, rock, stick]

_ready():
Var a = randi_range(0, 2)
item name = item name[a]

И все, предмет лежит на карте пож своим именем и больше не содержит списка
210 928506
>>28504

>Хули там путаться


Чел, через неделю ты уже в этом не разберешься. Это ты сейчас думаешь такой ого как круто наебал систему, и че эти тупые погромисты так не делают.
211 928507
>>28504
Ну ладно, о вкусах не спорят. На мой вкус было бы лучше:

> _ready():


>


> item_name = ItemManager.get_name()

212 928508
>>28506
Я только вкатываюсь и сделал по гайду с ютуба, но я не понимаю где по твоему я еще буду юзать эти одинкавые списки в каждом экземпляре итема?
213 928509
>>28507
ItemMeneger типа отдельной нодой?
А код там какой примерно?
214 928510
>>28509
Ну опять, же код там в зависимости от потребностей. Чисто теоретически представим, что у нас есть необходимость раздавать предметы из некоторого набора, по некоторым критериям. Мы заводим список предметов. В методе get_name можем параметром указать критерий. Для критериев заводим энум. и вот это всё будет выглядеть так.
(Щас наваяю код и запощу.)
1705669857181.png127 Кб, 826x799
215 928511
>>28510
Пользоваться так:

> item_name = ItemManager.get_name(ItemManager.Level1)


Да, длинно. Да, многословно. Зато код высокоподдерживаемый, мидловский. Любому мидлу видно, что откуда берётся в этом коде.

Там вверху закоменчен еще более сложный код. Можешь пока на него не смотреть, так, для общего развития добавил.
216 928512
>>28511
Можно покороче сделать. Вопрос вкуса, опять же.

> _ready():


> var im := ItemManager.new()


> item_name = im.get_name(im.Level1)

217 928513
>>28511
Хуя ты заебенил, схороню

Правда я еще не шарю что такое энум и что значит (item_set: ItemSet)
218 928516
>>28511
А функция pick_random() по дефолту в годоте?
219 928530
>>28516
Добавлена 2 года назад.
image.png13 Кб, 404x80
220 928549
>>28511
тяжела жизнь без do ... while
221 928554
>>28549

>while true:


>>random_key = items.keys().pick_random()


>>if random_key != item_set:


>>>break

222 928566
>>28549
Ну да, я сам когда запостил, был уверен, что к этому моменту доебутся. Цикл с постусловием нужен так редко, что в современных языках про него забывают.
А дублирование кода да, устранять надо. Еще и мидлом назвался, ага. (эт я про себя)
Вот варианты как без дублирования кода. Просто с дублированием цикл иногда не будет выполняться ни разу, а в пикрелейтедах всегда один раз или больше.
223 928605
Ну вот, прошу помочь понять, почему в гридконтейнер не добавляются предметы
Код повторил за mrD с ютуба но что то может проебал
func clear() закомнетировано для теста
224 928607
и еще
225 928611
Годаны, а я игру делою.
226 928621
>>28611
Докажи!
image.png527 Кб, 922x867
227 928627
>>28621
Вот я.
228 928629
>>28605

> почему в гридконтейнер не добавляются предметы


ЯННП, но возможно там туториал по трёшке, а ты не глядя лепишь в четвёрке.
229 928639
>>28605
А картинки в папке Sprites/items есть? Она выглядит пустой, а TextureRect подсасывает картинки по пути с файлами 0.png, 1.png итд
230 928644
Нашел где ошибка
Итем в радиуе игрока вызывал у него функцию _pick передавая имя
но потом удалялся, а скрипт _pick обращался опять к итемуб запрашивая имя и количество, а он то блять удален! и вылетала ошибка
Чутка переписал и сразу в функцию передаю и имя и количество в функцию

думал конечно что сначала функция у игрока выполнится и он потом удалится а оказывается хуй

>>28639
есть, просто это вид навигации такой, в одном окошке папки в другом их содержимое
image.png16 Кб, 745x485
231 928647
>>28644
стоит упомянуть что я скорее всего проебал момент где надо в итем писать функцию _пик
232 928648
>>28644
Ну ок, малаца, учись, постигай. Ждём шедевров от тебя. Обращайся за помощью. Поможем.
170569550238176169.jpg21 Кб, 600x332
233 928649
>>28648
Угу, постараюсь
1705740582967.jpg55 Кб, 497x550
234 928706
>>28649
Жоская игра на пикче, выглядит жоще серии дарксоулс.
235 928712
Дайте совет, пожалуйста, как найти причину падения, если игра просто закрывается и ничего не пишет в лог?
236 928713
>>28712
Создать новый проект и по очереди забрасывать ресурсы из старого, пока не произойдёт крош. Тогда и узнаешь, что вызывает крош.
237 928714
>>28713
Не вариант, он падает во время игры в неопределённые моменты, одна и та же последовательность действий не ведёт к его повторному падению.
238 928718
>>28714
Как вариант, сделай бэкап проекта, удали из проекта все файлы импорта и кэша, создаваемые годотом. Запусти и дождись реимпорта.
Если не поможет, то - >>28713
239 928721
>>28712

>если игра просто закрывается и ничего не пишет в лог?


Уверен что у тебя ни в каком забытой коде не вызывается get_tree().quit() или подобное? Я помню на бете сегфолт поймал, но даже он в лог написался.
240 928723
>>28718
Попробую, но сперва оберну всё-всё в трай-кэчи
>>28721
Точно нет, у меня только один выход в меню, который срабатывает исключительно по нажатию
241 928726
>>28723

> трай-кэчи


В гдскрипте нет трайкэчей. Или уже есть? У тебя код на шарпе?
242 928727
>>28726
На шарпе, наверно стоило это сразу сказать
243 928730
>>28727
Ну как бы да. Ты как бы по факту сейчас мозги нам всем присутствующим ебал. Чистый годот без дополнений (а связка с шарпом выполнена как аддон, просто это упрятано с глаз) всегда пишет в лог и в консоль, когда падает.
244 928746
Как сделать, чтобы add_child добавлял узел не к узлу, где прикреплен скрипт, а к другому?
245 928750
>>28746
$nuzhniy_uzel.add_child(peremennaya_s_ekzemplyarom sceny)
246 928752
>>28750
Спасибо, а то я уже хотел колхозить сигнал к другому скрипту
image.png15 Кб, 675x123
247 928789
вот тут ютубер сравнивает дистанцию (distance_to) между прошлой позицией (prev_pos) и текущей(position) с 0.6
0.6 чего епта?

все это вызывается функцией _process(delta): каждый раз когда у обьекта есть скорость
248 928794
>>28789
Условное значение, которое он посчитал достаточно маленьким, чтобы остановить на нем движение. Чтобы считать что объект пришел к своей цели.
249 928795
>>28794
это вообще функция для того чтобы если моб упрется в стенку то немедленно перестал идти и выбрал другую точку на карте для прогулки

так это 0.6 чего? координат? сантиметров? пикселей?
250 928797
>>28795
Godot uses the metric system for everything in 3D, with 1 unit being equal to 1 meter.

https://docs.godotengine.org/en/stable/tutorials/3d/introduction_to_3d.html
251 928801
>>28797
спасибо
252 928802
>>28795
Если 2д то пикселей
Если 3д то абстрактных единиц (которые можно считать метрами, а можно не считать)
253 928807
Как проще всего запилить в 2д игре вывод текста под углом?
Хочу сделать монитор на столе с текстом, кнопками и прочим, стоящий под небольшим углом к игроку
254 928809
>>28807
Сплюснуть и повернуть
Или шейдер написать
Или нарисовать спец шрифт
image.png6 Кб, 220x26
255 928832
а что в этих скобках принимает функция?

и еще в видосе чел сделал так
var healf : float
это как понять? почему не через знак "=" ?
256 928833
>>28832
https://www.youtube.com/watch?v=y3faMdIb2II
а тут он вообще пишет
var atack_damage := 10,0
Нахуя через двоеточие?
257 928834
>>28833

> Нахуя через двоеточие?


Автовыведение типа. Двоеточие - это токен указания типа, если тип не указан, а стоит равенство, то тип выводится из значения после него, в данном случае 10.0 - будет float
258 928835
>>28834
Гениальная хуйня, похоже не уёбищное присваивание в паскале, но в отличие от него имеет смысл, а не просто понтуется, как паскаль.
259 928836
>>28834
так оно же и просто через "=" само определяет тип, разве нет?
чето не догоняю, нахуя отдельно указывать тип данных
260 928837
>>28833
переменная : тип = значение
Тип опционален
Присваивание опционально
261 928838
>>28836
Есть тип объекта (значения), а есть тип переменной
262 928839
>>28836

> разве нет?


Нет. Просто через равно присваивается как бы динамически, но по факту в тип Variant, который выполняет функции динамической типизации, что ооооочень медленно и из-за этого на годот постоянно ругались, что гдскрипт медленный. Поэтому Хуан сделал статическую типизацию, да ещё бонусом сделал автовыведение типа.

Мы это выше обсуждали, без конкретики:

> var d = 2


> d = "two"


Это работать будет, d поменяет вариантное значение-инт на вариантное значение-строку.

> var d := 2


> d = "two"


А тут вывалится эксепшн. Потому что d автоматически выведено как int и строку больше не примет.
263 928842
>>28839
>>28838
>>28837
Теперь понял, спасибо
264 928853
Спите? А могли бы игры делать. Часики-то тикают.
265 928858
>>28853
Купи электронные
266 928859
>>28853
Вы молодец.
Мотивируете анончиков.
Спасибо вам за вашу гражданскую инициативу.
267 928887
>>28853
да блядь, я уже заебался отвлекаться на всякую хуйню в интернете. Работаем ребята!!!
image.png223 Кб, 427x320
268 928941
>>28838

>Есть тип объекта (значения), а есть тип переменной.

1638202956726.png243 Кб, 426x512
269 928949
>>28941
Да, иногда пишу в блокноте.
270 929044
>>28949

> 1638202956726.png


Вся суть пориджей в одной пикче.
271 929057
>>29044
Этот мем старше тебя.
272 929097
Хочу вкатиться но помимо официальной документации очень мало полезной информации в виде текста, все снимают видео туториалы для школоты. Есть информация о примерной структуре проекта? Как понять что эту механику лучше разбить на компоненты? Паттерны программирования?
Помимо официальной докусентации не нужно ничего, чтобы делать игры на годоте 273 929100
>>29097
Анон, без обид, но все вопросы, которые ты спрашиваешь - не относятся к движкам напрямую, а являются общими знаниями для геймдева, а такая вещь как паттерны так и вообще - фундаментальна для кодинга.
Нахуй тебе связка с годотом?
Изучи всё это в связке с си и консолькой, если всё будешь понимать, то реализация в годоте не составит труда, более того, обладая знаниями, ты сам будешь видеть, какие паттерны применялись в архитектуре годота, какие методы объектов редактора оставлены для реализации паттернов для тебя, и т.д.

Извини, но сейчас я в твоём посте знаний не вижу, я вижу, что ты выучил умные слова, но смысла их не понимаешь, и что самое страшное (для тебя), ты уверен что есть где-то волшебные книжки, в которых всё написано так, что ты мигом станешь новым Кодзимой.

Это так не работает. Пиздуй в /pr/ и смотри там в закрепе литературу. Вот её и читай. В геймдев рано тебе.
274 929101
>>29097
Смотри туториалы про систему компонентов. Можешь на х2 смотреть и на английском, не почувствуешь себя тупой школотой.
275 929102
Реквестирую лучший гад по сохранениям
276 929103
>>29102
Пишешь что важно в файл
@
Не важное в файл не пишешь

При загрузке читаешь важное
@
Не важное считаешь заново
277 929110
>>29103
Базовый гайд. Базовитый. Возбазвлённый. Схоронил. Отчеканю в золоте. Внукам покажу.
278 929112
>>29110
Иронизировать не надо, к этому всё и сводится, дальше идут варианты в зависимости от архитектуры и в принципе игры. Если ООП - у каждого объекта должен быть своя функция сохранения/загрузки, если ЭКС - то по всем проходишься и сохраняешь у кого какие компоненты.
279 929114
>>29112
Мне нравится сохранение через синглтон-менеджер. Буду всегда воспевать его и форсить. (Пока не найду идею еще круче).
image.png13 Кб, 659x138
280 929116
Обьясните что за (control as Control)
Как понять? Переменная становится узлом контроля для узлов в сцене и глобально меняет видимость?
281 929117
>>29116

>(вася_пупкин as Человек).пукнуть(вонюче)


>(вася_пупкин as Двачер).постить_на_дваче(хуйню)


Приведение типов это называется в информатике.
282 929119
>>29117
Всеравно не понял
1687188614190.png221 Кб, 904x832
283 929120
Как лучше всего добавить на тачскрин кнопки для перемешения персонажа? Есть TouchScreenButton, он практически идеально подходит для моей задачи, но вот только он наследуется от Node2D и годо меня нахуй шлёт когда я пытаюсь его прилепить к интерфейсу
284 929123
>>29120
покажи все дерево от рута
image.png16 Кб, 283x418
285 929124
>>29123
Совершенно новый проект, который я создал только-только накатив себе one-clock deploy. Гугл сказал что можно использовать button, но не уточнил каким именно образом
1705942328132.jpg67 Кб, 700x700
286 929125
>>29119

> Всеравно не понял


Сочувствую.
image.png23 Кб, 266x428
287 929136
>>29124
Ладно, пока я тут думал, я решил просто обернуть их в Control подогнав у них custom_minimum_size под сами кнопочки. Хз насколько это хорошее решение, но оно пока у меня работает
288 929143
>>29136
Это плохое решение. Тач-функционал есть и у зелёных кнопок. А синие тач кнопки нужны не для интерфейса, а для внутриигровых действий.
1705947168883.png17 Кб, 690x174
289 929146
>>29136
Вот тебе пять секунд гугла за разницу между зеленой кнопкой и синей тачскринкнопкой.
В игровых интерфейсах мультитач используется редко, мультитач используется именно в самих играх, поэтому такой функционал вынесли в синие ноды.
Если тебе нужен от кнопок мультитач, несложно его самому реализовать на зелёных кнопках, там десяток строк кода будет.
290 929153
>>29097
Базовые рецепты текстом
https://kidscancode.org/godot_recipes/
Также, на гитхабе сотни проектов-примеров которые можно скачать и посмотреть архитектуру.
291 929154
>>29116
Это называется каст, приведение типов. А конкретно, up-cast, приведение к базовому типу.
В массиве тебя объекты разных типов - TextureRect, Label. Но все они наследуются от Control.
Конкретно в данном примере - нахрен не нужно. А вообще
Плюсы
-Автодополнение.
-Доступ только к полям/методам указанного класса. Не будешь использовать поля label у texture_rect.
-Проверка ошибок во время разработки - если в массив попадет спрайт, программа здесь остановится с ошибкой.
Минусы
-Производительность. Если всю программу обмазать таким, наверное просядет на пару процентов
-В релизе программа будет падать. Надо бы еще обмазывать проверкой if control is Control и предусматривать что делать в таком случае. Возможно все равно падать.
Где полезно, например наоборот down-cast:
В обработке ввода, тебе прилетают InputEvent. У базового InputEvent мало свойств. Но если сделать что-то вроде
var mbevent = (event as InputEvenMouseButton)
if mbevent: var pressed = mbevent.pressed
Получаем доcтуп к полям которые у класса-наследника.
Можно писать и без каста, но с ним чуть удобнее разрабатывать.
292 929155
>>29154

> У базового InputEvent мало свойств. Но если сделать что-то вроде


> var mbevent = (event as InputEvenMouseButton)


> if mbevent: var pressed = mbevent.pressed


В четвёрке еще круче сделали. Если ты пишешь

>if event is InputEvenMouseButton:


внутри этого ифа для event происходит апкаст автоматически и подтягиваются методы в автодополнеии. Лично пользовался. Радовался.
293 929161
>>29146
Спасибо, нацепил таки на кнопочки скрипты с нужными строчками и всё вроде работает как надо
294 929197
>>29097
Чел если хочешь вкатится, то просто вкатываешься и все. Читать книжки, смотреть гайды ДО вката полная хуйня и нахуй не нужно

Открываешь в офф документации гайд по 1 игре, делаешь всё по пунктам и все. Просто чтобы ты понимал какие где находятся кнопки.

Дальше уже начинай делать собственную игру, очевидно не 3д открытий мир, а простенькую 2д, считай это даже не игрой, а демкой, над идей можешь не запариваться.
И уже в процессе гуглишь конкретные вещи, по типу как сделать игрока, чтобы двигался и так далее.

И уже сильно позже, когда у тебя получится кривой багованный кал, который невозможно дальше разрабатывать, ты начнёшь понимать как надо было делать, какая должна быть структура проекта, как подходить ко всему этому, чтобы работало нормально. И тут ты спокойно дропаешь свою демку и можешь начинать делать что то чуть серьезнее. А все эти видео, и особенно целые книги как правильно срать не нужны по крайней мере в начале
295 929199
>>29197
Бля а я решил сначала по ютуб гайдам игры поделать простенькие и уже потом чето свое пилить
296 929200
>>29199
+Мимо
297 929201
>>29197
Двачую этого. Базу выдал.
298 929218
>>29199
Норм план. Я так делал. Потом на основе гайдов можно пилить что-то свое адаптируя информацию из них под свои нужны + гуглить недостающую инфу.
image.png285 Кб, 1000x656
299 929232
>>29100

>к движкам напрямую, а являются общими знаниями для геймдева


сцены, структурирование кода, является специфичным для godot
оно отличается от обычного программирования

лучше бы вместо сцен сделали структуру проекта в виде нод как на пикрил, т.е. универсальный абстрактный слой

в godot с наскоку непонятно к чему скрипты прикреплять и как вообще должна выглядеть программа, хочется создать "main.c" и модули/библиотеки для нее
300 929238
На что влияет расширение файла сохранения? Посмотрел несколько туториалов и встретил такие расширения: .cfg, .dat, .json, даже .save

Какая разница, что использовать? учитывая, что везде файлы можно хранить в json
301 929239
>>29238
Без разницы какой формат файла, важно что внутри
302 929256
Есть ли аналог GameLevels Blueprint https://godotengine.org/asset-library/asset/1402 но для 4 версии годо? Выглядит очень удобно

Не очень хочется заморачиваться со сторонними сервисами, типа draw.io
303 929266
>>29232

> оно отличается от обычного программирования


Это всё древовидные структуры данных, бои. Это еще в прошлом веке на курсах преподавалось. А самым ярким представителем прикладных языков разметки, основанном на НОДАХ является XML.

> лучше бы вместо сцен сделали структуру


Кому лучше? Тебе лучше? Так у тебя же каша в голове, даунинг-крюгерская. Ты не знаешь, что тебе лучше.

> универсальный абстрактный слой


Пустые слова рикошетом отразились в пустой голове и выплеснулись на двачи.

> в godot с наскоку непонятно к чему скрипты прикреплять


Всем понятно одной бабе яге непонятно.

> и как вообще должна выглядеть программа, хочется создать "main.c" и модули/библиотеки для нее


О, снова решил блеснуть умными словами. Скачиваешь исходники движка и пишешь ПРОГРАММУ прямо там, в проекте движка, дополняя его своими модулями с игрой, там тебе и мэйн.си будет и указатели на указатели. Но ты почему-то так не делаешь, ты прибежал ИТТ доёбываться к редактору движка, прикладному инструменту. Я тебя насквозь вижу, движкосрачерское животное.
304 929271
>>29266
Хорошо бомбанул :)
я просто проходил мимо

>ты прибежал ИТТ доёбываться к редактору движка, прикладному инструменту


ты просто очередной пограммист который наворачивает фреймворк с костылями и потом защищает костыли, потому что потратил на их изучение время
да да, сделай лучше, иди нахуй
305 929281
>>29232

>в godot с наскоку непонятно к чему скрипты прикреплять


К ноде. Больше не к чему.

>хочется создать "main.c" и модули/библиотеки для нее


Это один из штатных способов.
https://docs.godotengine.org/en/3.1/classes/class_mainloop.html#description
306 929284
>>29266
Базанул, два чая.
image.png627 Кб, 588x680
307 929290
Делайте игры.
308 929292
давайте сделаем клона пакимонав с хрущевками и ментами
309 929294
Зачем писать return у фнкций?

var a = 0

func test():
a += 1

Переменная a ведь все равно изменится, так? Так!
И второй вопрос. Зачем писать func test() -> void:?
310 929297
>>29290
Да делаю, делаю, блин! Вот заканчиваю набросок функциональности главного меню!
311 929299
>>29294
Void это вроде делает функцию глобальной
Return это когда ты в переменную суешь функцию из другого скрипта
Типа
var pipiska = $hui.drochit()
И в функции droichit() будет ruturn(cum)
То будет var pipiska = cum
image.png25 Кб, 505x294
312 929310
зачем в дельта_мувмент умножать на дельту? что вообще такое дельта я нихуя не пойму, чето про кадры
313 929311
>>29310
Сколько времени прошло с последнего кадра, если кадры часто меняются - за раз движение маленькое, если редко - сразу на большое расстояние переместишься
314 929312
>>29310
Дельта это delta time, то есть разница времени между кадром и предыдущим. Формула расстояния S = t * v, поэтому чтобы узнать расстояние скорость умножают на это время, так движение будет пропорционально "порции", вне зависимости от фпс
315 929313
>>29294
void значит return не должно быть, и если ждать что то возвращаемое от это функции будет ошибка.
316 929314
>>29290
Некогда, свой движок сейчас пишу 2d, на Zig
317 929315
>>29299
Войд не делает функцию глобальной. Войд это тайпхинт, показывающий что функция возвращает ничего. Если внутри такой функции сделать ретурн "пенис", то годот поймает это как ошибку.

Тайпхинты повышают понимаемость кода, помогают ловить ошибки типов и иногда ускоряют код - поскольку годоту не приходится самому распознавать чего ты там ему в переменную кладешь, он знает заранее. Актуально в интенсивных участках кода.
170603451745835117.png129 Кб, 800x769
318 929316
>>29311
>>29312
Теперь пон, спасибо
170603408966399194.gif405 Кб, 112x112
319 929317
>>29315

>Тайпхинты повышают понимаемость кода, помогают ловить ошибки типов и иногда ускоряют код - поскольку годоту не приходится самому распознавать чего ты там ему в переменную кладешь, он знает заранее. Актуально в интенсивных участках кода.


Хуя годноту нубикам сыплют в треде
image.png30 Кб, 396x377
320 929325
Как заставить партикли собираться в хвост? То есть, чем дальше от эмиттера, тем сильнее они притягиваются к центру. Чет все опции перетыкал, ничего не найду. В видосах на ютубе люди такое делают уменьшая размер партиклей. Мне нужно чтобы они были одинакового размера и в начале и в конце.
321 929328
>>29325
Хотел посоветовать GPUAttractor,но в 2д их пока не завезли
image.png313 Кб, 1200x628
322 929424
Хеллоувордщик итт

Пикрил литерали getting started с оф сайта этого вашего годота. Миллион функций хуярится для какой-то банальной хуиты, умножение на неведомую хуйню, ну и конечно все эти функции завернуты еще в сотню функций с созданием миллиона нодов разных типов, в итоге передвинули инстанс на 2 пикселя влево. В то же время в каком-то геймейкере и прочих подобное выглядит как-то так:

>zalupa.speed = 100px


>if press(arrow_up) zalupa.y += 10



а не

>export balls


>$zalup_zalupa_speed = 666 * delta / alpha^1488


>$huesos(if_pidor) = !down


>func _pidoras($huesos(if_pidor)).govno.mocha:


>dvacher = !human + virgin


>zalup_zalupa = 100/10


>$CollisionShit2D.set_pidoras("disabled", true)

323 929427
>>29424

> а вот в годотееее


> а вот в гамакеее


Репорт за движкосрач.
image.png356 Кб, 1280x720
324 929432
>>29424
Потому что годот изначально считает тебя умным
325 929435
>>29432
Поэтому в своё время я послал его нахуй и переехал на юнити.
326 929440
>>29435
Ну и зачем тогда ты сюда пришёл? Не боишься что за посты деньги брать начнут?
image.png251 Кб, 482x623
327 929446
>>29424

>>zalupa.speed = 100px


>>if press(arrow_up) zalupa.y += 10


Аналогично можно и в годоте. Разница в том, что туториалы учат тебя делать тебя правильно, а не кое-как, и рассказывают как строить проект размером больше чем один спрайт.
328 929449
>>29424
чел ты буквально решил насрать в тред, но при этом забыл снять штаны
329 929462
>>29435
А мы послали на хуй юнити
330 929468
3д. Как заставить объект повернуться ДО его добавления в дерево? Я использую look_at. Если его дернуть до добавления объекта через add_child, он ругается что condition !is_inside_tree is true. Логично, ок. Но поворачивая объект внутри _ready у меня будто фрейм проходит, прежде чем он повернется. Объект спавнится, фрейм сидит как есть, потом поворачивается. Выглядит дергано и всрато.
331 929470
>>29468
Навскидку никак. В такой ситуации только вычислять поворот самостоятельно и передавать объекту. Но может кто подскажет хитрый хак?
332 929472
>>29470
Хитрый хак есть в каждом втором чарактер контроллере и туториале.
Воспользоваться силой нод.
Повернуть пустую ноду в нужную сторону, а уже ей спавнить дочернюю нужную. Потом при желании перенести заспавненное в другое место.
Стикер512x512
333 929476
>>29424
Ладно, погуглил и полистал другие статьи с их же сайта, стало понятнее. Но какого хуя не добавить все в первый тутор? Вот блять выбирай тут такой тип ноды, а тут такой, а в чем между ними разница - иди нахуй в гугл
334 929484
>>29470
>>29472
Сделал проще:

new_object.hide()
add_child(new_object)
yield(get_tree(), "physics_frame")
new_object.show()

Таким образом все еще используется look_at внутри реди, а первый фрейм, в котором апдейтится поворот, скрыт.
335 929485
>>29424

>оф сайта этого вашего годота


Любого оф гайда
Снимок экрана от 2024-01-24 22-46-15.png10 Кб, 609x73
336 929506
Вот скрипт от ютубера для предотвращения вылезания персонажа за границы экрана
Что делает "||" и "return" ?
338 929509
>>29508
С "или" понял
А что собственно возвращает return ? Прошлый кадр?
339 929511
>>29509
Ничего, раз не написано. Просто возвращает досрочно, не продолжая выполнение функции.
340 929512
>>29511
Аааа, тепепь понял
Там просто под ней уже в переменную новые координаты персонажа записываются

Жаль ютуберы это нихуя не обьясняют
cover01.webp176 Кб, 620x778
341 929524
343 929527
Что за белые полосы по краям экрана, когда запускаю fullscreen?
И еще есть проблема, как только ставлю mouse_captured, то экран начинает как бы моргать позади окна игры, если не в фул скрине запущено, но если перенесу окно на другой монитор, или скрою сам окно движка, то все ок.
344 929528
>>29512
Начни учить основы какого-нибудь языка, параллельно тыкаясь в игры, чтобы не скучно было. Ты простейших основ не знаешь
345 929530
>>29524
Неплохо. Тут как раз кто-то недовольный ютуб гайдами пробегал.

А я все еще на тройке сижу.
346 929545
>>29524
Найс
347 929557
>>29528
Когдато учил и питон и с# тоже по урокам с ютуба, но успешно задушился и бросил
Уж лучше так, на практике познавать
348 929558
>>29512
Рекомендую канал "godot для всех" на ютубе. Там довольно шарящий чел с самого нуля все рассказывает доходчиво и подробно. У него есть цикл, где игру с нуля делает, + параллельно цикл где разбирает основы гдскрипта.
349 929559
>>29558
Гляну, спасибо
350 929560
>>29524
Спасибо
351 929567
Хочу допилить свою игру до +- играбильного состояния осталось уже не так много и выложить сюда, а ля pre-super-ultra альфа доступ в виде ссылки на гугл диск с билдом, какие подводные?

Просто есть параноидальные мысли, что код/идею и прочее могут украсть или ещё как то поднасрать
352 929585
>>29313

>void значит return не должно быть


Из Void функций можно делать return, но без значения.

Возможно, я путаю с питоном
353 929591
>>29567
Выложи видео, с него точно код не спиздят
354 929592
>>29567
>>29591
А разве компиленую игру так легко сдекомпилить?
355 929600
>>29567

>Просто есть параноидальные мысли, что код/идею и прочее могут украсть


Именно поэтому не буду сюда ничего выкладывать, пока не буду на финальной стадии
1706177576221.jpeg331 Кб, 1920x1080
356 929613
>>29567

> есть параноидальные мысли, что код/идею и прочее могут украсть


Код твой нахуй никому не нужен. У тебя же там каша из туториалов вместо кода. Проще с нуля всё переписать чем твоё пиздить.
Идею спиздят сразу же как увидят. От этого не застрахован никто. Посмотри, Palworld - наглый пиздинг покемонов и зельд, нинтенда в ахуе и уже пишет иски в суды, пиздинг фортнайта, пиздинг любых игор с данжами, нужное подчеркнуть.
357 929614
>>29567
Подводных никаких. Но лучше бы сразу на итч выкладывал - аудитория шире и веб-версию погонять можно.

Код твой никому не нужен, если только у тебя не йоба-хитрая идея, основанная на еще более йоба-хитром алгоритме. И то маловероятно.

>>29592
https://github.com/bruvzg/gdsdecomp
Да, годот без обфускации/шифрования легко декомпилируется. А андроидовские апк/абб можно открыть как зип-архив и почитать не-исходники голыми руками, например .txt. Сами исходники в байт-коде, поэтому их надо восстанавливать отдельно. Я как-то упаковал в андроид билд свой безумный TODO.txt, потом вспомнил что ЩАС ВСЕ ПРОЧИТАЮТ МОЮ ШИЗУ, и побежал пересобирать. Всем было похуй, 20 загрузок в гугл-плее за месяц.
358 929616
>>29614
А что если я игру залью а ее кто то просто возьмет и выдаст за свою, а на меня жалобу кинет
Как защититься от этого? Открывать струдию? Как права защитить?
359 929618
>>29616
А я не знаю. Ну, для перезаливки-перепродажи твою игру и декомпилировать не надо - взял экзешник и перезалил как свой. Так со всем итчем можно провернуть.

Помимо юридических залуп, в которых я не шарю, предположу что стоит делать все публично, заранее, и брендируя. Выкладываешь демки, видосы, девлоги, раскидываешь по соцсетям, чтобы всем было видно что vasyan666 работал над Cube Craft World 2D аж целых 8 лет. Заодно реклама. Я так делою, и ты так делой.
360 929622
>>29618
Еще ж можно в главное меню засунуть список авторов
361 929636
>>29567
Я так подумал, действительно кроме идеи пиздить у меня нечего, код это просто смех. Да и идею без специфических знаний просто так не украдешь.

Вообщем небольшой анонс, игра это симулятор врача приемного отделения в сеттниге мухосранской больницы. Как paper's please, только про медицину, бедность, алкашей и безнадежность. типичное приёмное отделение районной больницы

Геймплей это по жалобам определить диагноз и отделение для госпитализации. Пациенты генерируются полностью случайно, у них есть некоторые характеры, а ля агрессивный, доброжелательный, пьяный. Игра в том числе для людей, не знакомых с медициной, поэтому симптомы и диагнозы я упростил, но не сильно, подумать придется. Для помощи будет внутренний справочник, реализованный в виде монитора компьютера. То есть, вы будете буквально при пациенте гуглить его симптомы классика.

Когда будет тест неизвестно, но большую часть в виде генерации пациента и базы с диагнозами, симптомами и репликами я уже сделал, осталось допилить интерфейс и ещё пару фич по мелочи.

Я думаю будет хотя бы забавно, уже для теста я набросал 3 отделения по 5 диагнозов, у каждого несколько специфических симптомов + неспецифические.
362 929641
>>29636

> идею без специфических знаний просто так не украдешь


Чивобл?
Кабанчик проходит твою игру и делает 10 таких же.
363 929643
>>29641
Так понимание какое никакое надо, чтобы грамотно написать те же диагнозы и симптомы. Конечно все можно спиздить, но если кабанчик не разбирается в медицине, то хуй он что нормально даже спиздит.
364 929645
>>29643
Скажу честно, как человек много лет дрочивший симуляторы и всякие дотошно честные воссоздания разных явлений - в игре главное фановость, даже если там неправильные диагнозы. Врачи все равно найдут у тебя кучу неточностей. Еще хуже если кто то решит что твоя игра похожа на реальность и начнет по ней судить о здоровье. Как раз кабанчику проще, он просто будет пихать смищнявые несуществующие волчанки.
image.png984 Кб, 1415x1041
365 929649
Сап, годач.

Смотрите, есть игрок, есть уровни-сцены. На уровнях есть объекты, которые могут изменять свои параметры. Например, дверь открылась, яблоко подобрал игрок, ящик передвинут и т.п. Игрок может перемещаться между уровнями, соответственно уровни-сцены загружаются туда-сюда по новой, но изменения должны сохраняться

И так, я верно понимаю, что при каждом пуке игрока, изменении параметров предметов, уровней и т.д. должны изменяться соответствующие параметры в глобальном скрипте. И уже из него при повторной загрузке уровня со всеми предметами должны подтягиваться актуальные параметры?
И этот скрипт должен быть подключен к каждой сцене в игре?

И также при сохранении в файл сохранения должны подтягиваться значения из этого скрипта? А если сохранения не было, например, игрок погиб (откат до чекпоинта) или вышел из игры, то значения должны обратно меняться на предыдущие, которые также хранятся в этом глобальном скрипте?

Ничего не путаю?
366 929657
>>29636

>Я так подумал, действительно кроме идеи пиздить у меня нечего


Т.е. кроме самого ценного, лул.
image.png5 Кб, 218x103
367 929672
Какие подводные камни в editable children?
368 929674
>>29645
База.
369 929678
>>29649

> Ничего не путаю?


Ну вроде всё верно. Главное, чтобы тебе было удобно, не пытайся прямо буква в букву воссоздавать советы из прошлого треда. Действуй по ситуации.
370 929682
https://godotengine.org/article/dev-snapshot-godot-3-6-beta-4/

В тройку везут ускорение освещения и теней.
371 929687
>>29672
Какие-то были, точно не смогу описать, связано с тем, когда что-то поменяешь в той сцене, или с экспортами. В общем, была ситуация что я чарактер контроллеру прицепил камеру,во время едит чилдрен. А потом передумал и сделал камеру внутри сцены чарактер контроллера. У них вообще-то одинаковые имена ноды получились, и потом галочки и возможные действия с ними подглючили.
372 929689
>>29682
Е-е-е, время обновиться к твг, самое то для проверки фич.
373 929696
>>29687
У меня похожее с наследованием сцен было на какой-то древней версии. Вроде пофиксили.
374 929786
>>29649
Ну, можно так.
Все предметы, которые должны сохраняться, добавляешь в группу Save. При сохранении глобальный скрипт опрашивает все ноды в этой группе на предмет изменений.
ИЛИ
В момент изменения предмет сам сообщает глобальному скрипту, что в нём что-то изменилось.
При загрузке глобальный скрипт смотрит все ноды, о которых у него есть записи. Обращается к ним и восстанавливает их состояния. О которых записей нет - к тем не обращается.

Мой личный подход:
Я храню глобальный словарь, внутри которого словари уровней и всякая глобальная метаинфа, внутри которых словари нод и всякая уровневая метаинфа.
Глобальный скрипт ничего не знает о нодах, он обращается к уровню, чтобы тот сам опросил своих детей. И ни глобальный скрипт, ни уровень не знают, как сохранять/загружать данные для конкретной ноды, этим должна заниматься сама нода.
У нод, которые надо сохранять, есть функция save() -> Dictionary, возвращающая собсно инфу о ноде; а что там сохранять - это для каждой ноды индивидуально прописывается. Если функции нет, то просто пишем пустой словарь. Если нода удалена, то вместо словаря - строка "deleted".
У тех же нод есть функция load_saved(data: Dictionary) -> void. Соответственно, скармливаем ноде её сохранённые данные, она уже сама разберётся, что с ними делать. Ну или если нету функции, то не скармливаем.
И да, обе эти функции есть и у уровня.
А получившийся глобальный словарь очень легко (одной строчкой буквально) отконвертить в жсон, хмл, сериализовать в бинарный или текстовый формат, чтобы сделать из этого сейв-файл. Ну и обратно точно так же в одну строчку. И да, в словарях для save и load_saved следует использовать только строки и числа.
Можно (но не очень желательно) всяким комплексным нодам разрешать в свой сейв-словарь вкладывать словари детей, чтобы они тоже сохраняли и загружали, но это чревато трудноуловимыми багами, когда у тебя что-то не загрузилось, а ты не знаешь, когда и почему.

А, и ещё. Глобальный словарь висит в памяти, но он не обязан сохраняться в файл всякий раз, когда получает изменения.
374 929786
>>29649
Ну, можно так.
Все предметы, которые должны сохраняться, добавляешь в группу Save. При сохранении глобальный скрипт опрашивает все ноды в этой группе на предмет изменений.
ИЛИ
В момент изменения предмет сам сообщает глобальному скрипту, что в нём что-то изменилось.
При загрузке глобальный скрипт смотрит все ноды, о которых у него есть записи. Обращается к ним и восстанавливает их состояния. О которых записей нет - к тем не обращается.

Мой личный подход:
Я храню глобальный словарь, внутри которого словари уровней и всякая глобальная метаинфа, внутри которых словари нод и всякая уровневая метаинфа.
Глобальный скрипт ничего не знает о нодах, он обращается к уровню, чтобы тот сам опросил своих детей. И ни глобальный скрипт, ни уровень не знают, как сохранять/загружать данные для конкретной ноды, этим должна заниматься сама нода.
У нод, которые надо сохранять, есть функция save() -> Dictionary, возвращающая собсно инфу о ноде; а что там сохранять - это для каждой ноды индивидуально прописывается. Если функции нет, то просто пишем пустой словарь. Если нода удалена, то вместо словаря - строка "deleted".
У тех же нод есть функция load_saved(data: Dictionary) -> void. Соответственно, скармливаем ноде её сохранённые данные, она уже сама разберётся, что с ними делать. Ну или если нету функции, то не скармливаем.
И да, обе эти функции есть и у уровня.
А получившийся глобальный словарь очень легко (одной строчкой буквально) отконвертить в жсон, хмл, сериализовать в бинарный или текстовый формат, чтобы сделать из этого сейв-файл. Ну и обратно точно так же в одну строчку. И да, в словарях для save и load_saved следует использовать только строки и числа.
Можно (но не очень желательно) всяким комплексным нодам разрешать в свой сейв-словарь вкладывать словари детей, чтобы они тоже сохраняли и загружали, но это чревато трудноуловимыми багами, когда у тебя что-то не загрузилось, а ты не знаешь, когда и почему.

А, и ещё. Глобальный словарь висит в памяти, но он не обязан сохраняться в файл всякий раз, когда получает изменения.
375 929811
Аноны, здравствуйте.

Какой вариант схавает билдер и кодогенератор годота на шарпе?
1. [Signal] delegate CockSuck + EmitSignal(nameof(CockSuck)) + handler в другом классе
2. event Action{add;remove;} + emit + handler в другом классе
3. event EventHandler + Invoke +EventHandler в другом классе

Переживаю что годот мне напарафинит генерейтед классов и придется потом все перепиливать
376 929815
>>29811
Пишу пока так, не знаю во что годотик развернёт это дело при билде
377 929910
Реквистирую гайд, как найти лоха друга, который мне бесплатно за процент с продаж сделает неплохой хотя бы пиксельный графон и не будет выебываться подсказывать и советовать, как мне делать игру, продумывать сюжет и прочее
378 929917
>>29910

>неплохой хотя бы пиксельный графон


О каком разрешении спрайтов идет речь?
379 929921
>>29910
И какая палитра
380 929925
>>29917
16х16
>>29921
NES
>>29910
В срачетреде поищи.
381 929931
>>29917
Если брать персонажа за точку отсчета, то сначала нужно накидать вариантов. Ориентировочно 32x32. Вряд ли понадобится больше
>>29921
"мрачная"
382 929933
>>29931

>32x32


Тяжело
Какого рода игра и что нужно рисовать?
383 929938
>>29931
И "мрачная" это не ответ
Количество цветов и оттенков решает
384 929949
>>29933
2d survival horror. Персонажи, анимация, тайлы. Вообще можно пилить черновой вариант. Главное, чтобы размеры, кол-во кадров и т.п. подходили. А отполировать можно будет на финальных этапах.
>>29938
Вопрос понял. Сразу не отвечу, нужно будет прошарить палитры
385 929958
>>29949
Всеравно 32х32 тайлы ебанешься рисовать, особенно если там будет больше трех оттенков
Ну нахуй
386 929962
>>29910
Возьми бесплатные сс0 ассеты на итче.

>неплохой хотя бы пиксельный


>хотя бы


Иные пиксели посложнее лоу-поли 3д будут. С пикселями тебе самому надо перспективу, форму и все такое прорабатывать, еще учитывая их пиксельность и стиль. В 3д, если ты не охуеваешь с хай-поли, у тебя уже готовые формы из примитивов, а перспективу за тебя код считает.
387 929968
>>29962
На итче все ассеты разные для конкретных задач. Не подходят друг-другу. В итоге будет винегрет, который потом еще и фиксить придется. Где-то кадров больше нужного, где-то размер, и т.д.

>Иные пиксели посложнее лоу-поли 3д будут. С пикселями тебе самому надо перспективу, форму и все такое прорабатывать, еще учитывая их пиксельность и стиль. В 3д, если ты не охуеваешь с хай-поли, у тебя уже готовые формы из примитивов, а перспективу за тебя код считает.



Я не против лоуполи. Но и лоуполи, и просто 2д графон со скелетной анимацией выходит и дороже и в больше шагов. Часто ассеты делает один человек, а анимацию другой. И тут уже надо колотить команду с бюджетом. Пиздец короче. А если все делает один человек, то он и денег возьмет больше, чем чел, который покадровую анимацию в пикселях сделает. Не говоря уже про совершенно другие текстуры окружения, эффектов и прочнго
388 929969
>>29962
Базу говорит
Но там всеравно надо в цвет и светотень уметь
389 929974
>>29962
>>29969
Вообще да, лоуполи даже предпочтительнее будет. Типа как в первых резеках и сайлет хилле. Коряво, но от этого атмосферней и страшней, ну вы поняли.

Но да

>Но там всеравно надо в цвет и светотень уметь


И в производстве сложней получится. А я знаю, что не потяну в соло сейчас. Нужно с чего-то попроще начинать
valentine-skullgirls-bust.gif584 Кб, 500x475
390 930014
>>29524
Кста реально годнота, особенно для нюфагов. Лучше и последовательнее погружение так сказать
391 930184
Как правильно загрузить уровень, чтобы прокешировать все визуальные эффекты? Как пример - запускаю код на старой мобилке, по хиту вылетают партикли, получаю микрофриз. Все последующие хиты микрофризов не вызывают. То есть, как понимаю, после первого удара партикли закешировались и дальше работают плавно.
393 930199
>>30197
Никак не пойму че эту херь в сам движок не встроят, бесит же пиздец.
394 930200
>>30184
Там же галочка есть
395 930207
>>30199

> бесит же пиздец


Галоперидолу выпей.
396 930249
>>30197
Спасибо!

>>30200
А где галочка? В глаза ебусь?
397 930253
>>30249

> А где галочка?


В версии 4. Для версии 3 юзай ссылочку. Всё просто: трёшка - ссылочька, четвёрка - кнопочька.
1598510316119.png82 Кб, 1028x514
398 930256
>>30253
Как раз в 3 галоку завезли. Правда, в GLES3 только, не обратил внимание. Так что да, лучше предпоказ для надежности.
399 930257
>>30256
Да, блять, я забыл, я всё перепутал, в трёшку завезли кнопочку бэкпортом.
400 930396
А ошибку (не варнинг) можно заигнорить?
401 930398
>>30396
Нет.
402 930401
>>30396
Я не помню, в гдскрипте есть экспешоны?
403 930403
>>30401
Нет.
404 930410
>>30401
В гдскрипте применяется принцип возврата кодов ошибок. Если некий метод может вернуть ошибку, он будет возвращать int, в котором 0 - это ОК, всё остальное - коды ошибок. Тебе следует делать так же. Впрочем, делай как хочешь.

> func true_godot_style_divide(a: int, b: int, result: ref int) -> int:


> > if b == 0:


> > > result = INF


> > > return ERR_DIVIDE_BY_ZERO


> > else:


> > > result = a / b


> > > return OK



Разумеется, этот код работать не будет. Домашнее задание - придумать, как заставить такой код заработать.
405 930411
time_left стартует с 30 и каждую секунду -= 1

Функция с пикрила работает наоборот. Как такое может быть нахуй??? Аудиофайлы правильные привязаны, 100 раз проверил.
406 930412
>>30411

>работает наоборот


в том плане что при => 20 фаст, а потом нормал
407 930413
>>30411
А стоп где?
408 930415
>>30413
Как стоп повлияет на то, что первым фаст включается?
409 930430
>>30415
Может быть и не влияет, но у тебя нет конечного автомата. У тебя просто два независимых плеера которые играют когда ни попадя.
Зачем вообще два одноуровневых if, когда есть else?
Про play() я уже писал выше, он означает не "продолжить играть", а "сбросить поток и играть с начала". Который, судя по всему ты дергаешь каждый кадр.
Ну вот скорее всего так и получается, что тот плеер, который надо, ты этим каждый раз заглушаешь постоянными рестартами, а тот, который не надо, из за независимости, продолжает играть потому что его никто не стопает.
410 930431
>>30415
А почему играет фаст, по указанным обрывкам сложно угадать. Например процесс вызыаается всегда, включая первый кадр, а переменную ты инициализируешь позже, таким образом есть момент когда тайм лефт = 0, до того как станет 30. И поверь что не стоит галочка автоплея.
411 930446
>>30411
Код - пиздец.
Иф таймлефт меньше 20: эмит сигнал фастсаунд. Вот как надо. А в плеере подписаться на сигнал и при эмите сигнала переключить поток. Вместо этого два (2!) плеера! Судя по картинке, первый плеер как играл, так и играет, и после истечения времени плееры играют вдвоём.
412 930454
>>30446
Да еще и в процессе (через функцию-прокладку, что не поможет) дёргается дерево 60 раз в секунду (через сахарный $). Вообще пиздец.
413 930502
Как сделать, чтобы определенные слова в тексте были другого цвета

Например, чтобы во всех диалогах и прочем говне названия скилов всегда были красными?
414 930505
>>30502
RichTextLabel с BB кодами, если не будет хватать, пробовать разные аддоны типа диалоговых
415 930563
Может глупый вопрос, но что-то я не могу докумекать: есть дерево сцены, где-то в глубине есть курсор, на который я навешиваю обработку событий мыши. Как можно получить самую верхнюю ноду, над которой прямо сейчас находится курсор? Помогите пожалуйста. Если поможет зачем я это делаю, я хочу контекстное меню по правой кнопке мыши и чтобы с разными окнами оно было разным.
416 930565
>>30563
Я бы контекстное меню привязывал к элементу, на которой ты кликаешь, а не к самой мыши. Это, собственно, и был бы контекст. Каждый элемент содержит свой контекст.

Сделай сцену-компонент, назови ее типа ContextMenu, и втыкай ее всем элементам, по клику на которые должно вылезать меню. Потом, в этом элементе, лови эвент pressed, и по нему вызывай ContextMenu.display_your_menu()
417 930570
>>30505

> пробовать разные аддоны


Там всё делается через него же, по сути RichTextLabel с BB кодами - единственный штатный способ. Если анону не нравятся ББ-коды, то можно всё делать на низком уровне, через коллбэк _draw() делается, собсна пресловутый draw call. В нём через функции рисования на холсте можно с нуля построить всё что хочешь, в том числе самодельный ричтекст с разметкой.
418 930578
>>30565
Возможно ты прав, надо подумать...
419 930589
>>30570
Самому можно по разному сделать, вот навскидку:
- Состаалять динамический массив Label из подстрок
- то же самое, но делать Label только для цветных слов поверх них
- запилить модуль на c++ через freetype что нибудь
420 930592
>>30589

> динамический массив Label из подстрок


Ну это оверхед. Новичковый.

> запилить модуль на c++


А это наоборот слишком продвинуто.

Для среднестатистического годана намного выгоднее мой вариант, ИМХО.
421 930602
>>30592
Там есть draw text, но когда ты захочешь прыгающие по синусоиде буковки, то их вме равно по одной выводить, так что я не уверен что это сильно быстрее отдельных label
1706469690044.mp4354 Кб, mp4,
1280x720, 0:03
422 930606
>>30602

> их вме равно по одной выводить


То ты выводишь буковку в одном дравколле спецметодом, либо ты выводишь оверхед из кучи инстансов класса-ноды, набитых в дерево сцены, каждая из которых своим дравколлом рисует одну букву. Нуя хуй знает, конечно.
423 930616
>>30592
Вставлю свои 5 копеек
RichLabel + простенький модуль для оборачивания нужных слов в нужные теги по словарю

Щас бы это все вручную делать, конечно или целую либу на крестах писать

Мимошарподебил
424 930617
Задумываюсь о том чтобы пересесть с юнити на годот. Какие минусы и плюсы у него по сравнению с юнити?
425 930618
>>30617
На ютубе миллион видосов со сравнениями, особенно после осеннего бредка юнитеков, базарю, ты там быстрее и проще всё наглядно разузнаешь, чем будешь ждать ответов ИТТ.
426 930619
>>30618
>>30617
Но если вкратце, в основе отличий нет. Тот же мэйнлуп с коллбэками, как везде. Отличия в мелочах и в названиях. Там иерархия монобехов, тут дерево сцены из нод. Там префабы, тут сцены. Там ивенты как в винде, здесь сигналы как в линуксе. Там скриптобьекты, здесь ресурсы. И т.д. и т.п.

Для перекатунов с си-шарп-движка здесь искаропки поддержка сишарпа (ну как искаропки, отдельный билд с офсайта скачай всё равно), встроенный язык можно не учить. Официальная документация в основном на обоих языках даётся.
427 930620
>>30619
Щас пойду значит документацию всю читать, а потом и видосы разные наверну. Первый плюс который уже увидел, скорость блять. Как же он летает нахуй.
428 930625
>>30616
Я пробовал сделать двачебраузер, скажем так оборачивать пришлось бы дохуя и все равно не вся разметка покрывалась
429 930629
>>30625
Ты большой молодец, серьезно, но плохо продумал механизм работы с тегами, мог бы еще большим молодцом быть

Как бы ты сделал решение с подкрашиванием?

Я бы сделал так:
Допустим, диалоги это такая статичная штука, значит пишутся один или около того раз.

"Теперь ты умеешь пукоть %Skill%"

И вот нам надо покрасить этот %Skill%
На выходе получив что-то типа:
"Теперь ты умеешь пукоть [Color=green]%Skill%[Color/]"

Но, а если мы захотим изменить цвет отображения? Ползать по всем строчкам и менять? Да ну его нахуй.
Превратим строку в
"Теперь ты умеешь пукоть [Color=SkillColorTemplate]%Skill%[Color/]"

Я завожу класс DialogTextProcessor, где делаю словарь типа <string, string>, в который кидаю "StringColorTemplate"="Green"

Завожу метод Process, принимающий строку на вход, где будет foreach по этому словарю, реплейсящий все темплейты на их значение.

И возвращающий результирующую строку.
В итоге будем юзать так.
var incomingString = dialogsCache[dialogId][replicaId];

RichLabelText = DialogTextReplacer.Process(incomingString);

Сложность прохода foreach по словарю О(n), сложность поиска в словаре О(1), реплейс тоже О(n)

Значит все произойдет оче быстро.
Вот такую хуйню я придумал.
429 930629
>>30625
Ты большой молодец, серьезно, но плохо продумал механизм работы с тегами, мог бы еще большим молодцом быть

Как бы ты сделал решение с подкрашиванием?

Я бы сделал так:
Допустим, диалоги это такая статичная штука, значит пишутся один или около того раз.

"Теперь ты умеешь пукоть %Skill%"

И вот нам надо покрасить этот %Skill%
На выходе получив что-то типа:
"Теперь ты умеешь пукоть [Color=green]%Skill%[Color/]"

Но, а если мы захотим изменить цвет отображения? Ползать по всем строчкам и менять? Да ну его нахуй.
Превратим строку в
"Теперь ты умеешь пукоть [Color=SkillColorTemplate]%Skill%[Color/]"

Я завожу класс DialogTextProcessor, где делаю словарь типа <string, string>, в который кидаю "StringColorTemplate"="Green"

Завожу метод Process, принимающий строку на вход, где будет foreach по этому словарю, реплейсящий все темплейты на их значение.

И возвращающий результирующую строку.
В итоге будем юзать так.
var incomingString = dialogsCache[dialogId][replicaId];

RichLabelText = DialogTextReplacer.Process(incomingString);

Сложность прохода foreach по словарю О(n), сложность поиска в словаре О(1), реплейс тоже О(n)

Значит все произойдет оче быстро.
Вот такую хуйню я придумал.
430 930630
>>30629
Ну или унаследоваться от ричтекста, переопределив сеттер Value

И название скилла из темплейта и словаря собирать
431 930649
>>30629

> Сложность прохода foreach по словарю О(n), сложность поиска в словаре О(1), реплейс тоже О(n)


Годаны, научите считать сложность вот в этих терминах? Несколько раз пытался понять - нихуя.
432 930665
>>30563
Get_parent()
433 930666
>>26070 (OP)

Сап, годач. Значт делаю шейдер для избегания повторяющихся паттернов в повторяющейся текстуре. Идея проста -- рандомно крутить каждую плитку текстуры. Повторение по плитке я сделал, кручение каждой плитки я сделал, вроде бы самое просто осталось, крутить их отедельно, и на этом я застрял.

пикичи: 1-результат на пока что. видно что повторяется.
2- выражение в ноде, по сути ядро шейдера, тут то мне и надо что то дописать, думаю через 2д шум наверно рандомно крутить.
4- узлы визуального шейдера до выражения. Прошу помощи поскольку этот шейдер довольно важный.
434 930667
>>30666
добавлю как выглядит ЮВишка на выходе сейчас и как примерно надо
435 930677
>>30649
Все просто, считается по тому сколько данных мы обработаем. Самые легковесные операции типа сложения, вычитания или поиска в словаре или хешмапе, где время не зависит от размера входных данных - О(1)

Циклы О(n), потому что пройдем чаще всего всё
Цикл двойной вложенности О(n^2)
Тройной n^3 и так далее.
Обычно вот тут и появляются бутылочные горлышки

Поиск в бинарном дереве - О(log(n)), из-за постоянного деления количества элементов в котором ищем на два

Факториал O(n!) При, допустим, реализации комбинаторики, где сопоставляешь каждый элемент со всеми другими

Ну и экспонента n^сколько-то
При рекурсиях типа вычисления чисел фиббоначи

Тут можешь почитать подробнее
https://habr.com/ru/articles/782608/
436 930683
>>30666
А для меня шейдеры до сих пор ебаный темный лес. Удачи.
437 930692
>>30683
да для меня тоже, всё то что на экране -- понимаю лишь отчасти (а код с реддита спизженный), но вот это избегание паттерна нужно пиздец как сильно, без него никуда.
438 930696
>>30683
это потому что ты пользуешься движком
image.png136 Кб, 1239x942
439 930700
>>30667
>>30666

Помог чем мог. Угол свой поставишь и должно быть збс.

Код: https://pastebin.com/zKHpm7Pg
Песочника: http://editor.thebookofshaders.com/
440 930702
>>30700
вроде оно, но чёто угол не сильно рандомный. или рандом угла меньше 90 градусов? бля это получается я дебил, мнеж нужно чтоб 90 градусов кратное значение было, ибо швы будет видно. Но я наверное уж сам поиграюсь, спасибо анон, я тебя запомню.
441 930704
>>30665
Не понял, на кого это вешать? На InEvent? Но так нельзя же. Или я тебя не понял?
442 930708
>>30702
как будто надо умножить на что то но не ебу на что
443 930709
>>30704
на курсор скрипт с "гет парент", или в случае если тебе надо верхушку сцены можешь попробовать "гет_рут"
444 930711
>>30704
Не слушай этих. Щас накатаю тебе пример. Вешать надо во внутреннюю export -переменную, через инспектор редактора, если есть возможность, если нет, то через код туда же. Тебе для трёшки или для четвёрки?
445 930712
>>30709
Но тогда я получу родителя курсора, а я его и так знаю, не понимаю...
>>30711
Для четвёрки
446 930714
>>30712
тогда родителя родителя, ты может писать гет_парент один за другим
447 930715
>>30708

Пидор умножать на число, кратное 0.5, чтобы вращать дискретно на 90 градусов.
448 930716
>>30714
Но зачем, я же всегда знаю где в дереве объект курсора, мне нужно то, на что над чем находится объект курсора, когда нажимается кнопка мыши, то есть если кликается в всплывающем меню - то одно, если на игровом поле - то другое, если на боковой панели, то третье.
449 930717
>>30715
я в этой хуйне постоянно путаюсь, то у них 1 это 180 градусов то у них радианы ебучий цирк блять. Как мне из рандома вычлинить это самое число кратное 0.5 ?
image.png87 Кб, 1190x508
450 930718
>>30717

А тебе не нужен рандом.
451 930719
>>30716
так это дружок, через другое делается, а не гет парент вовсе. погугли( да бля, в доске помощи говорить погулить, я знаю) как определять объект на который кликнули. Это и у контрольных узлов есть и у простых 2д-шек. Есть сигнал такой _gui_input -- он показывает где мышка на узле(а если мышка и вовсе не на узле, то сигнал ничего не возращает).
452 930720
>>30718

0.5 можно заменить на 0.25, и получатся углы кратные 45 градусам.
453 930721
>>30720
это да. Но если без рандома то паттерн же потом заметно повторяется, когда увеличивает колл-во квадратов, разве нет?
454 930723
>>30719
точнее возвращает он event вообще, то есть и клики тоже.
455 930724
>>30716

> мне нужно то, на что над чем находится объект курсора, когда нажимается кнопка мыши, то есть если кликается в всплывающем меню - то одно, если на игровом поле - то другое, если на боковой панели, то третье


Тебе же выше написали, что это неправильный подход. При нажатии мышки генерирует событие клика тот объект, на котором произведён клик. У этого объекта должно быть контекстное меню для показа. В этом суть слова "контекст" в выражении "контекстное меню". Это такая база, что просто фейспалм. Знаешь что. Не буду я тебе ничего накатывать. Пиздуй учить матчасть.
image.png966 Кб, 1080x834
456 930725
>>30724
жоско но честно
457 930726
>>30717

> я в этой хуйне постоянно путаюсь, то у них 1 это 180 градусов то у них радианы ебучий цирк блять


Запомни, у "них" всегда радианы, всегда! Если ты где-то встретил углы в градусах (которые при этом никак не подписаны градусами), то сразу же знай, что между "ними" и "тобой" находится "мэн ин да мидл" который нахуярил градусов из дефолтных радианов, но тебе не сказал.
image.png7 Кб, 432x127
458 930727
>>30721

Ты текстуру натяни и посмотри как оно будет выглядеть в игре.

Вот еще варианты.
459 930728
>>30727

>angle_v



Название хуевое, должно быть cellCoord
image.png882 Кб, 615x557
460 930729
>>30727
по идее второе то что нужно, но почему то ровные 90-кратные повороты оно не делает

На пикриле синим то что не 90-кратное.
461 930730
>>30729

Выглядит будто углы по 45.
462 930731
>>30729
>>30730
снова я еблан, забыл фракт поставить правильно перед синусом. а чё он делает вообще?
463 930732
>>30731
забыл добавить, да, заработало как надо.
464 930733
Можно ли как-нибудь через call_group дернуть метод, принадлежащий детям этой группы?

У меня сейчас так:

for object in get_nodes_in_group("mygroup"):
object.get_node("SomeChildNode").myfunc()

Думаю как это переписать на call_group
465 930734
>>30731

Фракт берет дробную часть. Чтобы в итоге результат был в пределах [0, 1]
466 930735
>>30734
а как он это делает вообще? ну в плане, я понимаю как нормализовать вектор, берёшь самую большую переменную (X, Y или Z) и делишь на неё все, получается что самая большая по итогу один (X / X = 1) а остальные пропорционально поделились. А с одной переменной как узнать максимальное значение?
467 930736
>>30735

>а как он это делает вообще?



1.2345 ->0.2345
468 930738
>>30736
а... я думал пропорционально уменьшает. ну одной загадкой меньше. пойду переписывать шейдер в годот штоли.
469 930739
>>30724
Да я понял уже ещё тогда, не нужно взрываться, блин. Не хочешь - не делай, ты не на зарплате. Я объяснял этому анону >>30665 >>30714 что get_parent не то что мне нужно.

> Пиздуй


Вот это уже лишнее, хамло
470 930740
>>30739
Ну ладно, извини, погорячился. День тяжёлый. Успехов тебе.
image.png787 Кб, 1152x648
471 930741
Девочки, не деритесь.
472 930744
>>30740
Спасибо, не извиняйся, но больше постарайся на других не срываться
473 930745
>>30741
А вот и арт на перекат подвезли!
image.png275 Кб, 427x419
474 930764
>>30730
ещё раз спасибо, уже конвертировал в шейдер для годота (тоже пришлось поебаться но всё работает и вроде даже не костыльно).
эффект не особо заметен но я ещё шума сверху накину и нормально будет думаю.
475 930824
Вот вы говорили что сохранения - легко. А как сохранить состояние партиклей? Вот хуй их как сохранишь. И я имею ввиду не банальный is_emitting, а сами партикли, каждую отдельную частицу. Чет даже хз куда копать.
476 930829
>>30824
А зачем? Частицы и перерисовать можно, никто париться не будет запоминая ХУЗ координаты каждой
477 930832
>>30829
Я длинный шлейф делаю. Объект, испускающий частицы, двигается и поворачивает. Шлейф, соответственно, изгибается. И он может быть реально длинным - дальше экрана. И зигзагообразным. Сохранись-загрузись, и он пропадет. На форумах советуют preprocess выставить, но тут он не поможет.
478 930839
>>30832
Выходит, твой шлейф это ломаная линия, сохрани сет координат или векторов
479 930846
>>30839
Сработает только для этого конкретного случая. Есть десяток других. Для каждого костылять не будешь.

В packedscene индивидуальные партикли тоже не сохраняются. Проверил.
480 930849
>>30846

Ну так пиши свой сохранятор/загружатор, который для каждого эффекта реализует свой алгоритм сохранения/загрузки частиц.
481 930851
>>30846
Дак потому и не реализовано как и волшебной кнопки сохранения :)

Нужно костылять под конкретные потребности, абстрагироваться по максимуму и допиливать по необходимости, так что сохраняй свой шлейф, а частицы перерисовывай
482 930867
>>30851
если тебе так важно сохранить шлейф, то это уже не совсем задача под чистицы. Они же просто дешёвые эффектики. Если что то своё нужно -- пиши своё, это не костыли а простая логика. Тем более что почти везде под свои нужды делается своя система партиклов.
483 930892
>>30849
Только позицию конкретных отдельных частиц не получить никак. И не восстановить ее.
484 930919
>>30832
Но партикли вообще для такого не предназначены. Они созданы как короткоживущий визуальный эффект, не имеющий особой смысловой нагрузки. На другом устройстве (мобилке, например) твои партикли вообще могут не отрисоваться или отрисовываться иначе.
Кароч переделывай свой шлейф на чём-то более персистентном.
485 930937
>>30919
"персистном". ты хотел сказать точном?
486 930985
Годачеры, подскажите, пожалуйста, о чем она вещает тут https://youtu.be/tzr-81qnS5g?si=86-in8yzz3AC7jZW&t=357 с 05:57. Как работает - я понял. Без этой хреновины не поменять текстурку у предмета на сцене. Но почему? Попробовал без tool и действительно не работает. Почему так?
487 930988
>>30985
Щас будем посмотреть (18:28 МСК)
488 930990
>>30985
tool означает что скрипт работает в редакторе, а не только в самой запущенной игре.
489 930994
>>30985
Тул используется для того, чтобы прямо в редакторе менялись иконки предметов, когда ты им пикчи устанавливаешь.
490 930996
>>30985
А все, отбой. Понял, почему. Но нахуя это используется в принципе...
491 930998
>>30996
Чтобы можно было вручную что-то редактировать прямо в редакторе визуально. Ну как пример расставил ты на уровне нескольких врагов, и меняешь одному из них спрайт с гоблина на орка.
492 931005
>>30998
Так можно просто editable children и сразу в ноду спрайта пихать текстурки
493 931028
>>31005
Ты не понял. ТУЛ нужен, чтобы сразу в редакторе, во вьюпорте, видеть изменения, скрипт начинает работать прямо в редакторе, у него _процесс() работать начинает. Теперь понял?
tool.mp43,5 Мб, mp4,
2560x1440, 0:20
494 931040
>>31028
И все еще не понял. У меня как-то наоборот работает. Записал видео.

Код выглядит так:

@tool
extends Node2D

@export var texture_of_item : Texture
@onready var Item_sprite = $Sprite

func _ready():
if not Engine.is_editor_hint():
Item_sprite.texture = texture_of_item

func _process(delta):
if not Engine.is_editor_hint():
Item_sprite.texture = texture_of_item
495 931043
>>31040
Второй нот не нужен. Смотри туториалы внимательнее. В _реди ты делаешь иф нот, а в _процессе ты должен делать просто иф! Без нот!
496 931044
>>31040
И отучайся копипастить, да душно, но пиши ручками код ,а не копипасть бездумно.
497 931046
до переката 3
498 931047
до переката 2
499 931048
до переката 1
500 931049
ПЕРЕКАТ!
>>931045 (OP)
1706638791252.jpg129 Кб, 750x914
ПЕРЕКАТ # OP 501 931050
502 931097
>>30937
Нет, от английского persistent. В великомогучем нет слова, которым можно было бы однозначно это перевести.
Стабильное, постоянное, существующее. Антоним - эфемерное.
503 931131
>>31097
ну так стабильное скорее тоже хорошо попадёт. размытые аналогии в программировании ни к чему(читай: я ненавижу англицизмы).
504 931461
>>27061
Это все решается обычным двумерным графом с кастомной функцией определения соседей, зачем ты высрал трехосевые координаты абсолютно непонятно.
Обновить тред
« /gd/В начало тредаВеб-версияНастройки
/a//b//mu//s//vg/Все доски

Скачать тред только с превьюс превью и прикрепленными файлами

Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах.Подробнее