Tuto GLua - Faire un HUD facilement

  • Initiateur de la discussion
Wasied

Wasied

Psychopathe
Messages
909
Score réaction
394
Points
210
Bonjour à tous,

Vu que je m'ennuie un peu, j'ai décidé d'aider ceux qui arrivent dans le GLua.
J'ai décidé donc de faire entrer mes "connaissances" en développement pour vous fournir un tutoriel sur le développement optimisé d'un HUD sur Garry's Mod.
Si vous avez des propositions pour optimiser encore plus le code, n'hésitez pas !

Avant tout :
- Pour ceux qui ne s'y connaissent vraiment pas dans le développement en général, je vous conseille d'aller voir des vidéos sur YouTube à ce propos.
- Sachez juste que les "--" signifient un commentaire dans le code, l'équivalent du "#" en Python par hasard, donc ils ne sont pas pris en compte lors de l'exécution du code.
- J'ai mis beaucoup de commentaires en français dans ce code pour les débutants, mais prenez l'habitude de les écrire en Anglais, langue "universelle" du développement.
- Si vous ne comprenez pas un terme ou autre, n'hésitez pas à répondre à ce post et j'essayerai de vous répondre ou vous rediriger vers des vidéos explicatives.
- Sachez que le GLua se code en Anglais et pas en Français.
- Il vous faut absolument le GMOD WIKI si vous ne vous y connaissez pas !

Le code (Notez que ce code s'exécutera côté "client" car c'est le client (=joueur) qui doit le voir)
Nous allons commencer par ce qu'on appelle un "hook".
Un hook vous permettra d'exécuter un code lorsqu'un événement a lieu.
Par exemple dans le code suivant, l'événement sera "HUDPaint" qui permettra d'afficher l'HUD sur l'écran de l'utilisateur
Code:
hook.Add("HUDPaint", "WasiedHUD", function()
-- Votre code
end)
Une fois cela fait, nous allons commencer par ajouter les variables.
Les variables, en GROS, cela permet de stocker une valeur, qui peut varier.
(Dico : les variables sont des symboles qui associent un nom à une valeur. Le nom est unique.)
Dans le code, vu qu'on fait un HUD assez basique, on veut juste afficher la vie, l'armure et la faim.

Pour savoir comment récupérer la vie, l'armure et la faim, on va aller voir sur le Gmod Wiki, et nous trouvons ceci :
Vie : https://wiki.garrysmod.com/page/Entity/Health
Armure : https://wiki.garrysmod.com/page/Player/Armor
Pour la faim, c'est un peu plus spécial.. Etant donné qu'elle n'est disponible que sur le mode de jeu "DarkRP", il faut aller voir dans le "DarkRP Wiki" où on trouvera ceci :
Faim : getDarkRPVar("Energy")
Donc avec ceci, nous savons ce que vont valoir nos 3 valeurs de vie, d'armure et de faim.
On va pouvoir l'intégrer au code.

Nous allons donc faire comme ceci :
Code:
hook.Add("HUDPaint", "WasiedHUD", function() -- Remarquez ici qu'on a fait une tabulation, c'est pour rendre le code propre et lisible à tous, c'est très important ! local vie = LocalPlayer():Health() -- Ici, nous définissons que la variable vie (que nous avons définie en local, vous verrez plus bas pourquoi) qui vaut à la vie du joueur local (soit le joueur qui exécute le code) local armure = LocalPlayer():Armor() -- Même chose mais avec l'armure local faim = LocalPlayer():getDarkRPVar("Energy") -- Ici, nous définissons que la faim vaut ce que nous avons vu ci-dessus du joueur local
end)
Donc là, on a défini les variables ainsi que leurs valeurs, il ne suffira plus que les dessiner sur l'écran du joueur.

Remarque : Le "LocalPlayer()" permet de récupérer le joueur qui exécutera le code comme je l'ai indiqué. Il faut toujours respecter les majuscules et ne pas oublier les () à la fin. Cette fonction vous sera très utile dans vos codes. (Uniquement côté client, voir wiki)
Remarque : Le "local" devant les variables sont utiles question optimisation/sécurité. Une variable local signifiera qu'elle ne pourra être appelée uniquement dans le fichier dans laquelle elle se situe (et puis, vous verrez même plus tard que c'est même plus précis que dans tous le fichier). Imaginez que j'appelle ma variable "lol" pour la vie dans mon HUD mais que je ne la défini pas en local, si je fais un autre addon avec une variable qui a le même nom, "lol", il y aura des erreurs. Un peu compliqué à expliquer, habituez-vous juste à les mettre en local.

Avant de dessiner le tout sur l'écran, nous allons optimiser un peu le tout.
Le problème avec notre code actuellement, c'est que si on défini la vie d'un joueur à 500, la barre de vie va aller beaucoup trop loin sur l'écran, et ça va être moche.
Donc nous ce que l'on veut, c'est que la vie soit limité entre 0 et 100, ce qui permettra que si la vie est en dessous de 0, cela sort 0, et que si la vie est au-dessus de 100, cela sort 100. Vous allez comprendre pourquoi après.

Pour régler ce problème, nous avons une magnifique fonction qui nous est préparée : math.Clamp
Je vous laisse aller fouiller et comprendre plus précisément ce qu'elle fait, mais en gros, elle récupère la valeur X sauf si X est plus petit que A ou que X est plus grand que B.
En pratique, la valeur "vie" qu'on a défini en haut, si elle est plus petite que 0 dans ce cas, elle vaudra 0, si elle est plus grande que 100, elle vaudra 100.
Il suffit de le mettre en pratique comme ils le disent sur le wiki.

Code:
hook.Add("HUDPaint", "WasiedHUD", function() -- Tabulation importante ! local vie = math.Clamp(LocalPlayer():Health(), 0, 100) -- Variable de vie local armure = math.Clamp(LocalPlayer():Armor(), 0, 100) -- Variable d'armure local faim = LocalPlayer():getDarkRPVar("Energy") -- Variable de faim
-- Remarquez que nous n'avons pas mis de math.Clamp pour la faim, tout simplement car il est impossible d'avoir + de 100 ou - de 0 niveau de faim (ils l'ont déjà fait pour nous)
end)
Voilà, là notre code est bon, on peut commencer à dessiner les barres...
Pour cela, nous allons utiliser le "surface.DrawRect".
Code:
hook.Add("HUDPaint", "WasiedHUD", function() local vie = math.Clamp(LocalPlayer():Health(), 0, 100) -- Variable de vie local armure = math.Clamp(LocalPlayer():Armor(), 0, 100) -- Variable d'armure local faim = LocalPlayer():getDarkRPVar("Energy") -- Variable de faim surface.SetDrawColor(255,0,0) -- On défini la couleur de la barre qu'on va dessiner en RGB (rouge) surface.DrawRect(5, ScrH()-30, vie, 20) -- Ici on dessine le rectangle, comme sur le wiki. -- 5 -> Il sera situé à 5 pixels de l'écran de gauche à droite -- ScrH()-30 -> ScrH() permet de récupérer la hauteur de l'écran, donc il sera situé à la taille de l'écran - 30. -- Cela permettra de mettre l'HUD en bas, parce que si on avait juste mis 30, il serait situé à 30 pixel à partir du haut de l'écran. -- C'est une simple soustraction, imaginez que votre écran fait 100 pixel de haut, vous faites simplement 100-30. -- Si vous êtes bon en math, vous savez que ça fait 70, donc si mettez 70 cela fonctionnera exactement de la même manière. -- Le problème c'est que chaque écran a une taille différente, donc nous adaptons à tous les écrans de tous les joueurs pour qu'il soit situé à la même place sur l'écran de tout le monde. -- vie -> On fait appel à la variable qu'on avait défini en haut. C'est grâce à cela que la barre de vie bouge en fonction de votre vie. -- En gros, vous dites que la vie du joueur sera la longueur de la barre. -- Donc si la vie du joueur est de 50, la barre sera de 50 pixel ! -- 20 -> Simplement la hauteur de la barre, vous faites comme vous voulez, chacun ses gouts !
end)
Voilà, là votre barre de vie sera dessinée, il suffira juste de faire comme ça pour toutes les barres, juste changer la position de chacune des barres, puis c'est fini.
Voici le code final :
Code:
hook.Add("HUDPaint", "WasiedHUD", function() local vie = math.Clamp(LocalPlayer():Health(), 0, 100) -- Variable de vie local armure = math.Clamp(LocalPlayer():Armor(), 0, 100) -- Variable d'armure local faim = LocalPlayer():getDarkRPVar("Energy") -- Variable de faim surface.SetDrawColor(255,0,0) -- Couleur de la vie surface.DrawRect(5, ScrH()-30, vie, 20) -- Barre de la vie surface.SetDrawColor(0,255,0) -- Couleur de la faim surface.DrawRect(5, ScrH()-60, faim, 20) -- Barre de la faim if armor != 0 then -- Ici, ce n'est pas obligatoire, mais c'est une vérificiation qui fait en sorte que si l'armure vaut 0, elle ne s'affiche pas (juste question pratique) surface.SetDrawColor(0,0,255) -- Couleur de l'armure surface.DrawRect(5, ScrH()-90, armure, 20) -- Barre de l'armure end
end)
Si vous voulez, vous pouvez même rajouter des backgrounds (=arrières-plans) derrière les barres, c'est exactement la même chose, faut jouer jouer avec la position et la taille des barres comme on a vu. La seule limite du développement c'est votre imagination (après ne pensez pas que vous allez faire un VCMod avec ces compétences, c'est vraiment la base ceci)

Voilà, j'espère que ce petit tutoriel vous aura aidé !
Si vous avez des propositions ou des modifications à apporter, n'hésitez pas !


Merci,
Wasied.
 
Dernière édition:
  • J'aime
Réactions: nathan00036 et Jo Ballas
slownls

slownls

Helpeur Divin
Messages
1 853
Score réaction
1 079
Points
465
Wasied à dit:
Bonjour à tous,

Vu que je m'ennuie un peu, j'ai décidé d'aider ceux qui arrivent dans le GLua.
J'ai décidé donc de faire entrer mes "connaissances" en développement pour vous fournir un tutoriel sur le développement optimisé d'un HUD sur Garry's Mod.
Si vous avez des propositions pour optimiser encore plus le code, n'hésitez pas !

Avant tout :
- Pour ceux qui ne s'y connaissent vraiment pas dans le développement en général, je vous conseille d'aller voir des vidéos sur YouTube à ce propos.
- Sachez juste que les "--" signifient un commentaire dans le code, l'équivalent du "#" en Python par hasard, donc ils ne sont pas pris en compte lors de l'exécution du code.
- J'ai mis beaucoup de commentaires en français dans ce code pour les débutants, mais prenez l'habitude de les écrire en Anglais, langue "universelle" du développement.
- Si vous ne comprenez pas un terme ou autre, n'hésitez pas à répondre à ce post et j'essayerai de vous répondre ou vous rediriger vers des vidéos explicatives.
- Sachez que le GLua se code en Anglais et pas en Français.
- Il vous faut absolument le GMOD WIKI si vous ne vous y connaissez pas !

Le code (Notez que ce code s'exécutera côté "client" car c'est le client (=joueur) qui doit le voir)
Nous allons commencer par ce qu'on appelle un "hook".
Un hook vous permettra d'exécuter un code lorsqu'un événement a lieu.
Par exemple dans le code suivant, l'événement sera "HUDPaint" qui permettra d'afficher l'HUD sur l'écran de l'utilisateur
Code:
hook.Add("HUDPaint", "WasiedHUD", function()
-- Votre code
end)
Une fois cela fait, nous allons commencer par ajouter les variables.
Les variables, en GROS, cela permet de stocker une valeur, qui peut varier.
(Dico : les variables sont des symboles qui associent un nom à une valeur. Le nom est unique.)
Dans le code, vu qu'on fait un HUD assez basique, on veut juste afficher la vie, l'armure et la faim.

Pour savoir comment récupérer la vie, l'armure et la faim, on va aller voir sur le Gmod Wiki, et nous trouvons ceci :
Vie : https://wiki.garrysmod.com/page/Entity/Health
Armure : https://wiki.garrysmod.com/page/Player/Armor
Pour la faim, c'est un peu plus spécial.. Etant donné qu'elle n'est disponible que sur le mode de jeu "DarkRP", il faut aller voir dans le "DarkRP Wiki" où on trouvera ceci :
Faim : getDarkRPVar("Energy")
Donc avec ceci, nous savons ce que vont valoir nos 3 valeurs de vie, d'armure et de faim.
On va pouvoir l'intégrer au code.

Nous allons donc faire comme ceci :
Code:
hook.Add("HUDPaint", "WasiedHUD", function() -- Remarquez ici qu'on a fait une tabulation, c'est pour rendre le code propre et lisible à tous, c'est très important ! local vie = LocalPlayer():Health() -- Ici, nous définissons que la variable vie (que nous avons définie en local, vous verrez plus bas pourquoi) qui vaut à la vie du joueur local (soit le joueur qui exécute le code) local armure = LocalPlayer():Armor() -- Même chose mais avec l'armure local faim = LocalPlayer():getDarkRPVar("Energy") -- Ici, nous définissons que la faim vaut ce que nous avons vu ci-dessus du joueur local
end)
Donc là, on a défini les variables ainsi que leurs valeurs, il ne suffira plus que les dessiner sur l'écran du joueur.

Remarque : Le "LocalPlayer()" permet de récupérer le joueur qui exécutera le code comme je l'ai indiqué. Il faut toujours respecter les majuscules et ne pas oublier les () à la fin. Cette variable vous sera très utile dans vos codes.
Remarque : Le "local" devant les variables sont utiles question optimisation/sécurité. Une variable local signifiera qu'elle ne pourra être appelée uniquement dans le fichier dans laquelle elle se situe (et puis, vous verrez même plus tard que c'est même plus précis que dans tous le fichier). Imaginez que j'appelle ma variable "caca" pour la vie dans mon HUD mais que je ne la défini pas en local, si je fais un autre addon avec une variable qui a le même nom, "caca", il y aura des erreurs. Un peu compliqué à expliquer, habituez-vous juste à les mettre en local.

Avant de dessiner le tout sur l'écran, nous allons optimiser un peu le tout.
Le problème avec notre code actuellement, c'est que si on défini la vie d'un joueur à 500, la barre de vie va aller beaucoup trop loin sur l'écran, et ça va être moche.
Donc nous ce que l'on veut, c'est que la vie soit limité entre 0 et 100, ce qui permettra que si la vie est en dessous de 0, cela sort 0, et que si la vie est au-dessus de 100, cela sort 100. Vous allez comprendre pourquoi après.

Pour régler ce problème, nous avons une magnifique fonction qui nous est préparée : math.Clamp
Je vous laisse aller fouiller et comprendre plus précisément ce qu'elle fait, mais en gros, elle récupère la valeur X sauf si X est plus petit que A ou que X est plus grand que B.
En pratique, la valeur "vie" qu'on a défini en haut, si elle est plus petite que 0 dans ce cas, elle vaudra 0, si elle est plus grande que 100, elle vaudra 100.
Il suffit de le mettre en pratique comme ils le disent sur le wiki.

Code:
hook.Add("HUDPaint", "WasiedHUD", function() -- Tabulation importante ! local vie = math.Clamp(LocalPlayer():Health(), 0, 100) -- Variable de vie local armure = math.Clamp(LocalPlayer():Armor(), 0, 100) -- Variable d'armure local faim = LocalPlayer():getDarkRPVar("Energy") -- Variable de faim
-- Remarquez que nous n'avons pas mis de math.Clamp pour la faim, tout simplement car il est impossible d'avoir + de 100 ou - de 0 niveau de faim (ils l'ont déjà fait pour nous)
end)
Voilà, là notre code est bon, on peut commencer à dessiner les barres...
Pour cela, nous allons utiliser le "surface.DrawRect".
Code:
hook.Add("HUDPaint", "WasiedHUD", function() local vie = math.Clamp(LocalPlayer():Health(), 0, 100) -- Variable de vie local armure = math.Clamp(LocalPlayer():Armor(), 0, 100) -- Variable d'armure local faim = LocalPlayer():getDarkRPVar("Energy") -- Variable de faim surface.SetDrawColor(255,0,0) -- On défini la couleur de la barre qu'on va dessiner en RGB (rouge) surface.DrawRect(5, ScrH()-30, vie, 20) -- Ici on dessine le rectangle, comme sur le wiki. -- 5 -> Il sera situé à 5 pixels de l'écran de gauche à droite -- ScrH()-30 -> ScrH() permet de récupérer la hauteur de l'écran, donc il sera situé à la taille de l'écran - 30. -- Cela permettra de mettre l'HUD en bas, parce que si on avait juste mis 30, il serait situé à 30 pixel à partir du haut de l'écran. -- C'est une simple soustraction, imaginez que votre écran fait 100 pixel de haut, vous faites simplement 100-30. -- Si vous êtes bon en math, vous savez que ça fait 70, donc si mettez 70 cela fonctionnera exactement de la même manière. -- Le problème c'est que chaque écran a une taille différente, donc nous adaptons à tous les écrans de tous les joueurs pour qu'il soit situé à la même place sur l'écran de tout le monde. -- vie -> On fait appel à la variable qu'on avait défini en haut. C'est grâce à cela que la barre de vie bouge en fonction de votre vie. -- En gros, vous dites que la vie du joueur sera la longueur de la barre. -- Donc si la vie du joueur est de 50, la barre sera de 50 pixel ! -- 20 -> Simplement la hauteur de la barre, vous faites comme vous voulez, chacun ses gouts !
end)
Voilà, là votre barre de vie sera dessinée, il suffira juste de faire comme ça pour toutes les barres, juste changer la position de chacune des barres, puis c'est fini.
Voici le code final :
Code:
hook.Add("HUDPaint", "WasiedHUD", function() local vie = math.Clamp(LocalPlayer():Health(), 0, 100) -- Variable de vie local armure = math.Clamp(LocalPlayer():Armor(), 0, 100) -- Variable d'armure local faim = LocalPlayer():getDarkRPVar("Energy") -- Variable de faim surface.SetDrawColor(255,0,0) -- Couleur de la vie surface.DrawRect(5, ScrH()-30, vie, 20) -- Barre de la vie surface.SetDrawColor(0,255,0) -- Couleur de la faim surface.DrawRect(5, ScrH()-60, faim, 20) -- Barre de la faim if armor != 0 then -- Ici, ce n'est pas obligatoire, mais c'est une vérificiation qui fait en sorte que si l'armure vaut 0, elle ne s'affiche pas (juste question pratique) surface.SetDrawColor(0,0,255) -- Couleur de l'armure surface.DrawRect(5, ScrH()-90, armure, 20) -- Barre de l'armure end
end)
Si vous voulez, vous pouvez même rajouter des backgrounds (=arrières-plans) derrière les barres, c'est exactement la même chose, faut jouer jouer avec la position et la taille des barres comme on a vu. La seule limite du développement c'est votre imagination (après ne pensez pas que vous allez faire un VCMod avec ces compétences, c'est vraiment la base ceci)

Voilà, j'espère que ce petit tutoriel vous aura aidé !
Si vous avez des propositions ou des modifications à apporter, n'hésitez pas !


Merci,
Wasied.
Merci du tuto, j'ai pu m'améliorer grâce à toi !
 
ZarosOVH

ZarosOVH

Modérateur
Membre du Staff
Messages
6 521
Score réaction
5 482
Points
1 295
slownls à dit:
Merci du tuto, j'ai pu m'améliorer grâce à toi !
Grace à ce tuto tu as appris que LocalPlayer() étais une variable je pari ! Kappa
 
  • J'aime
Réactions: Lap3che et Wabel
slownls

slownls

Helpeur Divin
Messages
1 853
Score réaction
1 079
Points
465
ZarosOVH à dit:
Grace à ce tuto tu as appris que LocalPlayer() étais une variable je pari ! Kappa
Non je l'utilisai dans le côté server c'est pour ça que mon add-on bugé
 
  • J'aime
Réactions: gogo17, RedTroz, Wabel et 1 autre personne
  • Initiateur de la discussion
Wasied

Wasied

Psychopathe
Messages
909
Score réaction
394
Points
210
slownls à dit:
Merci du tuto, j'ai pu m'améliorer grâce à toi !
Bah oui c'est pour ça que je dis tutoriel pour les débutants Kappa

ZarosOVH à dit:
Grace à ce tuto tu as appris que LocalPlayer() étais une variable je pari ! Kappa
Arrête je me suis perdu dans mes mots, j'ai corrigé chef
 
  • J'aime
Réactions: gogo17
G

Gariox28

Geek suprême
Messages
590
Score réaction
95
Points
185
et ensuite le code on le met ou ? darkrpmodification ? dans un dossier ?
 
  • Initiateur de la discussion
Wasied

Wasied

Psychopathe
Messages
909
Score réaction
394
Points
210
Gariox28 à dit:
et ensuite le code on le met ou ? darkrpmodification ? dans un dossier ?
Dans ton dossier addons, tu crées ces sous-dossiers : addonName/lua/autorun/client et tu places ton fichier dedans
 
G

Gariox28

Geek suprême
Messages
590
Score réaction
95
Points
185
Wasied à dit:
Dans ton dossier addons, tu crées ces sous-dossiers : addonName/lua/autorun/client et tu places ton fichier dedans
ok merci
 
  • J'aime
Réactions: Wasied
RazzMo

RazzMo

Geek suprême
Messages
314
Score réaction
192
Points
120
Surement un des plus grand développeur de Garry's Mod, merci pour se tutoriel j'ai beaucoup appris j'ai hâte que tu mette le tutoriel pour faire un F4 Menu.
 
  • Oula
  • J'aime
Réactions: gogo17 et NoaGamingFR
  • Initiateur de la discussion
Wasied

Wasied

Psychopathe
Messages
909
Score réaction
394
Points
210
RazzMo à dit:
Surement un des plus grand développeur de Garry's Mod, merci pour se tutoriel j'ai beaucoup appris j'ai hâte que tu mette le tutoriel pour faire un F4 Menu.
Merci pour ce commentaire constructif
 
  • Haha
  • J'aime
Réactions: Caesarovich, gogo17 et NoaGamingFR
N

Noha#3922

Nouveau né
Messages
17
Score réaction
0
Points
15
Petit problème, le hud par default je suppose se superposé à cette hub, comment je peut désactiver l'autre
 
Z

zeroxytb98

Têtard
Messages
1
Score réaction
0
Points
5
salut je sais pas si tu va voir se message mes comment on désactive l'hud darkrp?
 
F

Fiasco

Bambi
Messages
46
Score réaction
5
Points
40
zeroxytb98 à dit:
salut je sais pas si tu va voir se message mes comment on désactive l'hud darkrp?
Pas mal l'up de quasiment 4 ans...
 
Z

ZLRebug

Bambi
Messages
62
Score réaction
10
Points
30
zeroxytb98 à dit:
salut je sais pas si tu va voir se message mes comment on désactive l'hud darkrp?
r'ajoute sa a ton hud


--Code pour supprimer le hud de base :
local HideElement = {
["CHudHealth"] = true,
["CHudBattery"] = true,
["CHudAmmo"] = true,
["CHudSecondaryAmmo"] = true,
["DarkRP_HUD"] = true,
["DarkRP_EntityDisplay"] = true,
["DarkRP_LocalPlayerHUD"] = true,
["DarkRP_Hungermod"] = true,
["DarkRP_Agenda"] = true,
["DarkRP_LockdownHUD"] = true,
["DarkRP_ArrestedHUD"] = true,
["DarkRP_ChatReceivers"] = true,
}
hook.Add("HUDShouldDraw", "mTxServ:ShouldDraw", function(name)
if HideElement[name] then return false end
end)
 
Discord d'entraide
Rejoignz-nous sur Discord