Дизайнер
-
Автор темы
- #1
Во всех скриптах, которых я видел, индикаторы создаются отдельно. Для них выделяют разные функции, то есть они ничем не объединены. Когда ты захочешь что-то поменять -- тебе придется менять это во всех функциях. А когда кода много, это то еще страдание.
Сегодня я покажу, как создавать HUD на мета-таблицах. Гайд пишу для более менее продвинутых кодеров. API - эвольв.
1. Для начала
Потому что так легче создавать классы на метатаблицах.
2. Класс
Теперь начинается самое интересное
С помощью этого метода, мы сможем объявлять/создавать свои HUD-элементы. Нам нужно разместить здесь переменные, чтобы иметь к ним доступ с остальных методов.
Следом идет перетаскивание. Добавил для примера.
Остальное. В основном здесь рендер
3. Создание объектов класса. Сами HUD-элементы
Сегодня я покажу, как создавать HUD на мета-таблицах. Гайд пишу для более менее продвинутых кодеров. API - эвольв.
1. Для начала
Код:
-- --- ------- -------- -------- -------
-- Эта функция облегчит создание классов
function Class()
local class = {}
local mClass = {__index = class}
function class.instance() return setmetatable({}, mClass) end
return class
end
2. Класс
Код:
-- --- -----
-- Сам класс
local HUD = Class()
С помощью этого метода, мы сможем объявлять/создавать свои HUD-элементы. Нам нужно разместить здесь переменные, чтобы иметь к ним доступ с остальных методов.
Код:
-- Создание элемента HUD. Аргументы можно задать свои
function HUD:new(name, color, x, y, w)
local self = HUD.instance()
-- Здесь вы можете объявить все переменные класса. Они всегда будут доступны.
-- Я не буду создавать рабочие индикаторы, это всего-лишь пример.
-- главные переменные
self.name, self.color = name, color
self.x, self.y, self.w, self.h = x or 200, y or 400, w or 160, 20
-- переменные для драга
self.drag_x, self.drag_y = 0, 0
self.is_dragging = false
------ ----
return self
end
Следом идет перетаскивание. Добавил для примера.
Код:
-- Драг (спастил, мб есть лучше вариант)
function HUD:drag()
local is_hovered = (mx > (self.x) and mx < (self.x + self.w) and my > (self.y) and my < (self.y + self.h))
if is_hovered then
if input.is_mouse_down(0) and not self.is_dragging then
self.is_dragging = true
self.drag_x = self.x - mx
self.drag_y = self.y - my
end
end
if not input.is_mouse_down(0) then
self.is_dragging = false
end
if self.is_dragging and gui.is_menu_open() then
self.x = (self.drag_x + mx)
self.y = (self.drag_y + my)
end
end
Остальное. В основном здесь рендер
Код:
-- Наш контейнер
function HUD:container()
render.rect_filled (self.x, self.y, self.x + self.w, self.y + self.h, render.color("#00000026"))
render.rect_filled (self.x, self.y, self.x + self.w, self.y + 2, self.color)
render.text (font, self.x + self.w / 2, self.y + self.h / 2 + 1, self.name, render.color("#FEFEFE"), 1, 1)
end
-- Эта функция предназначена для рендера своих элементов. Например, кейбинды
-- В ней ничего писать не будем
function HUD:paint() end
-- И наконец, для вызова нашего класса
function HUD:draw()
self:container()
self:paint()
self:drag()
end
3. Создание объектов класса. Сами HUD-элементы
Код:
-- ----- ----- ------ -------- ------- ------------ ---
-- Класс готов, теперь осталось создать какой-нибудь HUD.
-- Объявляем
local keylist = HUD:new("keylist", render.color("#00acf5"), 200, 600) -- необязательно указывать все аргументы, у нас есть дефолтные
-- Рисуем
function keylist:paint()
render.text (font, self.x + self.w / 2, self.y + self.h + 4, "Готово", render.color("#FEFEFE"), 1, 0)
end
-- --------
-- Вызываем
function on_paint()
-- это для драга
mx, my = input.get_cursor_pos()
keylist:draw()
end
Результат:
Мы получили контейнер кейлиста. Вы можете создавать любые элементы таким способом, можете модифицировать, улучшать, добавлять что-то новое. Текст "Готово" принадлежит конкретно кейлисту. У других объектов класса его не будет
Использование класса облегчило наш код, он стал меньше (большую часть кода займет сам класс, нежели его объекты).
Мы получили контейнер кейлиста. Вы можете создавать любые элементы таким способом, можете модифицировать, улучшать, добавлять что-то новое. Текст "Готово" принадлежит конкретно кейлисту. У других объектов класса его не будет
Использование класса облегчило наш код, он стал меньше (большую часть кода займет сам класс, нежели его объекты).
Последнее редактирование: