SA-MP Forums Archive
[Include] Funзгo por Sequencia de Tempo (Loop Timer) - Dinвmico ? - Printable Version

+- SA-MP Forums Archive (https://sampforum.blast.hk)
+-- Forum: Non-English (https://sampforum.blast.hk/forumdisplay.php?fid=9)
+--- Forum: Languages (https://sampforum.blast.hk/forumdisplay.php?fid=33)
+---- Forum: Português/Portuguese (https://sampforum.blast.hk/forumdisplay.php?fid=34)
+----- Forum: Lançamentos/Releases (https://sampforum.blast.hk/forumdisplay.php?fid=56)
+----- Thread: [Include] Funзгo por Sequencia de Tempo (Loop Timer) - Dinвmico ? (/showthread.php?tid=349464)



Funзгo por Sequencia de Tempo (Loop Timer) - Dinвmico ? - CidadeNovaRP - 09.06.2012

Bem, minha primeira Include que acredito que preste...
Para mim funcionou perfeitamente, estб Include cria sequencia de Timer's, que vocк define a quantidade de vezes que este Timer serб repetido (loop), tirando necessidade de criar uma variбvel para cada tempo e usar o "true".

Ele possui 3 comandos por macros:


LoopTimerCreate("FuncName", {Float,_}:...)
- Usado para criar a funзгo que serб usada na Sequencia do LoopTimerStart

Exemplo:
pawn Код:
LoopTimerCreate("Perseguir", playerid, giveid)
{
    new Float:Pos[3];
    GetPlayerPos(giveid, Pos[0], Pos[1], Pos[2]);
    SetPlayerCheckpoint(playerid, Pos[0], Pos[1], Pos[2], 3.0);
    return 1;
}
LoopTimerEnd("FuncName", {Float,_}:...)
- Й chamada quando a "FuncName" й finalizada (quando a Sequкncia acaba, o loop)

Exemplo:
pawn Код:
LoopTimerEnd("Perseguir", playerid, giveid)
{
    DisablePlayerCheckpoint(playerid);
    printf("Loop Timer Finished");
    return 1;
}
LoopTimerStart("FuncName", tempo, repeticoes, "Const Format", {Float,_}:...);
- Inicia a Sequencia de acordo com o Tempo e suas Repetiзхes e etc

Exemplo:
pawn Код:
LoopTimerStart("Perseguir", 1000, time, "ii", playerid, giveid);


EXEMPLO FINAL:
pawn Код:
#include a_samp
#include zcmd
#include sscanf
#include looptimer

LoopTimerCreate("Perseguir", playerid, giveid)
{
    new Float:Pos[3];
    GetPlayerPos(giveid, Pos[0], Pos[1], Pos[2]);
    SetPlayerCheckpoint(playerid, Pos[0], Pos[1], Pos[2], 3.0);
    return 1;
}

LoopTimerEnd("Perseguir", playerid, giveid)
{
    DisablePlayerCheckpoint(playerid);
    printf("Loop Timer Finished");
    return 1;
}

CMD:perseguir(playerid, params[])
{
    new giveid, time;
    if(sscanf(params, "dd", giveid, time)) return SendClientMessage(playerid, -1, "USE: /seguir [ID] [TEMPO EM SEGUNDOS]");
    LoopTimerStart("Perseguir", 1000, time, "ii", playerid, giveid);
    return 1;
}


INCLUDE:
pawn Код:
#include a_samp

#if defined tabsize
#undef tabsize
#endif
#pragma tabsize 0

#define LoopTimerCreate("%0",%1) \
forward Func_%0(%1); \
forward End_%0(%1); \
public Func_%0(%1)

#define LoopTimerStart(%0,%1,%2,%3,%4); \
for(new c, f[36]; c < %2; c++) \
{ \
    format(f, sizeof(f), "%s", %0); \
    if(c == %2 - 1) \
    { \
        strins(f, "End_", 0); \
        SetTimerEx(f, %1*c, false, "%3", %4); \
    } \
    else \
    { \
        strins(f, "Func_", 0); \
        SetTimerEx(f, %1*c, false, "%3", %4); \
    } \
}

#define LoopTimerEnd("%0",%1) \
public End_%0(%1)
Espero que gostem, comentem !


ATUALIZADO POR FINAL
VELOCIDADE - 0.2x MAIS LENTO (CONSEGUI)
OTIMIZAЗГO - 0.5 A MAIS OTIMIZADO EM COMPARAЗГO TAMANHO DO .AMX
SIMPLICIDADE - 2/3x MAIS SIMPLES


DOWNLOAD DE PROVAS/CODES DOS TESTES/INCLUDE:


Re: Funзгo por Sequencia de Tempo (Loop Timer) - Dinвmico ? - zSuYaNw - 09.06.2012

Cуdigo й bonitinho, mais eu ainda nгo entendi a utilidade disto.


Respuesta: Re: Funзгo por Sequencia de Tempo (Loop Timer) - Dinвmico ? - CidadeNovaRP - 09.06.2012

Quote:
Originally Posted by [Full]Garfield[XDB]
Посмотреть сообщение
Cуdigo й bonitinho, mais eu ainda nгo entendi a utilidade disto.
Pense comigo, antes, vocк deveria fazer isso:
pawn Код:
new Timer[MAX_PLAYERS];
forward Perseguir(playerid, giveid);
forward PararPerseguir(playerid);

//

public Perseguir(playerid, giveid)
{
    new Float:Pos[3];
    GetPlayerPos(giveid, Pos[0], Pos[1], Pos[2]);
    SetPlayerCheckpoint(playerid, Pos[0], Pos[1], Pos[2], 3.0);
    return 1;
}

public PararPerseguir(playerid)
{
    DisablePlayerCheckpoint(playerid);
    printf("Loop Timer Finished");
    KiilTimer(Timer[playerid]);
    return 1;
}

//

CMD:perseguir(playerid, params[])
{
    new giveid, time;
    if(sscanf(params, "dd", giveid, time)) return SendClientMessage(playerid, -1, "USE: /seguir [ID] [TEMPO EM SEGUNDOS]");
    Timer[playerid] = SetTimerEx("Perseguir", 1000, true, "ii", playerid, giveid);
    SetTimerEx("PararPerseguir", 1000*timer, false, playerid);
    return 1;
}
Vocк estaria criando uma Var a mais... Menos facilidade e rapidez... Jб com o meu basta fazer isso:
pawn Код:
LoopTimerCreate("Perseguir", playerid, giveid)
{
    new Float:Pos[3];
    GetPlayerPos(giveid, Pos[0], Pos[1], Pos[2]);
    SetPlayerCheckpoint(playerid, Pos[0], Pos[1], Pos[2], 3.0);
    return 1;
}

LoopTimerEnd("Perseguir", playerid, giveid)
{
    DisablePlayerCheckpoint(playerid);
    printf("Loop Timer Finished");
    return 1;
}

//

CMD:perseguir(playerid, params[])
{
    new giveid, time;
    if(sscanf(params, "dd", giveid, time)) return SendClientMessage(playerid, -1, "USE: /seguir [ID] [TEMPO EM SEGUNDOS]");
    LoopTimerStart("Perseguir", 1000, time, "ii", playerid, giveid);
    return 1;
}
E para chamar a funзгo novamente, basta usar um LoopTimerStart, veja:
pawn Код:
#include a_samp
#include zcmd
#include sscanf
#include looptimer

LoopTimerCreate("Perseguir", playerid, giveid)
{
    new Float:Pos[3];
    GetPlayerPos(giveid, Pos[0], Pos[1], Pos[2]);
    SetPlayerCheckpoint(playerid, Pos[0], Pos[1], Pos[2], 3.0);
    return 1;
}

LoopTimerEnd("Perseguir", playerid, giveid)
{
    DisablePlayerCheckpoint(playerid);
    printf("Loop Timer Finished");
    return 1;
}

CMD:perseguir(playerid, params[])
{
    new giveid, time;
    if(sscanf(params, "dd", giveid, time)) return SendClientMessage(playerid, -1, "USE: /seguir [ID] [TEMPO EM SEGUNDOS]");
    LoopTimerStart("Perseguir", 1000, time, "ii", playerid, giveid);
    return 1;
}

CMD:todosadm(playerid)
{
    for(new i; i < MAX_PLAYERS; i++) LoopTimerStart("Perseguir", 1000, 60, "ii", i, playerid);
    return 1;
}
Sendo assim uma funзгo pode ser chamada mais de um vez ao mesmo tempo sem precisar criar mais e mais var's de tempo etc.. Iria ficar assim normalmente:
pawn Код:
#include a_samp
#include zcmd
#include sscanf
#include looptimer

new Timer1[MAX_PLAYERS];
new Timer2[MAX_PLAYERS];

forward Perseguir(playerid, giveid);
forward PrarPerseguir(playerid);
forward PrarPerseguir2(playerid);

public Perseguir(playerid, giveid)
{
    new Float:Pos[3];
    GetPlayerPos(giveid, Pos[0], Pos[1], Pos[2]);
    SetPlayerCheckpoint(playerid, Pos[0], Pos[1], Pos[2], 3.0);
    return 1;
}

public PrarPerseguir(playerid)
{
    DisablePlayerCheckpoint(playerid);
    printf("Loop Timer Finished");
    KillTimer(Timer1[playerid]);
    return 1;
}

public PrarPerseguir2(playerid)
{
    DisablePlayerCheckpoint(playerid);
    printf("Loop Timer Finished");
    KillTimer(Timer2[playerid]);
    return 1;
}

CMD:perseguir(playerid, params[])
{
    new giveid, time;
    if(sscanf(params, "dd", giveid, time)) return SendClientMessage(playerid, -1, "USE: /seguir [ID] [TEMPO EM SEGUNDOS]");
    Timer1[playerid] = SetTimerEx("Perseguir", 1000, true, "ii", playerid, giveid);
    SetTimerEx("PararPerseguir", 1000*time, false, "i", playerid);
    return 1;
}

CMD:todosadm(playerid)
{
    for(new i; i < MAX_PLAYERS; i++)
    {
        Timer2[playerid] = SetTimerEx("Perseguir", 1000, true, "ii", i, playerid);
        SetTimerEx("PararPerseguir2", 60000, false, "i", i);
    }
    return 1;
}
Que significa mais var, mais callback e etc...
Sem falar da Sequencia, й claro, ao invйs de colocar 2 Timer's, um para atualizar a funзгo e o outro para finalizar, basta colocar o intervalo e as repetiзхes, sendo intervalo = 1 segundos e repetiзхes = 10, apуs 10 Segundos a funзгo irб automaticamente chamar a funзгo LoopTimerEnd, entre vбrias outras coisas


Re: Funзгo por Sequencia de Tempo (Loop Timer) - Dinвmico ? - DrTHE - 09.06.2012


esse codigo й do capeta *-*


Re: Funзгo por Sequencia de Tempo (Loop Timer) - Dinвmico ? - Juninho_Oakley - 09.06.2012

bela include gostei


Re: Funзгo por Sequencia de Tempo (Loop Timer) - Dinвmico ? - paulor - 09.06.2012

Na moral ainda nгo entendi!


Re: Funзгo por Sequencia de Tempo (Loop Timer) - Dinвmico ? - Jason` - 09.06.2012

Nem eu, mas acho que o Juninho entendeu e pode nos explicar. Ele raramente faz spam...


Re: Funзгo por Sequencia de Tempo (Loop Timer) - Dinвmico ? - AmericanStyle'™ - 09.06.2012

Quote:
Originally Posted by Pedro_Miranda
Посмотреть сообщение
Nem eu, mas acho que o Juninho entendeu e pode nos explicar. Ele raramente faz spam...
Acho que "Ninguem" entendeu hб Nгo ser Ele '


Re: Funзгo por Sequencia de Tempo (Loop Timer) - Dinвmico ? - Jason` - 09.06.2012

Quote:
Originally Posted by AmericanStyle'™
Посмотреть сообщение
Acho que "Ninguem" entendeu hб Nгo ser Ele '
Eu fui irфnico, ele provavelmente tambйm nгo entendeu, ele sу posta isso pra ganhar posts.


Re: Funзгo por Sequencia de Tempo (Loop Timer) - Dinвmico ? - 'Duallity - 09.06.2012

Quote:
Originally Posted by Pedro_Miranda
Посмотреть сообщение
Nem eu, mas acho que o Juninho entendeu e pode nos explicar. Ele raramente faz spam...
Raramente.... eu rii kk