Explicatii, Code Style, Trucuri & Scripting eficient  2z8bv910
Explicatii, Code Style, Trucuri & Scripting eficient  2z8bv910



 
AcasaCăutareUltimele imaginiÎnregistrareConectare

Distribuiţi|

Explicatii, Code Style, Trucuri & Scripting eficient

Vezi subiectul anterior Vezi subiectul urmator In jos
AutorMesaj
Punct.
Explicatii, Code Style, Trucuri & Scripting eficient  Icon_user_offline

Punct.

Fondator
Rank: Fondator
Sex Sex : masculin
Zodiac Zodiac : Fecioara
Mesaje Mesaje : 554
Data nasterii Data nasterii : 30/08/1996
Data de inscriere Data de inscriere : 14/07/2012
Varsta Varsta : 28
Localizare Localizare : Pitesti
Stare de spirit Stare de spirit : buna ;)
Explicatii, Code Style, Trucuri & Scripting eficient  Empty
MesajSubiect: Explicatii, Code Style, Trucuri & Scripting eficient Explicatii, Code Style, Trucuri & Scripting eficient  Icon_minitimeVin Oct 12, 2012 6:20 am


#1 Native, cod eficient:

Prima data cand ne apucam sa scriem un cod, nu il facem dupa ureche. Adica daca am vazut nu stiu ce facut de Popescu si merge nu inseamna ca e si bun.
In primu rand trebuie sa ne gandim la o modalitate incat sa avem cat mai putine native apelate si mai ales un cod placut ochilor. Cu cat avem mai putine native/functii apelate cu atat codul este mai rapid si mai bun.
De exemplu: o comanda /engine oarecare dupa net:

Cod:
new engine[MAX_VEHICLES];
CMD:engine(playerid, params[])
{
new vehicleid = GetPlayerVehicleID(playerid);
new string[126];
new name[32];

if(IsPlayerInVehicle(playerid, vehicleid))
{
if(engine[vehicleid] != 1)
{
engine[vehicleid] = 1;
GetPlayerName(playerid, name, sizeof(name));
GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
SetVehicleParamsEx(vehicleid,1,lights,alarm,doors,bonnet,boot,objective);
format(string, sizeof(string), "* %s turns the engine on.", name);
ProxDetector(20.0, playerid, string, COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE);
return 1;
}
else
{
engine[vehicleid] = 0;
GetPlayerName(playerid, name, sizeof(name));
GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
SetVehicleParamsEx(vehicleid,0,lights,alarm,doors,bonnet,boot,objective);
format(string, sizeof(string), "* %s turns the engine off.", name);
ProxDetector(20.0, playerid, string, COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE);
return 1;
}
}
return 1;
}


Acest cod are 8 native pe care le apeleaza la fiecare tastare a comenzii:
Cod:
1. GetPlayerVehicleID
2. IsPlayerInVehicle
3. GetPlayerName
4. GetVehicleParamsEx
5. SetVehicleParamsEx
7. format
8. ProxDetector



Multe native de care nu avem nevoie pot fi reduse si codul mai placut ochiilor.
Exemplu:
Cod:
new g_bEngine[MAX_VEHICLES+1];
COMMAND:engine(playerid, params[])
{
new vehicleid = GetPlayerVehicleID(playerid);
if(vehicleid != INVALID_VEHICLE_ID)
{
new string[64];
g_bEngine[vehicleid] = (!g_bEngine[vehicleid]);
SetVehicleParamsEx(vehicleid, g_bEngine[vehicleid], -1, -1, -1, -1, -1, -1);
GetPlayerName(playerid, string, sizeof(string));
format(string, sizeof(string), g_bEngine[vehicleid] ? ("* %s turns the engine on.") : ( "* %s turns the engine off."), string);
ProxDetector(20.0, playerid, string, COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE);
}
return 1;
}


Acest cod face exact acelasi lucru ca cel de mai sus doar ca o face mai bine. Avand in vedere ca acum avem 5 native in loc de 8 si e mai placut vizual.

Evitati sa folositi multe new-uri gen:
Cod:

new a;
new b;
new c;


Puteti face simplu:
Cod:
new a, b, c;


Cand compilam un script, codul nostru nu ramane asa cum il stim. Compilatorul incearca sa ramifice codul. Dar cel mai bine este sa evitam o multime de ramificari.

Foarte multi fac coduri de genul:

Cod:
if (GetPlayerTeam(playerid) == 1)
{
//etc
}
else if (GetPlayerTeam(playerid) == 2)
{
//etc
}
else if (GetPlayerTeam(playerid) == 2)
{
//etc
}



Compilatorul va genera un cod de genul
Cod:
APELARE GetPlayerTeam
COMPARARE+RAMIFICARE
APELARE GetPlayerTeam
COMPARARE+RAMIFICARE
APELARE GetPlayerTeam
COMPARARE+RAMIFICARE


Dupa cum se poate vedea avem 3 native apelate (GetPlayerTeam x3). Acest cod poate fi optimizat prin 2 metode

1. Creem o variabila in care salvam echipa jucatorulu insemnand ca nativul va fi apelat o singura data:
Cod:
new team = GetPlayerTeam(playerid)
if (team == 1)
{
//etc
}
else if (team == 2)
{
//etc
}
else if (team == 2)
{
//etc
}


Cod:
APELARE GetPlayerTeam
COMPARARE+RAMIFICARE
COMPARARE+RAMIFICARE
COMPARARE+RAMIFICARE


2. Folosind switch() in locul lui if (Recomand)

Cod:
switch(GetPlayerTeam(playerid))
{
case 1: //etc
case 2: //etc
case 3: //etc
}


#3 Functii si variabile:

Pot exista 3 tipuri de functii:

public
stock
privat

Care este diferenta intre ele?

public

Un public poate fi apelat din afara scriptului (CallRemoteFunction) sau apelat de un timer.

Cod:
forward TimerShit();
public TimerShit()
{
// code
}



stock

Un stock este ignorat de compilator daca nu este folosit. Acesta este recomandat sa fie folosit pentru include.

Cod:
stock SetPlayerSpeed(playerid)
{
// code
}


privat

Un privat este o functie care poate fi apelata numai din codul propriu‑zis. Aceasta este recomandata sa fie folosita cand vreti sa faceti functii customizate care nu sunt apelate din afara sau de un timer

Cod:
SetPlayerSpeed(playerid)
{
// code
}


Nu folositi public cand vreti sa faceti o functie customizata gen SetPlayerSpeed de mai sus. Pentru ca public necesita facut si forward ce a ce nu are rost.

De asemenea putem creea si variabile folosit stock public sau privat

public g_IsCop[MAX_PLAYERS]; Lafel poate fi apelat din afara.
stock g_IsCop[MAX_PLAYERS]; Ignorat de compilator daca nu este folosit.
new g_IsCop[MAX_PLAYERS]; Acesta este un privat folosit doar in scriptul respectiv.


#4 global vs static:

Cred ca ati observat unii scripteri folosesc statementul static. Ce este un static?
Este o varibila ca si un new/public/stock doar ca aceasta se comporta ca si o globala si isi pastreaza ultima valoare.

Exemplu:

Cod:
for(new i; i < 5; i++)
{
static a;
new b;
printf("a: %d, b: %d ", a ,b);
a++;
b++;
}



Si ne va rezulta asa;
Cod:

a: 0, b: 0
a: 1, b: 0
a: 2, b: 0
a: 3, b: 0
a: 4, b: 0


Acesta metoda este echivalenta cu aceasta:

Cod:
new g_a;
for(new i; i < 5; i++)
{
new b;
printf("a: %d, b: %d ", g_a ,b);
g_a++;
b++;
}


#5 Condition operators:

Dupa cum ati observat in exemplul de mai sus cu /engine la format am folosit 2 operatori speciali adica ? si :

Ce fac acestia doi? Pai pe langa ca ne scurteaza codul da si un aspect mai placut. Fara ei puteam face astfel.
Cod:
if(g_bEngine[vehicleid])
format(string, sizeof(string), "* %s turns the engine on.", string);
else
format(string, sizeof(string), "* %s turns the engine off.", string);


Dar eu am facut astfel:

Cod:
format(string, sizeof(string), g_bEngine[vehicleid] ? ("* %s turns the engine on.") : ( "* %s turns the engine off."), string);


#5 Tags:

Ce sunt tagurile? Tagurile sunt un fel de simboluri care ajuta compilatorul sa inteleaga o anumata variabila ce este.

Exemplu:

new a; => o variabila de tip int/cell
new Float:b => o variabila de tip float
new bool:c => o variabila de tip bool

In SA-MP exista mult mai multe taguri decat in pawnul normal. Gen Text:, PlayerText: etc.

Cum scoatem tagul unei variabila?

Pentru a scoate tagul unei variabile ii adaugam un fata _: exemplu cum era b. Ca sa ii scot tagul: _:b.
Exemplu in cod:
Cod:
a = b


Cand vom compila ne va da un warning tag mismatch. Ce e de facut sa nu ne mai dea warning? Ii scoatem tagul lui b:

Cod:
a = _:b


#5 goto statement:

Dupa cum bine stiti fiecare functie din cod este apelata una dupa alta. Cu ajutorul statementului goto ne putem intoare inapoi sau sarii penste un cod dupa bunul plac.

Exemple in cod:

Cod:
functie()
{
mesaj1:
print("acest mesaj va fi intodeauna afisat odata");
goto mesaj1
print("acest mesaj nu va fi ajisat nici odata");
}


#5 Tricks:

Acesta este un mic truc prin care putem scurta codul.
Cod:
functie(a)
{
if(a == 1 || a == 2 || a == 3)
{
print("a este 1 sau 2 sau 3");
if(a == 1) print("a este 1");
}
}


Acest cod devine:

Cod:
functie(a)
{
if((a == 1 && print("a este 1")) || a == 2 || a == 3)
print("a este 1 sau 2 sau 3");
}


Bine inteles de data asta mesajul cu "a este 1" va fi apelat mai repede decat celalart mesaj
Sus In jos

Explicatii, Code Style, Trucuri & Scripting eficient

Vezi subiectul anterior Vezi subiectul urmator Sus
Pagina 1 din 1

Permisiunile acestui forum:Nu puteti raspunde la subiectele acestui forum
 :: [Extream-Gaming] - SAMP :: San Andreas Multiplayer :: Tutoriale-
Social Media Buttons
Social Media Buttons
Social Media Buttons