Bevezetõ
Hello!Azért írom ezt a leírást,mert páran már kértek ilyen témában segítséget MSN-en,így könyebb lesz ezt belinkelni. :)
A kód indentáció barát,mivel nem a fordítóban írtam,szóval elõfordulhatnak kisebb hibák is.
A színeket ne felejtsük el lecserélni.
Elmélet
Elõször is szükségünk lesz 3 darab változóra.Az egyik a timer ID-t fogja jelölni,a másik meg az aktuális reklámot,a harmadik meg egy tömb lesz,amiben a reklámokat helyezzük el. Meg természetesen egy prototípus is kell,az idõzítõé.
A színeket ne felejtsük el lecserélni!
Indítanunk kell egy idõzítõt (timert) ami ki fogja írni a reklámokat.
Irassuk ki a megfelelõ szöveget.
Az idõzítõt a script végén le kell állítanunk.
Gyakorlat
Készítsük el a változóinkat.A \' c \' betû az egomat jelöli.
forward cReklamozas(); //Az idõzítõ prototípusa
new cTimer; //Ez lesz a timer ID-je
new cReklamStatus = -1; //Ez az aktuális reklám ID-je
new cReklam[][] =
{
\"Pulyka nem Tyúk húsleves csak 40 000 Ft. a LIDL-ben!\",
\"Akciós FA termékeink: Rozsdamentes acél házikó,most csak 200 000 000 000 000 Ft!\",
\"Csodálatos STRAND helyek kiadók!Érdeklõdnia CÁPA VESZÉLY-t jelzõ tábla mellet a bódéban!\"
}
Figyeljük meg,hogy a felsorolás utolsó szövegének végére nem kell , (vesszõ)
Ezután,Indítsuk el a Timert.
FilterScript:
public OnFilterScriptInit()
{
cTimer = SetTimer(\"cReklamozas\",60*1000,true); //Az idõzítõ 60*1 másodpercenként fut le,azaz 1 percenként.
return 1;
}
GameMode:
public OnGameModeInit()
{
SetTimer(\"cReklamozas\",60*1000,true); //Az idõzítõ 60*1 másodpercenként fut le,azaz 1 percenként.
return 1;
}
Hozzuk létre magát az idõzítõt:
public cReklamozas()
{
if(cReklamStatus >= sizeof(cReklam) - 1)
cReklamStatus = 0;
else cReklamStatus++;
return SendClientMessageToAll(0,cReklam[cReklamStatus]);
}
Végül,ha a kód futatása véget ér,le kell lõnünk az idõzítõt:
public OnFilterScriptExit()
{
KillTimer(cTimer);
return 1;
}
Kész is
#include <a_samp>
forward cReklamozas(); //Az idõzítõ prototípusa
new cTimer; //Ez lesz a timer ID-je
new cReklamStatus = -1; //Ez az aktuális reklám ID-je
new cReklam[][] =
{
\"Pulyka nem Tyúk húsleves csak 40 000 Ft. a LIDL-ben!\",
\"Akciós FA termékeink: Rozsdamentes acél házikó,most csak 200 000 000 000 000 Ft!\",
\"Csodálatos STRAND helyek kiadók!Érdeklõdnia CÁPA VESZÉLY-t jelzõ tábla mellet a bódéban!\"
};
public OnFilterScriptInit()
{
cTimer = SetTimer(\"cReklamozas\",60*1000,true); //Az idõzítõ 60*1 másodpercenként fut le,azaz 1 percenként.
return 1;
}
public cReklamozas()
{
if(cReklamStatus >= sizeof(cReklam) - 1)
cReklamStatus = 0;
else cReklamStatus++;
return SendClientMessageToAll(0,cReklam[cReklamStatus]);
}
public OnFilterScriptExit()
{
KillTimer(cTimer);
return 1;
}
Végül
Ennyi,a leírás csakis elméleti,mivel nem teszteltem le a gyakorlatban, nem tudom mûködik-e.(Fórumban írtam)
Hozzáadhatunk vagy elvehetünk híreket,semmi mást nem kell módosítani,viszont az utolsó hír után nem kell vesszõ,a többi után igen.
Ennyi,a leírás csakis elméleti,mivel nem teszteltem le a gyakorlatban, nem tudom mûködik-e.(Fórumban írtam)
Hozzáadhatunk vagy elvehetünk híreket,semmi mást nem kell módosítani,viszont az utolsó hír után nem kell vesszõ,a többi után igen.
Építõ jellegû kritika következik:
A leírás szép és jó de ha van annyi idõd hogy elkészíts egy ilyen leírást akkor legalább mûködõképes formában tennéd.
Nekem volt pár percem letesztelni és már elsõ ránézésre is a léptetés funkció hibás.
Ugye 3 darab hirdetés van aminek az indexe 0, 1, és 2.
A sizeof érték darabszámot ad vissza ami 3 ebben az esetben.
new cReklam[][] =
{
\"Pulyka nem Tyúk húsleves csak 40 000 Ft. a LIDL-ben!\", // index: 0
\"Akciós FA termékeink: Rozsdamentes acél házikó,most csak 200 000 000 000 000 Ft!\", // index: 1
\"Csodálatos STRAND helyek kiadók!Érdeklõdnia CÁPA VESZÉLY-t jelzõ tábla mellet a bódéban!\" // index: 2
};
printf(\"sizeof érték: %d\", sizeof(cReklam));
// eredmény: sizeof érték: 3
És most jön a léptetésre írt kód:
Ugye csak 0 1 2 indexen szerepel hirdetés tehát már eleve 2-nél nagyobb értéke nem lehet az indexként használt \"cReklamStatus\" változónak.
if(cReklamStatus > sizeof(cReklam)) // index nagyobb-e mint 3
Itt viszont azt vizsgálod hogy az indexként használt cReklamStatus értéke nagyobb-e mint 3 (ugye sizeof érték), de 3 se lehet, 3 darab hirdetés esetében, mert az indexelés 0-val kezdõdik.
Persze azt gondolná az ember hogy akkor egyszerû a megoldás.
Nem 3 ra kell vizsgálni hanem egyel kisebbre hogy ne legyen 2-nél nagyobb
if(cReklamStatus > sizeof(cReklam) - 1) // index nagyobb-e mint 2
De te tovább nézve a dolgot így oldottad meg:
if(cReklamStatus > sizeof(cReklam) - 1)
cReklamStatus = 0;
else cReklamStatus++;
Most akkor azt gondolnánk helyesen tettük hogy azt vizsgáljuk nagyobb-e mint 2 az indexünk \"cReklamStatus\"
Mivan akkor ha az indexünk értéke 2?
Persze 2 nem nagyobb mint 2, így jön az else utáni rész, amivel máris megnöveltük az értékét 3-ra, amit szeretnénk elkerülni.
Szerintem elég lesz ennyi ha elolvasom lehet én se értem amit leírtam, kijavítottam a funkciót íme:
public cReklamozas()
{
if(cReklamStatus >= sizeof(cReklam) - 1)
cReklamStatus = 0;
else cReklamStatus++;
return SendClientMessageToAll(0,cReklam[cReklamStatus]);
}
Szándékosan nem írtam át másmilyen logikai menetre, maradjon az általad elképzelt folyamat.
Viszont a reklám szövegeken jót nevettem. :D
Adol neki más szín pl: ~g~ ez zöld mert angolul green vagyis így lesz:
new cReklam[][] =
{
\"~g~Pulyka nem Tyúk húsleves csak 40 000 Ft. a LIDL-ben!\", // index: 0
\"~g~Akciós FA termékeink: Rozsdamentes acél házikó,most csak 200 000 000 000 000 Ft!\", // index: 1
\"~g~Csodálatos STRAND helyek kiadók!Érdeklõdnia CÁPA VESZÉLY-t jelzõ tábla mellet a bódéban!\" // index: 2
};