Mivel látom hogy elég kevesen alkalmazzák ezen dolgokat sa-mp szkriptelés terén ezért megpróbálok pár példát írni alkalmazásukra természetesen ahogy sikerül valami újabb hasznos gyakorlati alkalmazást kitalálnom vagy találnom, frissíteni fogom ezen leírásszerûséget.
Itt nem fogok kitérni a bitmûveletek mûködésre arra ott van Anthony által írt leírás:
Bitmûveletek, valamint gyakorlati alkalmazás a SA:MP-banAz egyik segítség kérés témában felmerült problémára való megoldásként jött az ötlet, mivel ott említettem hogy egyszerûbb lenne bitmûveletekkel megvalósítani a dolgot miszerint szeretnénk egy játékosnak egyszerre több munkát is engedélyezni, úgy hogy minél kevesebb memóriát használunk fel, természetesen egyszerûen törölni akár az összes meglévõ munkát.
Ennyit az elõzményrõl.
A kiegészítõ szövegek után szereplõ bináris értékek a bitmûveletek után történt változás eredményét szemléltetik! enum
(<<= 1)
{
MUNKA_NONE, // 0b00000000000000000000000000000000
MUNKA_1 = 1, // 0b00000000000000000000000000000001
MUNKA_2, // 0b00000000000000000000000000000010
MUNKA_3, // 0b00000000000000000000000000000100
MUNKA_4, // 0b00000000000000000000000000001000
MUNKA_5, // 0b00000000000000000000000000010000
MUNKA_6, // 0b00000000000000000000000000100000
MUNKA_7, // 0b00000000000000000000000001000000
MUNKA_8, // 0b00000000000000000000000010000000
MUNKA_9, // 0b00000000000000000000000100000000
MUNKA_10, // 0b00000000000000000000001000000000
MUNKA_11, // 0b00000000000000000000010000000000
MUNKA_12, // 0b00000000000000000000100000000000
MUNKA_13, // 0b00000000000000000001000000000000
MUNKA_14, // 0b00000000000000000010000000000000
MUNKA_15, // 0b00000000000000000100000000000000
MUNKA_16, // 0b00000000000000001000000000000000
MUNKA_17, // 0b00000000000000010000000000000000
MUNKA_18, // 0b00000000000000100000000000000000
MUNKA_19, // 0b00000000000001000000000000000000
MUNKA_20, // 0b00000000000010000000000000000000
MUNKA_21, // 0b00000000000100000000000000000000
MUNKA_22, // 0b00000000001000000000000000000000
MUNKA_23, // 0b00000000010000000000000000000000
MUNKA_24, // 0b00000000100000000000000000000000
MUNKA_25, // 0b00000001000000000000000000000000
MUNKA_26, // 0b00000010000000000000000000000000
MUNKA_27, // 0b00000100000000000000000000000000
MUNKA_28, // 0b00001000000000000000000000000000
MUNKA_29, // 0b00010000000000000000000000000000
MUNKA_30, // 0b00100000000000000000000000000000
MUNKA_31, // 0b01000000000000000000000000000000
MUNKA_32 // 0b10000000000000000000000000000000
}
Megjegyzés: Nem véletlenül szerepel a MUNKA_32 mivel ennyi a maximálisan állítható bit érték egy változóba 32 bit esetén.
Több munka egyszerre történõ megadása: Job[playerid] |= MUNKA_2; // Ez az érték megadása a következõ sor szemléltetése végett szerepel. // 0b00000000000000000000000000000010
Job[playerid] = MUNKA_1 | MUNKA_4 | MUNKA_3; // Ez a megoldás töröl minden korábban beállított munkát!! // // 0b00000000000000000000000000001101
Munkák egyesével történõ hozzáadása:
Job[playerid] |= MUNKA_5; // 0b00000000000000000000000000011101
Job[playerid] |= MUNKA_10; // 0b00000000000000000000001000011101
Job[playerid] |= MUNKA_15; // 0b00000000000000000100001000011101
Job[playerid] |= MUNKA_20; // 0b00000000000010000100001000011101
Job[playerid] |= MUNKA_25; // 0b00000001000010000100001000011101
Job[playerid] |= MUNKA_30; // 0b00100001000010000100001000011101
Job[playerid] |= MUNKA_32; // 0b10100001000010000100001000011101
Egy munka törlése: Job[playerid] &= ~MUNKA_5; // 0b10100001000010000100001000001101
Egy munka törlése ha aktív, vagy aktiválása ha nincs beállítva: Job[playerid] ^= MUNKA_20; // Ez esetben törlés mivel már aktiválva van. // 0b10100001000000000100001000001101
Job[playerid] ^= MUNKA_21; // Ez esetben aktiválás mivel nincs hozzáadva. // 0b10100001000100000100001000001101
Több munka egyszerre történõ megadása régi értékek megtartása mellett: Job[playerid] |= MUNKA_11 | MUNKA_31 | MUNKA_22; // 0b11100001001100000100011000001101 <--Ez az érték kerül egy kis ellenõrzésre a példában. (printf(\"%d - %d -> %b\")
Az elvállalt munka lehetõség kilistázása for ciklussal: static const
M_name[][] =
{
\"MUNKA_1\", \"MUNKA_2\", \"MUNKA_3\", \"MUNKA_4\", \"MUNKA_5\", \"MUNKA_6\", \"MUNKA_7\", \"MUNKA_8\", \"MUNKA_9\", \"MUNKA_10\",
\"MUNKA_11\", \"MUNKA_12\", \"MUNKA_13\", \"MUNKA_14\", \"MUNKA_15\", \"MUNKA_16\", \"MUNKA_17\", \"MUNKA_18\", \"MUNKA_19\", \"MUNKA_20\",
\"MUNKA_21\", \"MUNKA_22\", \"MUNKA_23\", \"MUNKA_24\", \"MUNKA_25\", \"MUNKA_26\", \"MUNKA_27\", \"MUNKA_28\", \"MUNKA_29\", \"MUNKA_30\", \"MUNKA_31\", \"MUNKA_32\"
};
for(new i; i < cellbits; i++)
{
if(Job[playerid] & (1 << i)) printf(\"Vállalt: %s\", M_name);
}
A beállított munkák számlálása: stock
bitcount(num) // Ezt természetesen valahova máshova kell másolni a módban, szkriptben.
{
new
count = 0 ;
while(num)
{
num &= (num - 1) ;
printf(\"--- %b\", num);
count++;
}
return count ;
}
printf(\"%d elvállalt munkád van.\", bitcount(Job[playerid]));
Ellenõrzés hogy melyik munkát vállalta a játékos: if(Job[playerid] == MUNKA_NONE) printf(\"Nincs egy munka sem: MUNKA_NONE\");
if(Job[playerid] & MUNKA_1) printf(\"Vállalt munka: MUNKA_1\");
if(Job[playerid] & MUNKA_2) printf(\"Vállalt munka: MUNKA_2\");
if(Job[playerid] & MUNKA_3) printf(\"Vállalt munka: MUNKA_3\");
if(Job[playerid] & MUNKA_4) printf(\"Vállalt munka: MUNKA_4\");
if(Job[playerid] & MUNKA_5) printf(\"Vállalt munka: MUNKA_5\");
if(Job[playerid] & MUNKA_6) printf(\"Vállalt munka: MUNKA_6\");
if(Job[playerid] & MUNKA_7) printf(\"Vállalt munka: MUNKA_7\");
if(Job[playerid] & MUNKA_8) printf(\"Vállalt munka: MUNKA_8\");
if(Job[playerid] & MUNKA_9) printf(\"Vállalt munka: MUNKA_9\");
if(Job[playerid] & MUNKA_10) printf(\"Vállalt munka: MUNKA_10\");
if(Job[playerid] & MUNKA_11) printf(\"Vállalt munka: MUNKA_11\");
if(Job[playerid] & MUNKA_12) printf(\"Vállalt munka: MUNKA_12\");
if(Job[playerid] & MUNKA_13) printf(\"Vállalt munka: MUNKA_13\");
if(Job[playerid] & MUNKA_14) printf(\"Vállalt munka: MUNKA_14\");
if(Job[playerid] & MUNKA_15) printf(\"Vállalt munka: MUNKA_15\");
if(Job[playerid] & MUNKA_16) printf(\"Vállalt munka: MUNKA_16\");
if(Job[playerid] & MUNKA_17) printf(\"Vállalt munka: MUNKA_17\");
if(Job[playerid] & MUNKA_18) printf(\"Vállalt munka: MUNKA_18\");
if(Job[playerid] & MUNKA_19) printf(\"Vállalt munka: MUNKA_19\");
if(Job[playerid] & MUNKA_20) printf(\"Vállalt munka: MUNKA_20\");
if(Job[playerid] & MUNKA_21) printf(\"Vállalt munka: MUNKA_21\");
if(Job[playerid] & MUNKA_22) printf(\"Vállalt munka: MUNKA_22\");
if(Job[playerid] & MUNKA_23) printf(\"Vállalt munka: MUNKA_23\");
if(Job[playerid] & MUNKA_24) printf(\"Vállalt munka: MUNKA_24\");
if(Job[playerid] & MUNKA_25) printf(\"Vállalt munka: MUNKA_25\");
if(Job[playerid] & MUNKA_26) printf(\"Vállalt munka: MUNKA_26\");
if(Job[playerid] & MUNKA_27) printf(\"Vállalt munka: MUNKA_27\");
if(Job[playerid] & MUNKA_28) printf(\"Vállalt munka: MUNKA_28\");
if(Job[playerid] & MUNKA_29) printf(\"Vállalt munka: MUNKA_29\");
if(Job[playerid] & MUNKA_30) printf(\"Vállalt munka: MUNKA_30\");
if(Job[playerid] & MUNKA_31) printf(\"Vállalt munka: MUNKA_31\");
if(Job[playerid] & MUNKA_32) printf(\"Vállalt munka: MUNKA_32\");
Összes munka törlése. Pl.: OnPlayerConnect-hez printf(\"%d - %d -> %b\", 0b11100001001100000100011000001101, Job[playerid], Job[playerid]); // Egy kis ellenõrzés tényleg jók-e a bitmûveletek.
Job[playerid] = MUNKA_NONE; // 0b00000000000000000000000000000000
Példa szkript gyors tesztelésre:
« Utoljára szerkesztve: 2013. július 18. - 08:25:15 írta ɐʞzssǝlosz »
Naplózva