Сейчас я расскажу о структуре программы Годот custom drawing in 2d

Иерархия программы Годот custom drawing in 2d

Давайте разберем структуру программы в годот

Разберём, как устроена программа сверху вниз.

Корневой узелCustom Drawing (тип Control). Это основа всей сцены.

В него вложен TabContainer — он управляет переключением вкладок.

Внутри TabContainer находятся панели (тип Panel). Каждая панель соответствует отдельной вкладке.

На каждой панели расположены метки и отрисованные линии — это основной контент вкладок.

Теперь давайте заглянем в код. К нашему узлу Custom Drawing прикреплён скрипт — custom_drawing.gd.

В этом скрипте описаны две ключевые функции. Первая срабатывает, когда пользователь выбирает что-то в выпадающем списке (OptionButton). Вторая — когда нажимает на кнопку-флажок (CheckButton).

Теперь разберём функцию _on_msaa_2d_item_selected из нашего скрипта custom_drawing.gd. Что она делает? С помощью get_viewport() мы получаем доступ к окну просмотра — классу Viewport. А затем через его метод msaa_2d настраиваем сглаживание.

func _on_msaa_2d_item_selected(index: int) -> void:
get_viewport().msaa_2d = index as Viewport.MSAA

А вот так выглядела функция _on_draw_antialiasing_toggled.

func _on_draw_antialiasing_toggled(toggled_on: bool) -> void:
var nodes: Array[Node] = %TabContainer.get_children()
nodes.push_back(%AnimationSlice)
for tab: Control in nodes:
tab.use_antialiasing = toggled_on
tab.queue_redraw()

При переключении тумблера сглаживания (из MSAA2DOptionButton) вызывалась эта функция — и тут же вылетала ошибка. Оказалось, что переменная use_antialiasing есть не у всех объектов вкладок класса Control. После того как мы переписали функцию _on_draw_antialiasing_toggled, она стала выглядеть так:

func _on_draw_antialiasing_toggled(toggled_on: bool) -> void:
var nodes: Array[Node] = %TabContainer.get_children()
nodes.push_back(%AnimationSlice)
for tab: Control in nodes:
var prop = tab.get_property_list()
var flag=false
for p in prop:
if(p.name=="use_antialiasing"):
flag=true
if(flag):
tab.use_antialiasing = toggled_on
tab.queue_redraw()

Добавление флага для поиска объектов

Я добавил специальный флаг, чтобы находить объекты, у которых есть переменная use_antialiasing.

Об использовании символа %

Обратите внимание на символ % перед TabContainer и AnimationSlice. Благодаря ему эти ноды можно вызывать напрямую, без длинных путей вроде $CustomDrawing/TabContainer или $CustomDrawing/Animation/AnimationSlice. Кроме того, символ % делает их уникальными в рамках текущей сцены.

Разбор кода

Итак, с кодом custom_drawing.gd мы разобрались. Остальные скрипты занимаются в основном отрисовкой графических примитивов.

Например, lines.gd отвечает за рисование линий, окружностей и дуг.

Общая логика

У каждой панели есть переменная use_antialiasing — именно она управляет сглаживанием для всех фигур на вкладке.

Проблема в meshes.gd

Однако в коде meshes.gd такой переменной не оказалось. Именно из-за этого при переключении тумблера возникала ошибка.

Проблема с переменной use_antialiasing

Как выяснилось, переменная use_antialiasing не используется в нескольких скриптах: meshes.gd, textures.gd и text.gd.

В text.gd при вызове сглаживания функция draw_char просто меняет случайный цвет — это не связано с основной логикой.

Как я решил проблему

Я добавил в meshes.gd небольшой фрагмент кода:

var use_antialiasing = false

После этого код заработал без каких-либо дополнительных изменений.

Вывод

Это ошибка или недоработка со стороны разработчиков. Переменная была не объявлена, хотя должна была использоваться.

Функции отрисовки Годот

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

Как всё рисуется: краткий гид по функциям

Разберём, какие инструменты отвечают за графику в каждой вкладке.

 

1. Вкладка Lines

Здесь всё просто и наглядно:

draw_line() — проводит линию.

draw_circle() — рисует окружность.

draw_arc() — рисует дугу.

draw_set_transform() — применяет трансформации (поворот, масштаб) ко всем последующим объектам.

2. Вкладка Rectangles

Стандартный набор для работы с прямоугольниками и четырёхугольниками:

draw_rect() — рисует прямоугольник.

draw_set_transform_matrix() — более гибкая и мощная настройка трансформаций через матрицу.

3. Вкладка Polygons

Здесь можно создавать сложные фигуры:

draw_primitive() — рисует базовые примитивы: точки, линии и треугольники.

draw_polygon() — создаёт закрашенный многоугольник из массива точек.

draw_colored_polygon() — то же самое, но с возможностью задать цвет заливки.

draw_polyline() — рисует только контур (границу) многоугольника.

draw_polyline_colors() — рисует контур одним цветом.

4. Вкладка Meshes

Здесь мы работаем с готовыми 3D-моделями и их группами (мультимешами). В примере используются классы: TextMesh, NoiseTexture2D, GradientTexture2D, SphereMesh, MultiMesh.

Ключевые методы для управления:

set_instance_transform_2d() — задаёт позицию меша в пространстве.

set_instance_color() — позволяет умножить существующий цвет вершин меша на нужный цвет.

Сами меши рисуются с помощью функций:

draw_mesh() — для одного меша.

draw_multimesh() — для рисования группы мешей за раз.

5. Вкладка Textures

Текстура — это просто загруженная картинка. Рисуется она просто:

draw_texture() — рисует текстуру в указанной позиции.

draw_texture_rect() — рисует текстуру, вписывая её в заданный прямоугольник (можно также менять цвет).

6. Вкладка Text

Функции для работы с текстом:

draw_char() — рисует первый символ строки с заданным шрифтом.

draw_string() — рисует целую строку текста.

draw_string_outline() — рисует контур текста (обводку).

7. Вкладка Animation

Здесь мы не перечисляем все функции, а фокусируемся на одной — анимации дуги.

8. Animation Slice

Специальный инструмент для быстрой и ресурсоэффективной анимации:

draw_animation_slice() — запускает фоновую циклическую анимацию, которая не требует постоянной перерисовки.

draw_end_animation() — завершает режим анимации и возвращает обычный режим рисования.

Вот и всё. Мы дошли до конца этого материала, и я хочу сказать вам большое спасибо. Спасибо за то, что дочитали до этих строк, за ваше внимание и интерес.

Если у вас остались вопросы, замечания или просто есть что добавить — не стесняйтесь, пишите в комментариях. Мне важно знать ваше мнение.

А у меня на сегодня всё. До новых встреч!

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Прокрутить вверх