- 212
- 75
Stupid-GUI(SGUI) | v2
Дисклеймер: Представляю, сколько будет хейта в мою сторону в комментариях) В общем, здесь я немного расскажу про свое творение под названием SGUI. Работает на рендере, огромном количестве костылей и говнокода. Особенность в том, что гемороя из-за моего гениального проектирования будет максимально много. Разработчику предстоит познать все прелести ООП в Lua, в связи с чем советую с ними ознакомиться по этой статье, например. Но сначала дочитайте пост до конца. ;) Кстати, одновременно использовать приватные поля у классов и наследование нельзя(опять же по этой статье если действовать).
Для начала подключим саму библиотеку:
Lua:
require("lib.sgui")
Lua:
win= Window:new('Window')
while true do
win:draw()
end
Lua:
sampRegisterChatCommand(string.sub(thisScript().name, 1, string.len(thisScript().name) - 4), function () win.state = not win.state end)
-- мы берем название скрипта и отрезаем кусок от 1 до 4 до с конца символа. это будет работать, если у вы не скомпилировали файл(не получили .luac)
-- если вы предварительно задали название скрипта через script_name(), то можно ничего не отрезать и использовать просто thisScript().name
Lua:
local DEFAULT_STYLE = {
bg = 0x99000000, -- фон окна
top = 0xff000000, -- шапка окна
color = 0xffc0c0c0, -- фон кнопки
press = 0xff7b68ee, -- цвет кнопки при нажати и второстепенный цвет некоторых виджетов
fcolor = 0xffffffff, -- цвет шрифта
close = 0xffff6347, -- цвет кнопки закрытия
font = renderCreateFont("Trebuchet MS", 16, font_flag.SHADIW + font_flag.BORDER) -- шрифт
}
Lua:
-- 1
btn = Button:new('1') -- создаем кнопку
btn:bind(function () -- задаем функцию, которая сработает при нажатии
printStringNow('pressed', 1000)
end)
win:tieElement(btn) -- передаем отрисовщику окна(расположит автоматически)
-- 2
win:tieElement(Button:new('2', nil, nil, 'right')) -- создаем кнопку и передаем отрисовщику окна(параметр 'right' означает, что кнопка будет справа от предыдущего элемента. иначе указывайте nil)
win:getElement(2):bind(function () -- также задаем функцию, которая сработает при нажатии
printStringNow('pressed', 1000)
end)
-- 3
btn2 = Button:new('3') -- создаем еще одну кнопку
btn2.func = function () -- задаем функцию, но уже не через метод, а напрямую
printStringNow('pressed', 1000)
end
while true do
win:draw()
if win.state then -- проверяем, что окно открыто
btn2:draw(win.pos.x + win.size.x / 2, win.pos.y + win.size.y / 2) -- эта кнопка не подключена к отрисовщику окна, так что отрисовываем самостоятельно
end
end
Lua:
dlg = Dialog:new('Какой-то вопрос.', {'Ответ 1', 'Ответ 2', 'Ответ 3', 'И т.д.'}) -- ответы отображаются в обратном порядке, их количество может быть любым
-- также по умолчанию включен автоперенос текста(Dialog.wrapping). Не нравится - поставьте на false и переносите сами(\n)
dlg.win.state = true -- класс Dialog лишь оболочка, он просто приводит в нужный вам вид окно. само окно - Dialog.win
while true do
dlg:draw() -- но при этом отрисовка происходит через собственный метод класса Dialog
end
Установка: закинуть sgui.lua в moonloader/lib. Требования: moonloader 0.26. Предназначено для SAMP-а, в одиночке скорее всего работать не будет, но я не проверял.
Если вас заинтересовала эта библиотека - не бойтесь залезть в исходники, там все относительно понятно. И много новых свойств объектов узнаете)
Вложения
Последнее редактирование: