Доброго времени суток, господа. И так, знаю, много кто любит играться с GUI-интерфейсами. Но все наверняка знают что можно вывести скриптами какой-то свой элемент интерфейса на экран. Естественно это - AddCustomStatic(string,bool) и RemoveCustomStatic(string):
Код
function staticToScreen() local hud = get_hud() local elementGUI = hud:GetCustomStatic("element_name") if(lemenetGUI == nil) then hud:AddCustomStatic("element_name",true) end if(not db.actor:alive) then hud:RemoveCustomStatic("element_name") end end
Но беда в том что, все эти элементы будут под оригинальным интерфейсом с точки зрения "иерархии" элементов на экране, в самом низу. И с этаким элементом-статиком сильно не поиграешься.
- Что же делать тогда? - Вариант есть!
Можно воспользоваться функциями AddDialogToRender(wnd) и RemoveDialogToRender(wnd) из класса CUIGameCustom использовав метод get_hud()
Схема предельно простая:
Код
local hud = get_hud() -- Объявляем переменную которая ссылается на класс худа local window = MyWindowDialog() -- Может быть любое ваше название класса CUIScriptWnd
-- Дальше можно вызывать функции из этого окна window:ShowDialog(false/true) -- Показать окно, скрыв попутно интерфейс (true/false) window:HideDialog() -- Скрывает окно window:ВашаФункция() -- и так любая функция в этом окне
Допустим, Вам надо вывести прогресс бар в инвентаре, не знаю, может вы захотели отображать вес не в цифрах, а в виде шкалы которая заполняется и т.д. в зависимости от ваших желаний. И тогда как мы поступим:
- Создаём скрипт "моё_имя.script"; - Ищем оригинальный файл actor_menu.script и тоже кидаем в папку scripts; - Создаём моё_имя.xml файл с описанием элементов по пути configs/ui;
ваш_скрипт.script
Код
-- Получаем ссылку на GUI класс local hud = get_hud()
-- Функция показа окна function showProgressBar() wndBar = pBar() -- Объявляем и сохраняем ссылку на окно, дабы уборщик мусора не удалил его и мы не поймали вылет
hud:AddDialogToRender(wndBar) -- Добавляем окно на экран wndBar:ShowDialog(false) -- Показываем наше окно wndBar:setBarValue(100) -- Устанавливаем значение прогресса на 100% end
-- Функция удаления окна function clearProgressBar() hud:RemoveDialogToRender(wndBar) -- Удаляем окно с экрана end
------ GUI ------ class "pBar" (CUIScriptWnd)
function pBar:__init() super() -- Инициализируем окно self:InitControls() -- Что запускаем при инициализации end
function pBar:InitControls() -- Инициализация self:SetWndPos (vector2():set(666,700)) -- Позиция окна относительно 1024х768 сетки self:SetWndSize (vector2():set(240,10)) -- Ширина и высота окна local xml = CScriptXmlInit() -- Парсинг XML xml:ParseFile("ваше_имя.xml") -- Какой файл будем парсить для поиска описания элементов self.pBar = xml:InitProgressBar("progress_bar", self) -- Создаём наш прогресс бар end
function pBar:setBarValue(value) -- Наша функция по установке значения прогресса self.pBar:SetProgressPos(value) end
Заходим в actor_menu.script и в функции inventory_wnd_opened() вписываем ваш_скрипт.showProgressBar() а в inventory_wnd_closed() вписываем ваш_скрипт.clearProgressBar():
Код
function inventory_wnd_opened() -- Тут ещё может быть что то ваш_скрипт.showProgressBar() end
function inventory_wnd_closed() -- Тут ещё может быть что то ваш_скрипт.clearProgressBar() end
Ах да, забыл, тут немножко беда с вызовом окна, если сразу вызвать, моментально, то окно всё равно будет под элементами стандартного интерфейса. Что бы это исправить, надо немножко подождать, пару апдейтов.. Примерно так:
Код
function inventory_wnd_opened() -- Тут ещё может быть что то
local x = 2 -- Просто так надо... :D level.add_call( function() x=x-1 return x==0 end, function() ваш_скрипт.showProgressBar() end) end
- Открываем моё_имя.xml с описанием элементов по пути configs/ui и пишем туды:
[+] x и y - Координаты. В нашем случае по 0 ибо мы уже указали координаты нашего окна при его инициализации. [+] width и height - Ширина и высота. [+] horz - Горизонтальный бар? [+] min и max - Значение минимальное и максимальное которое может принять прогресс бар. [+] stretch - Растягивать ли бар?
Теперь, после всех этапов, когда мы запустим игру, при открытии инвентаря, над значением веса будет зелёный прогресс бар, заполненный на все 100%.
Внимание: После того как сделаете элемент, не забывайте удалять его из переменной которая хранит окно, дабы избежать вылета при следующей загрузке игры.
Сообщение отредактировал alex1197 - Понедельник, 22.01.2018, 21:29
Привет, возможно я не там задаю свой вопрос, но хотелось бы узнать как реализовать интерфейс на 3d модели. Допустим, как ПДА в gunslinger mod. Либо допустим как сделать цифровые часы, и на экране выводить игровое время с помощью специально выбранного шрифта. Спасибо.
Сообщение отредактировал AngryWolf - Суббота, 16.12.2017, 16:36
Хм, интересно. Вот только одно замечание носящее теоретический характер.
Цитатаalex1197 ()
Можно воспользоваться функциями AddDialogToRender(wnd) и RemoveDialogToRender(wnd) из класса get_hud()
get_hud() это не класс, а метод из глобального пространства имён. Как по мне, лучше было выразится:
Можно воспользоваться функциями AddDialogToRender(wnd) и RemoveDialogToRender(wnd) из класса CUIGameCustom, объект которого мы можем получить методом get_hud() из глобального пространства имён.
Не надо вводить людей в заблуждение.
Сообщение отредактировал buffy - Четверг, 21.12.2017, 13:29
buffy, писал в спешке, по-этому путаница возможна была между методами\функциями\классами\параметрами, в голове каша из разных языков и разные термины лезут в одно целое. Исправил.