Garry's Mod

Garry's Mod

36 ratings
[RU] Как сделать кастомный HUD на Lua?
By Dr. L
Это руководство предназначено для тех, кто хочет создать кастомные худы на Lua. От основ до интеграции и оптимизации — вы научитесь создавать уникальные пользовательские интерфейсы для ваших проектов и игр.
2
   
Award
Favorite
Favorited
Unfavorite
Введение
Добро пожаловать в руководство по созданию кастомных HUD'ов для Garry's Mod (GMod) с использованием Lua. GMod — это популярный модифицированный движок Source от Valve, который позволяет игрокам создавать собственные игровые контенты. В этом руководстве мы рассмотрим основы Lua и его применение для разработки пользовательских интерфейсов в GMod. Мы разберём некоторые основы языка Lua, изучим синтаксис и работу с материалами.



Программы
Программы для написания кода на Lua

  • Visual Studio Code[code.visualstudio.com] - это бесплатный и мощный текстовый редактор, разработанный Microsoft. Он предлагает широкий набор функций, включая подсветку синтаксиса, автодополнение кода, интегрированную систему контроля версий и обширную библиотеку расширений для поддержки различных языков программирования, включая Lua. В VS Code вы можете удобно разрабатывать и отлаживать код для создания кастомных HUD'ов для Garry's Mod.
  • ZeroBrane Studio[studio.zerobrane.com] - это легкий и простой в использовании интегрированный редактор для Lua, который предназначен специально для разработки и отладки Lua-проектов. Он обеспечивает удобный интерфейс пользователя, встроенную отладку, автодополнение кода и другие полезные функции, специально адаптированные для работы с Lua. ZeroBrane Studio может быть отличным выбором для создания кастомных HUD'ов для Garry's Mod благодаря своей простоте и эффективности.
  • Notepad++[notepad-plus-plus.org] - это еще один бесплатный текстовый редактор с открытым исходным кодом, который широко используется программистами благодаря своей простоте и функциональности. Он поддерживает подсветку синтаксиса для множества языков программирования, включая Lua, а также обладает некоторыми базовыми функциями, такими как автодополнение и макросы. В то время как Notepad++ не имеет такого богатого набора функций, как VS Code или ZeroBrane Studio, он все равно может быть полезным инструментом для разработки кастомных HUD'ов для Garry's Mod благодаря своей простоте и легкости в использовании.
  • Lua Code Editor - это мощный аддон для Garry's mod, который позволит писать код на lua и запускать его прямо в игре! Внимание! У этого аддона есть зависимость, а именно EasyChat

Программы для работы с материалами

  • Adobe Photoshop[www.adobe.com] - это профессиональный графический редактор, предоставляющий широкий набор инструментов для создания и редактирования изображений. Он полезен для создания элементов интерфейса, текстур и других графических ресурсов, используемых в HUD'ах для Garry's Mod.
  • GIMP (GNU Image Manipulation Program)[www.gimp.org] - это бесплатный и открытый редактор изображений с множеством функций, аналогичных Photoshop. Он предоставляет возможность создавать и редактировать графические ресурсы для проекта в Garry's Mod.
  • Substance Painter[www.substance3d.com] - это программа для текстурирования 3D-моделей, предоставляющая мощные инструменты для создания реалистичных текстур. Она может быть полезна при создании детальных текстур для моделей и интерфейса в Garry's Mod.

Лично я, в рамках этого руководства, буду использовать Visual Studio Code, Lua Code Editor и Photoshop


Публикация аддона
Подробно о том, как можно публиковать аддоны я рассказывал в этом руководстве:
https://steamoss.com/sharedfiles/filedetails/?id=3170989258
Написание кода Ч1
Как я говорил ранее, я буду использовать Visual Studio Code и Lua Code Editor

Создание фала
  • Для начала, выберете папку, где будет находиться ваш аддон с HUD'ом, для этого нажмите на кнопку "Files" слева сверху, далее, нажмите на "Open Folder..." и выберете папку, где будет находиться ваш аддон.

  • После выбора места для вашего аддона, создайте в папке ещё одну папку с названием "lua", нажав также на "Files" и теперь уже на "New Folder...", там будут ваши скрипты для HUD'ов.

  • Далее, в папке "lua" создайте ваш файл для скрипта, с расширением .lua, название можете выбрать "почти любое", главное чтобы он не конфликтовал с другими скриптами, к примеру можно назвать файл "script_my_hud.lua" и тп.
Вот вы и создали файл для вашего будущего кода!
Теперь вам понадобяться ваши знания в lua
Вот пример учебника по Lua[eligovision.ru]

Код

Давайте напишем простой пример кода на Lua для создания кастомного HUD'а в Garry's Mod. В этом примере мы создадим простой HUD, отображающий текст "Привет, мир!" в левом верхнем углу экрана:
-- Создаем функцию для отображения HUD'а hook.Add("HUDPaint", "DrawMyHUD", function() -- Устанавливаем цвет текста (белый) surface.SetTextColor(255, 255, 255, 255) -- Устанавливаем шрифт текста surface.SetFont("DermaDefault") -- Рисуем текст "Привет, мир!" в координатах (10, 10) surface.SetTextPos(10, 10) surface.DrawText("Привет, мир!") end)

Если вам кажется это трудноватым, вот подробное объяснение всего происходящего на экране:

  • Derma: Derma - это библиотека пользовательского интерфейса (UI) в Garry's Mod, которая предоставляет функции и элементы для создания кастомных пользовательских интерфейсов, таких как окна, кнопки, текстовые поля и т. д. С помощью Derma вы можете создавать свои собственные HUD'ы, меню и другие интерфейсные элементы.
  • Функция hook.Add(): Это функция в Garry's Mod, которая используется для привязки функции к событию в игре. В данном примере мы используем событие "HUDPaint", которое вызывается каждый кадр перед отрисовкой HUD'а. Функция, переданная в hook.Add(), будет вызываться каждый раз при возникновении этого события.
  • Функция surface.SetTextColor(): Эта функция устанавливает цвет текста для последующих операций рисования текста. В данном примере мы устанавливаем белый цвет текста, используя значения RGB (255, 255, 255) и альфа-канал (255, что означает полностью непрозрачный).
  • Функция surface.SetFont(): Эта функция устанавливает шрифт для последующих операций рисования текста. В данном примере мы используем стандартный шрифт DermaDefault.
  • Функция surface.SetTextPos(): Эта функция устанавливает позицию начала вывода текста на экран. В данном примере мы устанавливаем позицию в координаты (10, 10), что означает, что текст будет выводиться в левом верхнем углу экрана.
  • Функция surface.DrawText(): Эта функция рисует текст на экране. В данном примере мы рисуем текст "Привет, мир!" в позиции, установленной с помощью surface.SetTextPos().
Примерно вот так это будет выглядеть в игре:






Написание кода Ч2
Тут будут более сложные примеры по написанию кода

Код для создания полоски брони и хп:
-- Функция для отображения HUD'а hook.Add("HUDPaint", "DrawHealthAndArmor", function() local ply = LocalPlayer() -- Получаем локального игрока -- Получаем текущее здоровье и броню игрока local health = ply:Health() local armor = ply:Armor() -- Рисуем полоску здоровья draw.RoundedBox(4, 20, ScrH() - 50, 200, 20, Color(255, 0, 0, 150)) -- Красная полоска (здоровье) draw.RoundedBox(4, 20, ScrH() - 50, health * 2, 20, Color(255, 0, 0, 255)) -- Заполнение полоски здоровья -- Рисуем полоску брони draw.RoundedBox(4, 20, ScrH() - 25, 200, 20, Color(0, 0, 255, 150)) -- Синяя полоска (броня) draw.RoundedBox(4, 20, ScrH() - 25, armor * 2, 20, Color(0, 0, 255, 255)) -- Заполнение полоски брони -- Выводим текст с текущим здоровьем и броней draw.SimpleText("Здоровье: " .. health, "DermaDefault", 230, ScrH() - 48, Color(255, 255, 255, 255), TEXT_ALIGN_LEFT, TEXT_ALIGN_CENTER) draw.SimpleText("Броня: " .. armor, "DermaDefault", 230, ScrH() - 23, Color(255, 255, 255, 255), TEXT_ALIGN_LEFT, TEXT_ALIGN_CENTER) end)

Вот что получается на выходе:



Давайте разберем этот код по частям:

  • hook.Add("HUDPaint", "DrawHealthAndArmor", function()): Это функция hook.Add(), которая привязывает функцию рисования HUD'а к событию "HUDPaint". Это событие вызывается каждый кадр перед отображением HUD'а.

  • local ply = LocalPlayer(): Эта строка получает локального игрока (того, кто запускает скрипт) и сохраняет его в переменной ply.

  • local health = ply:Health() и local armor = ply:Armor(): Эти строки получают текущее здоровье и броню игрока с помощью методов :Health() и :Armor().

  • draw.RoundedBox(): Это функция рисования прямоугольника с закругленными углами. Мы используем ее для создания полос здоровья и брони.

  • draw.SimpleText(): Это функция рисования текста. Мы используем ее для вывода текущих значений здоровья и брони.

  • ScrH(): Это функция, возвращающая высоту экрана. Мы используем ее для правильного размещения полосок и текста на экране.

  • Теперь о значениях в функциях рисования:

  • draw.RoundedBox(4, x, y, width, height, color): Эта функция рисует прямоугольник с заданными координатами (x, y), шириной (width) и высотой (height). color - это таблица, представляющая цвет в формате RGB с дополнительным значением альфа-канала (прозрачности).

  • draw.SimpleText(text, font, x, y, color, xalign, yalign): Эта функция выводит текст на экран. text - это сам текст, font - шрифт, x и y - координаты текста на экране, color - цвет текста, а xalign и yalign - выравнивание текста по горизонтали и вертикали соответственно.

Этот код создает кастомный HUD с двумя полосками (здоровье и броня), а также с текстом, отображающим текущие значения здоровья и брони.


И вы наверное уже заметили, что дефолтный худ Garry's mod'а остался, и это может мешать созданию своего худа, это можно легко исправить, добавив эту строку в код:
-- Функция для скрытия стандартного HUD'а hook.Add("HUDShouldDraw", "HideDefaultHUD", function(name) -- Если имя элемента HUD'а соответствует стандартному HUD'у Garry's Mod, возвращаем false, чтобы его скрыть if name == "CHudHealth" or name == "CHudBattery" or name == "CHudAmmo" or name == "CHudSecondaryAmmo" then return false end end)

Основные функции Lua для создание HUD'ов
  • hook.Add("HUDPaint", "MyHUD", function()): Эта функция привязывает вашу собственную функцию для рисования HUD'а к событию "HUDPaint". Это событие вызывается каждый кадр перед отображением HUD'а.

  • surface.SetDrawColor(red, green, blue, alpha): Устанавливает цвет, который будет использоваться при рисовании графических примитивов (например, прямоугольников или текста).

  • surface.DrawRect(x, y, width, height): Рисует прямоугольник с указанными координатами (x, y), шириной (width) и высотой (height).

  • surface.DrawLine(x1, y1, x2, y2): Рисует линию от точки (x1, y1) до точки (x2, y2).

  • draw.SimpleText(text, font, x, y, color, xalign, yalign): Выводит текст на экран. text - текст, font - шрифт, x и y - координаты текста на экране, color - цвет текста, xalign и yalign - выравнивание текста по горизонтали и вертикали соответственно.

  • surface.SetMaterial(material): Устанавливает материал, который будет использоваться при рисовании текстуры.

  • surface.DrawTexturedRect(x, y, width, height): Рисует текстуру на экране с указанными координатами (x, y), шириной (width) и высотой (height).

  • draw.RoundedBox(cornerRadius, x, y, width, height, color): Рисует прямоугольник с закругленными углами с указанным радиусом закругления углов (cornerRadius).

  • vgui.Create("DPanel"): Создает новую панель Derma, которую вы можете использовать для создания кастомных элементов интерфейса.
Примеры скриптов для HUD'ов
Кастомный прицел
этот прицел находиться не в середине экрана, а в точке, куда смотрит игрок, что дает возможность к примеру играть от 3-его лица.
-- Создаем функцию для отображения прицела local function DrawCrosshair() -- Получаем позицию и угол направления игрока local ply = LocalPlayer() local pos = ply:EyePos() local ang = ply:EyeAngles() -- Получаем конечную точку прицела (место, куда игрок смотрит) local trace = util.TraceLine({ start = pos, endpos = pos + ang:Forward() * 100000000, filter = ply }) -- Преобразуем конечную точку в 2D local screenPos = trace.HitPos:ToScreen() -- Рисуем красную точку на экране surface.SetDrawColor(255, 0, 0, 255) surface.DrawRect(screenPos.x - 1, screenPos.y - 1, 3, 3) end -- Добавляем функцию в хук, чтобы она вызывалась каждый кадр hook.Add("HUDPaint", "DrawCustomCrosshair", DrawCrosshair)

Информация о оружии и патонах
-- Создаем функцию для отображения информации о патронах и оружии local function DrawWeaponInfo() -- Получаем игрока и его оружие local ply = LocalPlayer() local weapon = ply:GetActiveWeapon() -- Проверяем, что игрок имеет активное оружие if IsValid(weapon) then -- Получаем информацию о текущем оружии local ammoClip = weapon:Clip1() -- Количество патронов в магазине local ammoReserve = ply:GetAmmoCount(weapon:GetPrimaryAmmoType()) -- Количество патронов в запасе local weaponName = weapon:GetPrintName() -- Название оружия -- Формируем текст для отображения local text = weaponName .. " | " .. ammoClip .. " / " .. ammoReserve -- Определяем позицию для отображения текста local x = ScrW() / 2 local y = ScrH() - 50 -- Рисуем текст на экране draw.DrawText(text, "DermaDefault", x, y, textColor, TEXT_ALIGN_CENTER) end end -- Добавляем функцию в хук, чтобы она вызывалась каждый кадр hook.Add("HUDPaint", "DrawWeaponInfo", DrawWeaponInfo)

Простой компас
-- Ширина и высота полоски local barWidth = 20 local barHeight = 20 -- Создаем функцию для отображения HUD local function DrawCompassHUD() -- Получаем игрока и его угол направления local ply = LocalPlayer() local ang = ply:EyeAngles() -- Вычисляем угол в градусах local angle = ang.y % 360 -- Определяем позицию для отображения HUD local x = ScrW() / 2 - barWidth / 2 local y = 50 -- Рисуем полоску для отображения текущего направления draw.RoundedBox(0, x, y, barWidth, barHeight, Color(0, 0, 0, 200)) -- Находим направление, на которое смотрит игрок local playerDir = nil local angles = { {name = "N", angle = 0}, {name = "NE", angle = 45}, {name = "E", angle = 90}, {name = "SE", angle = 135}, {name = "S", angle = 180}, {name = "SW", angle = 225}, {name = "W", angle = 270}, {name = "NW", angle = 315} } for _, dir in ipairs(angles) do if angle >= dir.angle - 22.5 and angle <= dir.angle + 22.5 then playerDir = dir break end end -- Если направление найдено, отображаем его в виде квадрата и угол внутри if playerDir then local xpos = x + (barWidth / 2) - (barHeight / 2) local ypos = y draw.RoundedBox(0, xpos, ypos, barHeight, barHeight, Color(255, 255, 255)) draw.SimpleText(playerDir.name, "DermaDefault", xpos + barHeight / 2, ypos + barHeight / 2, color_black, TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER) draw.SimpleText(tostring(math.floor(angle)), "DermaDefault", xpos + barHeight / 2, ypos + barHeight / 2 + 15, color_black, TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER) end end -- Добавляем функцию в хук, чтобы она вызывалась каждый кадр hook.Add("HUDPaint", "DrawCompassHUD", DrawCompassHUD)

Часы

-- Создаем функцию для отображения времени local function DrawTimeHUD() -- Получаем текущее время local time = os.date("%H:%M") -- Определяем позицию для отображения времени local x = ScrW() - 100 local y = 20 -- Устанавливаем цвет и шрифт для текста времени surface.SetFont("DermaLarge") surface.SetTextColor(255, 255, 255, 255) -- Получаем ширину текста времени local textWidth, textHeight = surface.GetTextSize(time) -- Рисуем текст времени на экране surface.SetTextPos(x - textWidth / 2, y - textHeight / 2) surface.DrawText(time) end -- Добавляем функцию в хук, чтобы она вызывалась каждый кадр hook.Add("HUDPaint", "DrawTimeHUD", DrawTimeHUD)
Derma окна. Введение
Ранее мы уже рассматривали Derma окна
Derma - это библиотека пользовательского интерфейса (UI) для игр на движке Source, который используется в играх, построенных на базе Source Engine, таких как Garry's Mod и Team Fortress 2. Derma позволяет создавать интерактивные элементы пользовательского интерфейса, такие как окна, кнопки, текстовые метки и многое другое.

Вот некоторые основные концепции и компоненты Derma:
  • Окна (Frames): Основные контейнеры для размещения других элементов UI. Окна могут иметь заголовок, кнопки закрытия и перетаскиваться мышью.
  • Элементы управления (Controls): Элементы, такие как кнопки, полосы прокрутки, текстовые поля и многое другое, которые предоставляют пользователю возможность взаимодействия с приложением.
  • Панели (Panels): Общий термин для любых контейнеров, которые могут содержать другие элементы UI. Они могут быть использованы для организации и структурирования пользовательского интерфейса.
  • Метки (Labels): Текстовые элементы, используемые для отображения статического текста.
  • Меню (Menus): Всплывающие списки или контекстные меню, которые могут содержать пункты меню для выбора пользователем.
  • Стили (Styles): Derma позволяет создавать пользовательские стили для элементов UI, такие как цвета, шрифты, размеры и т. д.
С помощью Derma вы можете создавать разнообразные и интерактивные пользовательские интерфейсы для ваших игр и аддонов на базе Source Engine. Это мощный инструмент, который позволяет создавать интуитивно понятные и функциональные интерфейсы для вашего игрового опыта.
Derma окна. Попапы
Попапы (Popups) - это окна или диалоговые окна, которые появляются поверх основного пользовательского интерфейса и зачастую используются для отображения важной информации, запроса подтверждения от пользователя или предоставления каких-то дополнительных действий.
В следующих примерах, попапы будут открываться по консольной команде.
Тут этой командой будет "open_derma_window"
-- Функция для создания и инициализации окна Derma local function CreateDermaWindow() -- Создаем основное окно Derma local frame = vgui.Create("DFrame") frame:SetSize(300, 200) frame:SetTitle("Пример Derma окна") frame:SetVisible(true) frame:SetDraggable(true) frame:ShowCloseButton(true) frame:Center() -- Добавляем текстовую метку в окно local label = vgui.Create("DLabel", frame) label:SetText("Это пример Derma окна!") label:SetPos(50, 50) label:SetSize(200, 20) -- Добавляем кнопку закрытия окна local closeButton = vgui.Create("DButton", frame) closeButton:SetText("Закрыть") closeButton:SetPos(100, 120) closeButton:SetSize(100, 30) closeButton.DoClick = function() frame:Close() end -- Показываем окно frame:MakePopup() end -- Добавляем консольную команду для открытия окна concommand.Add("open_derma_window", function() CreateDermaWindow() end)
Чтобы открыть его, заходим в консоль (по дефолту это клавиша "~"), и вписываем "open_derma_window", и в итоге выходит что то типо такого окна:


Разбор кода
Этот код на Lua создает и открывает окно с помощью библиотеки Derma в Garry's Mod. Давайте разберем каждую строку кода:

-- Функция для создания и инициализации окна Derma local function CreateDermaWindow()

Эта строка начинает определение функции Lua под названием `CreateDermaWindow`. Эта функция будет использоваться для создания и настройки окна Derma.

-- Создаем основное окно Derma local frame = vgui.Create("DFrame")

Эта строка создает основное окно Derma с помощью функции `vgui.Create()`. Она принимает строку `"DFrame"`, чтобы создать окно типа `DFrame` (прямоугольное окно). Результатом этой строки будет объект окна, который мы сохраняем в переменной `frame`.

frame:SetSize(300, 200)

Эта строка устанавливает размер созданного окна. Оно будет иметь ширину 300 пикселей и высоту 200 пикселей.

frame:SetTitle("Пример Derma окна")

Эта строка устанавливает заголовок для окна на "Пример Derma окна".

frame:SetVisible(true)

Эта строка устанавливает видимость окна на `true`, что означает, что окно будет отображаться на экране.

frame:SetDraggable(true)

Эта строка делает окно перетаскиваемым, позволяя пользователю перемещать его мышью.

frame:ShowCloseButton(true)

Эта строка показывает кнопку закрытия окна.

frame:Center()

Эта строка центрирует окно на экране.

-- Добавляем текстовую метку в окно local label = vgui.Create("DLabel", frame) label:SetText("Это пример Derma окна!") label:SetPos(50, 50) label:SetSize(200, 20)

Этот блок кода создает и настраивает текстовую метку с помощью `DLabel`. Она устанавливает текст на "Это пример Derma окна!" и устанавливает его положение и размер в окне.

-- Добавляем кнопку закрытия окна local closeButton = vgui.Create("DButton", frame) closeButton:SetText("Закрыть") closeButton:SetPos(100, 120) closeButton:SetSize(100, 30) closeButton.DoClick = function() frame:Close() end

Этот блок кода создает кнопку закрытия окна с помощью `DButton`. Она устанавливает текст на "Закрыть" и настраивает ее положение и размер в окне. Кроме того, она устанавливает функцию `DoClick`, которая вызывается при щелчке на кнопке и закрывает окно.

-- Показываем окно frame:MakePopup()

Эта строка делает окно видимым для пользователя, размещая его поверх всех других элементов интерфейса.

end

Это завершает определение функции `CreateDermaWindow`.

-- Добавляем консольную команду для открытия окна concommand.Add("open_derma_window", function() CreateDermaWindow() end)

Этот блок кода добавляет консольную команду `"open_derma_window"`, которая вызывает функцию `CreateDermaWindow()`. При выполнении этой команды в консоли игры будет открыто окно, созданное функцией `CreateDermaWindow()`.
Derma окна. Материалы
В библиотеке Derma для Garry's Mod вы можете работать с материалами для кастомизации внешнего вида элементов пользовательского интерфейса. Это позволяет создавать более интересные и креативные дизайны для ваших Derma окон. Вот основные шаги по работе с материалами в Derma окнах:

1. Загрузка материалов
Чтобы использовать материалы в вашем Derma окне, вам необходимо сначала загрузить нужные материалы с помощью функции `Material()`. Например:
local myMaterial = Material("materials/mymaterial.png", "noclamp smooth")
Здесь `"materials/mymaterial.png"` - это путь к изображению, которое будет использоваться в качестве материала.

2. Использование материалов в элементах интерфейса:
После загрузки материала вы можете использовать его в любых элементах пользовательского интерфейса, поддерживающих текстуры. Например, для использования материала в кнопке:
local myButton = vgui.Create("DButton") myButton:SetText("Моя кнопка") myButton:SetSize(200, 50) myButton:SetColor(Color(255, 255, 255)) -- Устанавливаем цвет текста кнопки myButton.Paint = function(self, w, h) surface.SetDrawColor(255, 255, 255) -- Устанавливаем цвет рисования surface.SetMaterial(myMaterial) -- Устанавливаем материал surface.DrawTexturedRect(0, 0, w, h) -- Рисуем текстуру материала на кнопке end

3. Дополнительные параметры материалов:
При загрузке материалов вы можете также указать дополнительные параметры для их обработки, такие как `"noclamp"`, `"smooth"`, `"vertexlitgeneric"`, и другие. Эти параметры позволяют настроить отображение материала в соответствии с вашими потребностями.

4. Анимация материалов:
Вы также можете создавать анимированные материалы и использовать их в Derma окнах для создания более динамичного интерфейса. Для этого загрузите анимированный материал и используйте его аналогично статическому материалу.

5. Освобождение ресурсов:
После завершения работы с материалами рекомендуется освободить ресурсы, вызвав метод `:Dispose()` на объекте материала. Это важно для избежания утечек памяти.
Derma окна. Материалы. Примеры
Создает Derma окно с одним полем ввода и одной кнопкой. Пользователь должен ввести путь к материалу в поле ввода, а при нажатии на кнопку этот материал должен примениться к фону Derma окна.
-- Функция для создания и инициализации Derma окна local function CreateMaterialWindow() -- Создаем основное окно Derma local frame = vgui.Create("DFrame") frame:SetSize(400, 200) frame:SetTitle("Настройка фона Derma окна") frame:SetVisible(true) frame:SetDraggable(true) frame:ShowCloseButton(true) frame:Center() -- Создаем текстовое поле для ввода пути к материалу local pathEntry = vgui.Create("DTextEntry", frame) pathEntry:SetPos(50, 50) pathEntry:SetSize(300, 20) -- Создаем кнопку для установки фона окна local setButton = vgui.Create("DButton", frame) setButton:SetText("Установить фон") setButton:SetPos(50, 100) setButton:SetSize(100, 30) setButton.DoClick = function() local path = pathEntry:GetValue() local material = Material(path) frame.Paint = function(self, w, h) surface.SetDrawColor(255, 255, 255) surface.SetMaterial(material) surface.DrawTexturedRect(0, 0, w, h) end end -- Показываем окно frame:MakePopup() end -- Добавляем консольную команду для открытия окна concommand.Add("open_material_window", function() CreateMaterialWindow() end)
Конец
Это конец руководства по базовому созданию HUD'ов в Garry's mod
Надеюсь вам понравилось руководство, и вы оцените его.

В руководстве могут быть ошибки, недочёты и тд, если найдёте их, можете написать о них в комментариях!
10 Comments
СТРОГГ 3 Jan @ 9:22am 
случайно ты мне попался, но твои гайды я запомню)
Gorbah 25 Jun, 2024 @ 3:39pm 
А можно узнать,как сделать манипринтер для BaseWars игры.
Владыка песюнов 13 Apr, 2024 @ 12:12pm 
Лучший брательник жаль что я раньше не увидел...
Pathetic 10 Apr, 2024 @ 10:20am 
Спасибо, я учусь писать lua для создания своего сервера
Dr. L  [author] 10 Apr, 2024 @ 9:31am 
Я очень рад, что у вас всё получается, энтузиазм, это очень хорошо, надеюсь вы и дальше будете писать скрипты на lua, если будут ошибки, или вопросы, обращайтесь, всегда буду рад помочь ;)
Pathetic 10 Apr, 2024 @ 4:39am 
А все решил (я перенес в папку lua)
Dr. L  [author] 9 Apr, 2024 @ 8:16pm 
Здравствуйте, может у вас появились скриптовые ошибки или т.п.? Если да, можете показать?
Pathetic 9 Apr, 2024 @ 12:50pm 
у меня не работает hud
сделал все правильно но не работает
.funky1337 1 Apr, 2024 @ 1:37am 
ебать красавчик
Dr. L  [author] 31 Mar, 2024 @ 3:19am 
Возможно позже выпущу 2 часть руководства.