[Ajuda] Loop
#1

Й possivel temporizar uma loop, tipo, a sequencia ser iniciada normalmente mas demorar uns dois segundos para passar de numero, tipo assim

numero 58
passa dois segundos
numero 59

assim sucessivamente
Reply
#2

Ao invйs de um loop por que nгo utilizar um timer?
Код:
SetTimer
SetTimerEx
Reply
#3

Usa SetTimer Pra fazer isso й mais Facil ..

SetTimer
ou
SetTimerEx
Reply
#4

se vocК quiser fazer pra um jogador no caso o playerid, usa o Ex, mas se for pra quem tiver online! usa o normal, o Ex, ele pega o nego que ta na telinha jogando!
e usa a variavel pra acada timer ela aumentar 1 "++"
Reply
#5

Fiz um pra vocк:

PHP код:
#include <a_samp>
/* Exemplo */
public OnFilterScriptInit()
{
    
LoopingEx("Exemplo"010202000);
    
/*
        Irб chamar a callback Exemplo em 2 em 2 segundos (2000 MS)
    */
    
return 1;
}
forward Exemplo();
public 
Exemplo()
{
    static
        
VezesChamadas;
        
    
VezesChamadas ++;
    
printf("%d"VezesChamadas);
    return 
false;
}
/* Funзгo */
new
    
StopLooping;
    
stock LoopingEx(Callback[], paramsCallNumInicialNumFinalDelay){
    
KillTimer(StopLooping);
    
StopLooping SetTimerEx("Filtro"Delaytrue"sddd"Callback,paramsCallNumInicialNumFinal);
}
forward Filtro(Callback[], paramsCallNumInicialNumFinal);
public 
Filtro(Callback[], paramsCallNumInicialNumFinal)
{
    static
        
func[30],
        
NumRodando,
        
bool:AntiBug;
        
    if(
AntiBug) { AntiBug trueNumRodando NumInicial; }
    
    
NumRodando ++;
    if(
NumRodando >= NumFinal) { KillTimer(StopLooping); NumRodando 0AntiBug false; return true; }
    
    
format(funcsizeof func"%s"Callback);
    
CallLocalFunction(func"d"paramsCall);
    return 
false;

Sinceramente,ficou perfeito.

Funзгo: LoopingEx(Callback[], paramsCall, NumInicial, NumFinal, Delay)
Reply
#6

Quote:
Originally Posted by XandyMello
Посмотреть сообщение
Fiz um pra vocк:

PHP код:
#include <a_samp>
/* Exemplo */
public OnFilterScriptInit()
{
    
LoopingEx("Exemplo"010202000);
    
/*
        Irб chamar a callback Exemplo em 2 em 2 segundos (2000 MS)
    */
    
return 1;
}
forward Exemplo();
public 
Exemplo()
{
    static
        
VezesChamadas;
        
    
VezesChamadas ++;
    
printf("%d"VezesChamadas);
    return 
false;
}
/* Funзгo */
new
    
StopLooping;
    
stock LoopingEx(Callback[], paramsCallNumInicialNumFinalDelay){
    
KillTimer(StopLooping);
    
StopLooping SetTimerEx("Filtro"Delaytrue"sddd"Callback,paramsCallNumInicialNumFinal);
}
forward Filtro(Callback[], paramsCallNumInicialNumFinal);
public 
Filtro(Callback[], paramsCallNumInicialNumFinal)
{
    static
        
func[30],
        
NumRodando,
        
bool:AntiBug;
        
    if(
AntiBug) { AntiBug trueNumRodando NumInicial; }
    
    
NumRodando ++;
    if(
NumRodando >= NumFinal) { KillTimer(StopLooping); NumRodando 0AntiBug false; return true; }
    
    
format(funcsizeof func"%s"Callback);
    
CallLocalFunction(func"d"paramsCall);
    return 
false;

Sinceramente,ficou perfeito.

Funзгo: LoopingEx(Callback[], paramsCall, NumInicial, NumFinal, Delay)
Parabйns pelo cуdigo parceiro, chegou atй a brilhar meus olhos quando eu olhei seu cуdigo !
Reply
#7

O cуdigo do amigo acima й capaz de executar somente um loop por vez.

Com este vocк pode fazer quantos loops quiser ao mesmo tempo:
PHP код:
forward LoopFunc(callback[], fromtoorderinterval);
public 
LoopFunc(callback[], fromtoorderinterval)
{
    static 
cbck[30];
    
format(cbcksizeof(cbck), "%s"callback);
    if(
CallLocalFunction(cbck"d"from) == 0) return 0;
    if((
order 0) ? (to >= from) : (from >= to)) return 0;
    
SetTimerEx("LoopFunc"intervalfalse"sdddd"cbck, (order 0) ? (from-1) : (from+1), toorderinterval);
    return 
1;

Parвmetros:
  • callback = nome da funзгo a ser chamada nas iteraзхes
  • from = nъmero inicial
  • to = nъmero final
  • order = ordem, crescente (1) ou decrescente (-1), equivalente ao "i++" e "i--"
  • interval = intervalo entre cada chamada da callback
OBS: a callback deve sempre ser declarada com um ъnico parвmetro do tipo inteiro, que serб a iteraзгo atual.

Exemplos:
PHP код:
//Exemplo 01 (i--)
LoopFunc("Exemplo"50, -11000); //loop do nъmero 5 ao 0 com delay de 1000ms a cada iteraзгo
//Exemplo 02 (i++)
LoopFunc("Exemplo"0511000); //loop do nъmero 0 ao 5 com delay de 1000ms a cada iteraзгo
forward Exemplo(i);
public 
Exemplo(i)
{
    
printf("%d"i);
    return 
1;

Retorne sempre 1 na callback.
Para parar o loop (break) retorne 0.
Reply
#8

UM BOM EXEMPLO DE COMO USAR ISSO IN-GAME:


PHP код:
/*--------------------------------------------------------------------------------
                        no inicio do gamemode */
#include <a_samp>
#include <ZCMD>
#include <SSCANF>
//------------------------------------------------------------------------------
new
    
CriarTime[MAX_PLAYERS],
    
TimeEmAndamento[MAX_PLAYERS]
;
CMD:loopplayer(playeridparams[])
{
    if(
TimeEmAndamento[playerid] == 1)
    {
        
KillTimer(CriarTime[playerid]);
        
TimeEmAndamento[playerid] = 0;
        
SendClientMessage(playerid, -1"Funзгo cancelada(finalizada).");
        return 
1;
    }
    new
        
FUNCOES[30],
        
ID,
        
PARAMETRO_1,
        
TIMER,
        
REPEAT
    
;
    if(
sscanf(params"sdddd",FUNCOESIDPARAMETRO_1TIMERREPEAT))
        return 
SendClientMessage(playerid, -1"Use: /loop [nome-da-public] [player] [parвmetro1] [segundos] [repetiзгo 0 = off | 1 = on]");
        
    if(
REPEAT || REPEAT 0)
        return 
SendClientMessage(playerid, -1"[ repetiзгo > 0 = off/ 1 = on ]");
    new
        
nomeplayer[25],
        
nomefuncao[50],
        
corpomsg[128],
        
DefinirDepeticao[2][13] = {"sem repetзгo""com repetзгo"}
    ;
    
GetPlayerName(IDnomeplayer25)
    ;
    
format(corpomsgsizeof corpomsg,"Voce usou %s %d em %s, daqui a % segundos %s"nomefuncaoPARAMETRO_1nomeplayerTIMERDefinirDepeticao[REPEAT]);
    
SendClientMessage(playerid, -1corpomsg);
    
    
format(nomefuncaosizeof nomefuncao"%s"FUNCOES);
    
CriarTime[playerid] = SetTimerEx(nomefuncaoTIMER*1000REPEAT"id"IDPARAMETRO_1);
    
TimeEmAndamento[playerid] = 1;
    return 
true;

Comando: /loopplayer SetPlayerMoney 0 500 2 1


/loopplayer = comando
SetPlayerMoney = uma funзгo que seta dinheiro
0 = й o id do player a ser executada a funзгo
2 = segundos
1 = repetiзгo ativada

Ou seja, o jogador 0 ira receber 500 dуlares a cada 2 segundos.
Para cancelar isso basta digita somente o '/looplayer'
Reply


Forum Jump:


Users browsing this thread: 3 Guest(s)