🌳Отрисовка интерфейсов

Урок по отрисовке интерфейсов, 2д объектов

Информация

Для рисования двухмерных объектов используется событие render_2d.

Список всех функций для отрисовки можно посмотреть в библиотеке Render

Что такое rect

Rect(от англ. Прямоугольник) используется для отрисовки на экране различных элементов худа, от ватермарки до стафф-листа.

Если я покажу вам строку, отображающую рект

render:rect(x, y, width, height, round, color)

Вы вряд ли что-то поймёте. Поэтому покажу вам визуализацию строки ниже.

render:rect(100, 150, 200, 120, color.new(0.3,0.3,0.3,1))

В игре же этот рект выглядит следующим образом

Подровняем его размер, изменим цвет и закруглим, добавив ещё один аргумент.

render:rect(100, 150, 120, 20, 4, color.new(1,1,1,1))

Осталось добавить текст и это уже чем-то похоже на ватермарку.

render:rect(100, 150, 120, 19, 4, color.new(1,1,1,1))
render:text("Example.lua", 105, 153, color.new(0,0,0))

Но появилась проблема: длина ректа не совпадает с длиной текста. Чтобы этого избежать можно использовать render:text_width().

render:rect(100, 150, render:text_width("Example.lua") + 12, 19, 4, color.new(1,1,1,1))
render:text("Example.lua", 105, 153, color.new(0,0,0))

Как будто чего-то не хватает, да?

Предлагаю добавить иконку.

Если у вас её нет, найти подходящую можно тут.

Качаем png с размером примерно равным размеру будущего ректа с картинкой. Я скачаю иконку с размером 64x64

Отрисовать картинку можно при помощи render:image()

render:rect(100, 150, render:text_width("Example.lua") + 25, 19, 4, color.new(1,1,1,1))
render:image("icon.png", 103, 153, 12, 12, color.new(0,0,0))
render:text("Example.lua", 118, 153, color.new(0,0,0))

Было неплохо добавить в наш скрипт перетаскивание ватермарки. Для этого можно использовать объект Драг.

Для начала создадим объект:

script:name("Watermark") -- Имя скрипта
script:devs({"ConeTin"}) -- Разработчики
script:desc("Example Script") -- Описание

watermark = drag.new("Watermark")
watermark:set_x(100)
watermark:set_y(100)
watermark:set_width(100)
watermark:set_height(20)

events.render_2d:set(function(event)
    render:rect(100, 150, render:text_width("Example.lua") + 25, 19, 4, color.new(1,1,1,1))
    render:image("icon.png", 103, 153, 12, 12, color.new(0,0,0))
    render:text("Example.lua", 118, 153, color.new(0,0,0))
end)

Этот код можно сократить до

script:name("Watermark") -- Имя скрипта
script:devs({"ConeTin"}) -- Разработчики
script:desc("Example Script") -- Описание

watermark = drag.new("Watermark"):set_x(100):set_y(100):set_width(100):set_height(20)

events.render_2d:set(function(event)
    render:rect(100, 150, render:text_width("Example.lua") + 25, 19, 4, color.new(1,1,1,1))
    render:image("icon.png", 103, 153, 12, 12, color.new(0,0,0))
    render:text("Example.lua", 118, 153, color.new(0,0,0))
end)

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

script:name("Watermark") -- Имя скрипта
script:devs({"ConeTin"}) -- Разработчики
script:desc("Example Script") -- Описание

watermark = drag.new("Watermark"):set_x(100):set_y(100):set_width(100):set_height(20)

events.render_2d:set(function(event)
    render:rect(watermark:x(), watermark:y(), render:text_width("Example.lua") + 25, 19, 4, color.new(1,1,1,1))
    render:image("icon.png", watermark:x() + 3, watermark:y() + 3, 12, 12, color.new(0,0,0))
    render:text("Example.lua", watermark:x() + 18, watermark:y() + 3, color.new(0,0,0))
end)

Last updated