Garry's Mod

Garry's Mod

Not enough ratings
Плавная полоска здоровья(Healthbar)
By haskell_md2
Я вас приветствую. Это моё первое НОРМАЛЬНОЕ руководство в Steam, не судите строго. Сегодня, в этом руководстве я вас научу делать плавный Healthbar, который вы сможете использовать где захотите.
   
Award
Favorite
Favorited
Unfavorite
ПРЕДУПРЕЖДЕНИЕ!
Этот гайд предназначен для тех, кто хоть чуть-чуть разбирается в Glua и в целом в программирование. Если вам нужен только исходник, то промотайте в самый низ.
Шаг 1
Создаём непосредственно файлик нашего скрипта и кидаем его по этому адресу:
*\steamapps\common\GarrysMod\garrysmod\lua\autorun\client
Шаг 2
Впишите в созданный файл вот эти строки:
Этот код нужен для того, чтобы спрятать стандартный худ
Разберём всё по строкам:

hide -- массив, в который мы записываем элементы, которые необходимо спрятать, в данном случае Здоровье (СHudHealt)

hook.Add( "HUDShouldDraw", "HideHUD" -- хук отрисовки худов, вызывается каждое обновление кадра.

function( name )
if ( hide[] ) then return false end
end ) --Функция, которая прячет все указанные в массиве элементы



Примечание: это скрывает только стандартный худ!
Шаг 3
Объявляем вот эти 6 переменных.







Разберём:

Цвета:
color1 - цвет "задника полоски хп" в RGBA формате.
color2 - цвет задника полоски хп в RGBA формате.
Брать цвета в RGBA формате здесь: клик[http//%27https]
(A - это альфа канал, он отвечает за прозрачность)


Размер:
height - переменная высоты, задаётся в пикселях.
widht - переменная ширины, задаётся в пикселях.


health_player - переменная здоровья нашего игрока, пока что она пустая.

sn - переменная стартового номера функции Lerp(), скоро поймёте для чего она. (Обязательно ставьте 100)
Шаг 4
Первым делом создаём функцию, которая собственно будет нам рисовать Healtbar, и в неё пишем код для отрисовки 'задника'







Разбор:
Я надеюсь, что вы немножко знаете Английский и вы сможете перевести 'SetDrawColor' и 'DrawRect'

А 'surface' - это класс, который нужен для рисования на экране игрока.


Ещё обязательно надо добавить вот эту строчку:





Она нужна для запуска функции Healthbar_draw при каждом обновление кадра.


Cохраните скрипт, запустите Гарисмод и вы увидете такую картину:
Шаг 5
Теперь добавим в функцию Healthbar_draw вот эти строчки:

Давайте разбирать код: if(LocalPlayer():isAlive) --этот if необходим для избежания вот это мерзкой ошибки, которая отняла у меня в своё время кучу моих нервных клеток.







scrH() -- функция, возвращающая высоту экрана, здесь она нужна, чтобы переместить Healthbar в самый низ.


Вот ещё объяснение параметров функции 'DrawRect(x,y,widht,height,color)'
x - положение верхнего левого угла прямоугольника по оси абсцисс
y - как можно догадаться положение верхнего левого угла/b прямоугольника по оси ординат

widht,height,color - очевидно

Такой результат проделанной работы.
Шаг 6
Отлично! Полоска уменьшается когда игрок теряет хп, и соответственно увеличивается, когда хп прибавляется. Но есть одно НО. Она не плавная, если вы прочитали название руководства(в чём я не сомневаюсь), то вы сюда пришли ради этого. И вот именно этот шаг вам продемонстрирует, как реализовать ПЛАВНОСТЬ полосы здоровья.

Помните переменную sn? Ну так вот, сейчас мы её будем использовать в качестве аргумента для функции Lerp(). Которая в свою очередь решит поставленную задачу.

Короче поменяйте код из прошлого шага на этот:


Отличие этого кода от того как раз заключается в присутствие функции Lerp().

ПОЗДРАВЛЯЮ! Вы сделали плавную полосу здоровья

Исходник
Ссылка на цельный код: клик[github.com]
Послесловие
Опять же, не судите строго, это моё первое вообще руководство. Пишите свою критику, я прочту. Пишите свои вопросы, я отвечу. Я конечно ни на что не намекаю, но клик
(Если я вас каким-то чудесным образом вас чему-то научил или вам пригодился исходник).

Вообщем, спасибо за прочтение! :)

13 Comments
Titanovsky Oct 4, 2020 @ 8:17am 
Я не говорил, что гайд должен быть идеальным. У него тоже не идеальный гайд.
А насчёт его, если мы предположим ситуацию, что он сделает подобный гайд, там 100% он будет расусоливать про lerp().
haskell_md2  [author] Oct 4, 2020 @ 3:55am 
Да согласен, мой гайд прям ОЧЕНЬ НЕ ИДЕАЛЬНЫЙ. Я оставил ссылку на него для примера, какой я сам бы хотел видеть от него.
Titanovsky Oct 2, 2020 @ 11:37pm 
1 - Первый шаг можно вообще убрать, потому что написано, что в целом гайд рассчитан на людей, которые немного разбираются. Они точно знают, как сделать, чтобы файл сработал на клиенте.
2 - Никаких массивов, запутаешь людей. Это таблицы. Да, таблица - это ассоциативный массив, но, Таблица - это Таблица.
3 - У тебя идёт в начале объяснения кода в самом параграфе, а под конец появляются комментарий у кода? Почему нельзя либо в параграфе объяснить код, либо каждый шаг объяснить через комментарий
Но всё равно неплохой гайд, лайк.
Titanovsky Oct 2, 2020 @ 11:36pm 
Сорри, но тот чел прав в том, что сначала нужны основы (это первые три лекций), а потом уже специфика GLua - это последующие лекций. Ну в любом случае, он автор, он знает как.
На счёт твоего гайда, он неплохой, но
haskell_md2  [author] Oct 1, 2020 @ 8:54am 
Kinch, в чём проблема установить VS Code? Особенно, если для него можно поставить ОЧЕНЬ удобное расширение для Гарис мода, к тому же Notepad++ для мазохистов.
Kinch Oct 1, 2020 @ 8:34am 
Sublime text или Notepad++ не проще использовать?
haskell_md2  [author] Jul 29, 2020 @ 5:33am 
Насчёт первых двух (про точки с запятой и скобки у if) я больше пишу на Java чем на Lua и по этому мне так нравиться. А последние замечания я учту.
Klen_list 🎀 Jul 29, 2020 @ 4:09am 
И только щас я заметил, что ты почему-то не локализовал функцию, которую передаешь в hook.Add (function Healthbar_draw), а нужно local function
Klen_list 🎀 Jul 29, 2020 @ 4:08am 
Второе это пробелы в арифметических операциях, помогающее легче разобрать действия в них
ScrH()+5-h
по нормам будет
ScrH() + 5 - h

Третье это то что скобки в одиночных логический операциях излишни
if(LocalPlayer():IsAlive()) then ... end
лучше:
if LocalPlayer():IsAlive() then ... end
и
if hide[name] then return false end
Klen_list 🎀 Jul 29, 2020 @ 4:08am 
Не только ";"
Вообще они лишние, т.к. все равно будут проигнорированы компилятором, они полезны разве что для себя, чтобы не запутаться, как пример
local a = "a"; local b = "b"
но тут можно обойтись и
local a,b = "a","b"