[Include] Funзгo por Sequencia de Tempo (Loop Timer) - Dinвmico ?
#1

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:
Reply
#2

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

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
Reply
#4


esse codigo й do capeta *-*
Reply
#5

bela include gostei
Reply
#6

Na moral ainda nгo entendi!
Reply
#7

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

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 '
Reply
#9

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.
Reply
#10

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
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)