[Tutorial] [Bases] Les fonctions
#1

Salut.

Beaucoup savent dйjа ce que c'est, mais ce tutoriel est bien йvidemment destinй aux dйbutants.
Une fonction, concrиtement, c'est quoi ?
En maths, on dit que зa associe un nombre а un autre
En programmation, c'est plus ou moins зa si on retourne aux bases de l'informatique : le binaire.
Le binaire, c'est huit chiffres (0 ou 1) disposйs dans un certain ordre, qui correspondent а des lettres.
Le A en binaire donnerait quelque chose comme 010000000.
Ce qui fait qu'une fonction comme SendClientMessage correspond bien а du binaire (traduire le message en binaire, pour le renvoyer).

Je vais vous apprendre а crйer des fonctions dans ce tutoriel. C'est assez simple et amusant, vous allez voir.

Prenons un truc simple : une fonction qui tйlйporte tous les joueurs connectйs а la position du joueur qui a tapй la commande

On doit connaоtre tous les joueurs, savoir si ils sont connectйs et enfin tous les TP.

Ce qui donnerait un truc comme

PHP Code:

fonction MaFonction
for(new 0MAX_PLAYERSp++)
{
    if(
IsPlayerConnected(p))
    {
         new 
Float:xFloat:yFloat:z;
         
GetPlayerPos(playeridxyz);
         
SetPlayerPos(pxyz);
         
SendClientMessageToAll(0xFF0000FF"Tout le monde a йtй tйlйportй а un joueur !");
     }
}
findeMaFonction 
Mais vous devinerez que fonction et findeMaFonction ne veulent rien dire en programmation.
Pour le pawn, il y a deux types de fonction : les stock et les public.
Les public sont nйcessaires pour les fonctions appelйes via SetTimer(Ex), tandis que les fonctions stock ne nйcessitent mкme pas de mettre le prйfixe stock devant.
Ensuite, dans la parenthиse de la fonction, on met les paramиtres de la fonction.

Pour ceux qui sont passйs par la filiиre S, vous savez de quoi je parle.
Sinon, pour les nombres, il y a trois catйgories : les inconnues, les variables et les paramиtres.
Un inconnu c'est la valeur de x dans une йquation qu'on cherche а dйterminer.
Une variable c'est un nombre dont la valeur va changer au cours du code
Et un paramиtre c'est une valeur qui sera la mкme tout au long du code.

En pawn, lorsqu'on veut effectuer une action globale, comme un chargement de vйhicule ou une connexion SQL, on ne met pas de paramиtres, donc ().
Quand on veut toucher а un/plusieurs joueurs, on met le paramиtre playerid
Quand on veut toucher aux vйhicules, on met vehicleid
Notez que les types des paramиtres doivent кtre dйclarйs dans ce qu'on appelle le header de la fonction.

Pour la fonction plus complexe qu'on verra plus tard, les paramиtres feront comme зa

(playerid, vehicleid, Floatosx, Floatosy, Floatosz, const message[])

Mais mettre trop de paramиtres dans une fonction, зa devient dйsagrйable а utiliser.
Bref, pour l'exemple...

Reprenons le cas de MaFonction, que je vais renommer TpAll

PHP Code:

TpAll
(playerid// Le header de la fonction
{
    for(new 
0MAX_PLAYERSp++) // On utilise une boucle for pour appliquer p а tous les joueurs
    
{
       if(
IsPlayerConnected(p)) // On limite p а tous les joueurs connectйs
       
{
         new 
Float:xFloat:yFloat:z// On crйe les variables de position, qu'on pourrait mettre en paramиtre de la f
         
GetPlayerPos(playeridxyz); // On rйcupиre la position du joueur qui a tapй la commande
         
SetPlayerPos(pxyz); // On tp tous les joueurs aux positions du joueur qui a tapй la commande
         
SendClientMessageToAll(0xFF0000FF"Tout le monde a йtй tйlйportй а un joueur !"); // On envoie un message
       
}
     }
     return 
1;

Voilа !
Mais la fonction peut кtre optimisйe...
En effet, on peut mettre x, y et z en paramиtres.
Ce qui йviterait de taper new machin machin, qui йconomiserait donc une ligne !

le nouveau header ferait donc

PHP Code:
TpAll(playeridFloat:xFloat:yFloat:z
Et on aurait plus а mettre

PHP Code:
new Float:xFloat:yFloat:z
On va passer а une fonction un peu plus utile, SendErrorMessage.
C'est une fonction que j'utilise souvent (ke g ft tou seul kom 1 gran) pour envoyer des messages d'erreurs sans la mise en forme assez chiante.

Je vous la donne et on va la dйcortiquer.

PHP Code:
SendErrorMessage(idjoueurcouleurmessage[])
{
    new 
ttexte[1024];
    
format(ttexte1024"{FF0000}[Erreur]{FFFFFF} %s"message);
    
SendClientMessage(idjoueurcouleurttexte);

idjoueur, c'est l'йquivalent de playerid pour la fonction (car si on sait bien les placer, on peut appeler les paramиtres comme on veut)
couleur, c'est la couleur du texte, et message c'est ce qu'on veut envoyer aprиs "Erreur".
Ce qui nous fait une magnifique fonction car trиs facile et simple d'utilisation.

Un exemple de l'utilisation de la fonction

PHP Code:
SendErrorMessage(playerid, -1"Tu es trop loin de ta maison !"); 
NB : La couleur -1 signifie non mise en forme, ce qui envoit un message de couleur blanche. C'est l'йquivalent du code couleur FFFFFF.


Allez, pour terminer le tutoriel, on passe а la mйga big fonction compliquйe dont je vous ait parlй tout а l'heure.
Cette fonction sera vraiment useless dans la majoritй des cas.

Ca explose le joueur si il est dans un vйhicule et зa donne la possibilitй d'envoyer un message custom.
De plus, si le joueur est en NRG, l'explosion mettra 5 secondes а arriver au lieu d'immйdiatement.


PHP Code:

forward ExploseNRG
(vehicleidFloat:xFloat:yFloat:z);
public 
ExploseNRG(vehicleidFloat:xFloat:yFloat:z)
{
    
CreateExplosion(xyz210.0);
    
SetVehicleHealth(vehicleid0.0);
    return 
1;
}
ExploseJoueurVeh(playeridvehicleidFloat:posxFloat:posyFloat:posz, const message[])
{
   if(
IsPlayerInAnyVehicle(playerid))
   {
       if(
GetVehicleModel(vehicleid) == 522) return SetTimerEx("ExploseNRG"5000false"dfff"vehicleidx,yz);
       
GetVehiclePos(vehicleidxyz);
       
CreateExplosion(xyz210.0);
       
SetVehicleHealth(vehicleid0.0);
       
SendClientMessage(playerid, -1message);
return 
1;

Voilааа.

On voit bien que la premiиre fonction est publique, car elle est appelйe par un timer.
Chaque fonction appelйe par un timer doit кtre publique, ce qui signifie qu'elle a besoin d'un forward, contenant les mкmes paramиtres que le header de la fonction. Il se termine par un ;
Le forward de la fonction SendErrorMessage, si il y en avait besoin, aurait йtй

PHP Code:
forward SendErrorMessage(idjoueurcouleurmessage[]); 
Voilа, j'espиre que vous en savez plus sur les fonctions qu'au dйpart, sinon зa veut dire que vous n'кtes pazun dйbutant.
Bonne soirйe.

PS : J'ai pas l'habitude d'utiliser les tableaux pour les positions, j'ai appris en crйant les flottantes x, y et z, et je continuerais comme зa. Faоtes comme bon vous semble mais me le rappeler а chaque fois que je poste un bout de code me paraоt inutile. Alors si tu prйvoyais de faire зa, commence а effacer ton commentaire. Bitch.
Reply
#2

Ah merci , trиs bon tutoriel !
Reply
#3

Pas mal GG
Reply
#4

Nice
Reply
#5

Merci а vous tous (je dors beaucoup)
Reply
#6

J'ai lu en diagonale mais j'ai dйjа repйrй une erreur
Le terme "Header" se traduits par "En tкte" et dans ce contexte, on parle plus prйcisйment de l'en-tкte d'une fonction. Les anglicismes c'est cool seulement quand c'est utile
Reply
#7

Bien, merci
1 point de gagnй (la rйputation, hein pas les cornignons /D)
Reply
#8

J'ai appris ce terme en html et quand j'modifie une callback sans faire exprиs dans pawno ("Function header is different from prototype")

Mais merci а toi de faire la remarque jujuv.

Merci а toi aussi iDroid.
Reply
#9

Salut

Bien le tuto

Par contre ta NRG explosera jamais x)
Reply
#10

@S4t3k: C'est parce-que l'utilisation de cette anglicisme est courant. Beaucoup de gens emploient cet abus de langage mais quand on est perfectionniste, on essaye de limiter les abus de langage
Et dans le message d'erreur, c'est normal puisqu'il est anglais - Espиce de patate
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)