Cateva lucruri ce va pot economisi timpul de lucru cat si optimizarea modului de joc, unele din ele sunt deja postate pe forumul oficial SA:MP insa nu toti le folosesc sau nu le cunosc.
Multiple actiuni intr-o declaratie:
sendInfo(playerid) {
new a = 4, mStr[20];
format(mStr, sizeof(mStr), "Var a = %i", a), SendClientMessage(playerid, -1, mStr);
}
* odata ce stim marimea string-ului o putem scrie direct, fara sa mai apelam la sizeof
Operatorul ternary
Folosind acest operator poti economisi timp si spatiu, structura: conditie ? adevarat : fals
new a = 5, b = 4, c;
if(a > b)
c = a;
else
c = b;
// operatorul ternar
c = (a > b) ? a : b;
// ca parametru actual
printf("c = %i", (a > b) ? a : b);
Atribuim valori variabilelor ce sunt folosite ca parametri actuali
O alta metoda ce te ajuta sa economisi timp/spatiu dar si sa ai un cod mai aranjat
new a;
// acest cod
printf("%i", a = 5);
// sau acest cod
a = 5, printf("%i", a);
// fac acelasi lucru
Atribuirea mai multor variabile aceeasi valoare
Daca ai 2 sau mai multe variabile si vrei sa le setezi aceeasi valoare (de exemplu 1), nu e nevoie de le egalezi pe fiecare in parte cu 1;
new a, b, c;
a = b = c = 1;
// in loc de:
a = 1, b = 1, c = 1;
Creaza variabilele la timpul lor
Nu va grabiti sa creati variabilele, mai jos va voi da un exemplu si va voi spune de ce:
Am creata variabila para prea devreme, inca nu aveam nevoie de ea. In caz ca jucatorul nu corespunde cerintelor din primul if, variabila nu va fi folosita mai departe, deci a fost creata aiurea.
Functii
public - nu toate functie necesita sa aiba cuvantul public in fata (doar in cazul in care e apelata de un timer, CallLocalFunction, CallRemoteFunction, de un query). Callback-urile ce ne le ofera SA:MP-ul necesita folosirea sa.
stock - nu este un tip diferit de functie fata de cele publice, cum cred multi. E un modificator ce ii spune compilerului sa nu trimita warning-uri in cazul in care o functie sau o variabila este creata insa nu e folosita:
Unii din voi probabil folosesc aiurea acest modificator, e posibil sa aveti functii pe care nu le folositi si nu le veti folosi niciodata si totusi nu sunteti anuntati de compiler.
Conditiile in loop
Conditiile din header-ul unei bucle (loop) sunt foarte importante, la mai multe iteratii se va simti diferenta dintre o conditie scrisa gresit si una scrisa corect, insa va dati seama daca aveti mai multe bucle scrise aiurea apelate de mai multi playeri odata? Sigur se va simti.
for(new i; i < GetPlayerPoolSize(); i++ ) {
// ceva
}
* GetPlayerPoolSize se va efectua la fiecare iteratie, la un numar mare de iteratii se observa diferenta.
for(new i, j = GetPlayerPoolSize(); i < j; i++ ) {
// ceva
}
* GetPlayerPoolSize se va efectua doar la prima iteratie.
Creearea variabilelor intr-un loop
for(new i; i < GetPlayerPoolSize(); i++ ) {
new count;
if(IsPlayerAdmin(i))
count++;
}
Nu e corect sa initializam o variabila in interiorul unui loop, ea va primi mereu valoarea 0 iar incrementarea de mai jos va fi degeaba, deoarece valoarea acestei variabile se va reseta la urmatoarea iteratie, varianta corecta:
for(new i, count; i < GetPlayerPoolSize(); i++ ) {
if(IsPlayerAdmin(i))
count++;
}
Cum aflam linia unde a fost apelata o functie
Ca exemplu vom folosi functia CreateVehicle. Sa zicem ca aveti un timer ce creaza o masina intr-o anumita locatia insa voi nu stiti care din el e, putem afla foarte usor linia unde este apelata functia CreateVehicle folosind directivele pre-processor pentru a crea un macro:
#define debug_CreateVehicle(%0, %1, %2, %3, %4, %5, %6, %7) printf("** debug_CreateVehicle called on line %d", __line), CreateVehicle(%0, %1, %2, %3, %4, %5, %6, %7)
Cand functia CreateVehicle va fi apelata se va afisa mesajul respectiv in consola.
(!) Pe parcurs voi mai adauga cateva informatii.