Szerző Téma: [ Leírás ]Idõzítõ | Timer  (Megtekintve 8354 alkalommal)

Nem elérhető ZeRo

  • 4620
  • Ex Globális Moderátor
    • Profil megtekintése
[ Leírás ]Idõzítõ | Timer
« Dátum: 2010. augusztus 24. - 13:06:34 »
+3 Show voters
Idõzítõk
 
Mik azok az idõzítõk?
Az idõzítõk( avagy timer-ek ) olyan egységei a programnak, amiknek segítségével lehetõségünk van függvényeket meghívni tetszõleges idõ múlva, vagy ezeket ismételni opcionális idõközönként. Kezelésük nagyon egyszerû, és ugyanakkor nagyon fontos részei a kódunknak, biztosra veszem, hogy mindenki hasznlálja is õket. Nézzük meg õket részletesebben.
Mûködése
Az idõzítõk kezelésére 3 függvény áll a rendelkezésünkre, ami bõven elegendõ a feladataink ütemezéséhez. Most mindegyiken végigmegyünk részletesen.
A \'SetTimer\' függvény
A SetTimer függvény segítségével indíthatunk el idõzítõket.
Paraméterei:
 

  •      


  • funcname[  ]: Sztring típusú paraméter, a meghívni kívánt függvény nevét kell megadnunk.
         


  • interval: Integer( egész szám ) típusú paraméter, a meghívás és a lefutás közti idõt jelöli milimásodpercben(!).
         


  • repeating: Ugyan integer típusú paraméter ez is, de csak két érték a fontos; Ha 0( false ), akkor nem ismétlõdik, ha 1( true ), akkor ismétlõdni fog( amíg le nem állítjuk ).


Nézzünk pár példát! Elsõnek csinálunk egy idõzítõt, ami 5 másodpercenként ír egy x betût a konzolba.
 

#include < a_samp >
//Prototípus létrehozása
public myFunc(  );
public OnFilterScriptInit(  ) {
//Idõzítõ inicializálása
SetTimer( \"myFunc\", 5000, true );
return 1;
}
//A \'myFunc\' nevû függvény kiír egy x-et a konzolba( minden lefutásnál )
public myFunc(  ) { print( \"x\" ); }

 
Ez a kis kód szépen elírogat magának a végtelenségig. De mi van akkor, ha nekünk ismétlõdõ timer-re van szükségünk, de nem akarjuk a végteleségig futtatni, csak mondjuk 10-szer? Fel kell címkéznünk az idõzítõnket:
 

#include < a_samp >
//Változó létrehozása az idõzítõnknek, és a számlálónak
new myTimer;
new myCounter;
//Prototípus létrehozása
public myFunc(  );
public OnFilterScriptInit(  ) {
//Idõzítõ inicializálása + felcímkézése
myTimer = SetTimer( \"myFunc\", 5000, true );
return 1;
}
//A \'myFunc\' nevû függvény kiír egy x-et a konzolba( minden lefutásnál ), és növeli a \'myCounter\' értékét
public myFunc(  ) {
//Ha már 5-ször lefutott az eljárásunk, akkor leállítjuk az idõzítõnket
if( myCounter == 5 ) return KillTimer( myTimer );
//Ellenkezõ esetben folytatjuk a mûveletünket
print( \"x\" );
++myCounter;
return 1;
}

 
A \'KillTimer\' függvény
Az elõzõ példában már szerepelt a KillTimer függvény, a szerepe az idõzítõ leállítása. Nyilván ebbõl világossá válik számunkra, hogy ezt csak ismétlõdõ idõzítõknél használjuk.
Paramétere:
 

  • timerid: Integer típusú paraméter, a leállítani kívánt idõzítõnk azonosítóját kell megadni.

Nem írok erre külön példát, nézd át az elõzõt mégegyszer, és gondold végig a folyamatot!
A \'SetTimerEx\' függvény
A SetTimerEx függvény szerepe ugyanaz, mint a SetTimer-é; Meghív egy eljárást. De itt rendelkezésünkre áll még egy paraméter, amivel tetszõleges értékeket( integer, float, sztring, ... ) adhatunk át a meghívott függvénynek.
Paraméterei:
 

  •      


  • funcname[  ]: Sztring típusú paraméter, a meghívni kívánt függvény nevét kell megadnunk.
         


  • interval: Integer( egész szám ) típusú paraméter, a meghívás és a lefutás közti idõt jelöli milimásodpercben(!).
         


  • repeating: Ugyan integer típusú paraméter ez is, de csak két érték a fontos; Ha 0( false ), akkor nem ismétlõdik, ha 1( true ), akkor ismétlõdni fog( amíg le nem állítjuk ).
         


  • format[  ]: Sztring típusú paraméter, az átadni kívánt adat típusának megfelelõ betûjelet kell megadnunk( lentebb ).
         


  • {Float,_}:...: Az elõzõ paraméterhez kapcsolódik, az átadni kívánt adatot kell megadni.


Nézzünk erre egy konkrét példát! Amikor egy játékos beér egy checkpoint-ba, akkor 3 másodperc múlva kap egy üzenetet( csak õ! ):
 

#include < a_samp >
#define COLOR_GREEN 0x00FF00AA
public OnPlayerEnterCheckpoint( playerid ) {
//Meghívjuk a \'checkpointMessage\' függvényt a játékos azonosítójával paraméterként( azaz CSAK NEKI küld üzenetet )
SetTimerEx( \"checkpointMessage\", 3000, false, \"i\", playerid );
return 1;
}
public checkpointMessage( id );
public checkpointMessage( id ) {
SendClientMessage( id, COLOR_GREEN, \"Gratulálok, hogy megértetted az idõzítõk mûködését!\" );
}

 
És végül, ahogy ígértem, a karakterek, amiket a SetTimerEx függvénynél használhatunk:
 

  • i,d: Integer/decimális, azaz egész típusú szám( PL: 1342453326945 )


  • f: Float( lebegõpontos ), azaz tört típusú szám( PL: 3.14 )


  • s: Sztring, azaz karakterlánc( PL: \"kutya\" )


  • a: Array, azaz tömb, aminek a következõ paramétere egész típusú kell legyen, ami a tömb méretét jelöli


  • b: Boolean, azaz logikai érték( 0/1 | true/false )




Ennyi lenne ez a leírás, ha valami kérdés van, tedd fel itt a témában, és igyekszem rá válaszolni.
« Utoljára szerkesztve: 2012. április 19. - 14:50:42 írta ZeRo »

Nem elérhető M4tr1X

  • 1131
    • Profil megtekintése
[ Leírás ]Idõzítõ | Timer
« Válasz #1 Dátum: 2010. augusztus 24. - 13:48:35 »
0 Show voters
Szép leírás, grat!
Ha jól tudom, az elsõ példát, mikor kiír egy \'x\' betût a konzolba sokkal könnyebben is meglehet oldani.
 

public OnFilterScriptInit()
{
     SetTimer(\"print(\"x\")\",5000,true);
     return 1;
}

Nem elérhető jana4

  • 5929
  • Ex Staff
    • Profil megtekintése
[ Leírás ]Idõzítõ | Timer
« Válasz #2 Dátum: 2010. augusztus 24. - 14:14:10 »
0 Show voters
Szép leírás Zero.  :)
 
Idézetet írta: M4tr1X date=1282650515\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"2970\" data-ipsquote-contentclass=\"forums_Topic
Szép leírás, grat!
Ha jól tudom, az elsõ példát, mikor kiír egy \'x\' betût a konzolba sokkal könnyebben is meglehet oldani.
 

public OnFilterScriptInit()
{
     SetTimer(\"print(\"x\")\",5000,true);
     return 1;
}

 

ilyent meg nem lehet

Nem elérhető M4tr1X

  • 1131
    • Profil megtekintése
[ Leírás ]Idõzítõ | Timer
« Válasz #3 Dátum: 2010. augusztus 24. - 14:25:11 »
0 Show voters
Akkor rosszul tudtam. :D

Nem elérhető ZeRo

  • 4620
  • Ex Globális Moderátor
    • Profil megtekintése
[ Leírás ]Idõzítõ | Timer
« Válasz #4 Dátum: 2010. augusztus 24. - 17:29:12 »
+1 Show voters
Köszönöm a dicséreteket.

Nem elérhető Depi

  • 2259
  • Még mindig TrYp. :)
    • Profil megtekintése
[ Leírás ]Idõzítõ | Timer
« Válasz #5 Dátum: 2010. augusztus 24. - 18:36:06 »
+1 Show voters
Szép leírás barátom.  :)

Nem elérhető ZeRo

  • 4620
  • Ex Globális Moderátor
    • Profil megtekintése
[ Leírás ]Idõzítõ | Timer
« Válasz #6 Dátum: 2010. augusztus 24. - 18:52:58 »
+1 Show voters
Idézetet írta: Draven date=1282667766\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"2970\" data-ipsquote-contentclass=\"forums_Topic
Szép leírás barátom.  :)
 
Kösz. :angel:

Nem elérhető hpeter94

  • 1450
  • Fórum fenntartó
    • Profil megtekintése
[ Leírás ]Idõzítõ | Timer
« Válasz #7 Dátum: 2010. augusztus 24. - 21:07:45 »
0 Show voters
Ezer köszönet :) Mégegy tökéletes leírás mostmár a settimerexet is vágom :P

Nem elérhető ZeRo

  • 4620
  • Ex Globális Moderátor
    • Profil megtekintése
[ Leírás ]Idõzítõ | Timer
« Válasz #8 Dátum: 2010. augusztus 25. - 10:54:47 »
+1 Show voters
Örülök, ha segített. :angel:

Nem elérhető krisk

  • 2380
    • Profil megtekintése
[ Leírás ]Idõzítõ | Timer
« Válasz #9 Dátum: 2010. október 17. - 15:24:49 »
0 Show voters
Egy kis félreírás: a prototípust forward statementtel hozod létre, nem public-cal.

Nem elérhető ZeRo

  • 4620
  • Ex Globális Moderátor
    • Profil megtekintése
[ Leírás ]Idõzítõ | Timer
« Válasz #10 Dátum: 2010. október 17. - 15:29:03 »
+1 Show voters
Idézetet írta: krisk date=1287321889\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"2970\" data-ipsquote-contentclass=\"forums_Topic
(Egy kis félreírás: )a prototípust forward statementtel is létrehozhatod, de public-cal is.
 

Nem elérhető kurta999

  • 2759
  • Éllő fédisznó
    • Profil megtekintése
[ Leírás ]Idõzítõ | Timer
« Válasz #11 Dátum: 2010. október 17. - 15:35:37 »
+1 Show voters
Szép leírás!
És akkor mi van, ha csinálok egy olyan timert ami csak egyszer fut le és nem állítom le ? ( KillTimer-el )

Nem elérhető ZeRo

  • 4620
  • Ex Globális Moderátor
    • Profil megtekintése
[ Leírás ]Idõzítõ | Timer
« Válasz #12 Dátum: 2010. október 17. - 15:36:56 »
+1 Show voters
Semmi, azt nem kell leállítani, mivel csak egyszer fut le, aztán automatikusan leállítja a futását. ;)

Nem elérhető kurta999

  • 2759
  • Éllő fédisznó
    • Profil megtekintése
[ Leírás ]Idõzítõ | Timer
« Válasz #13 Dátum: 2011. október 15. - 22:59:48 »
0 Show voters
Egy éves bump.
Nemrég Slice készített egy scriptet, amivel pontosabbá teszi a timereket.
Szerintem ezt nagyon érdemes használni, mivel ittvan egy kép, hogy mennyire pontosak alapból a timerek.
\"width=500http://www.nm-ss.tarhely.biz/SAMP/ServerUpdate/1.8/SetTimer_Pontos.jpg[/img]
« Utoljára szerkesztve: 2011. október 15. - 23:01:39 írta kurta999 »

Koncz_Norbert

  • Vendég
[ Leírás ]Idõzítõ | Timer
« Válasz #14 Dátum: 2011. október 16. - 11:33:57 »
0 Show voters
http://forum.sa-mp.com/showthread.php?t=289675
Love it. Lehet hogy tévedek, de
[pawn]
    #emit PUSH.S    iArgCount
    #emit SYSREQ.C  CallLocalFunction
    iArgCount += 4;
    #emit LCTRL         4
    #emit LOAD.S.alt    iArgCount
    #emit ADD
    #emit SCTRL         4
    // [ STK ] = PRI / ALT, STK = STK - Ez nem kéne?
    #emit PUSH.PRI
[/pawn]

 

SimplePortal 2.3.7 © 2008-2024, SimplePortal