Oggi è 14/08/2022, 12:08

Tutti gli orari sono UTC + 1 ora [ ora legale ]





 Pagina 1 di 1 [ 1 messaggio ] 

  Apri un nuovo argomento Rispondi all’argomento

  Stampa pagina

Autore Messaggio
 Oggetto del messaggio: [GUIDA] Automata
MessaggioInviato: 07/11/2010, 17:41 
Utente

Iscritto il: 06/11/2010
Messaggi: 197
Favourite GTA: San Andreas

Karma
1


Non connesso
Automata / State Machines

- Introduzione:
Le Automata, dette anche State Machines, sono un'altra delle funzionalità, che molti non conoscono o ignorano, del Pawn supportate NATIVAMENTE. Questa funzionalità permette di definire più volte una stessa funzione, ma da eseguire in diverse circostanze.

- Pratica:
Questo è un esempio fatto da Y_Less... in questo caso non vengono usate le AutoMata:
Codice:
#include <a_samp>

forward change();

enum
{
end = 0,
gmx
}

new
gExitType;

main()
{
gExitType = end;
SetTimer("change", 10000, 0);
}

public OnGameModeExit()
{
switch (gExitType)
{
case end:
printf("This mode was ended by the server");
case gmx:
printf("This mode was ended by the timer");
}
}

public change()
{
gExitType = gmx;
GameModeExit();
}

E in questo caso vengono usate le Automata:
Codice:
#include <a_samp>

forward change();

main()
{
state exitType:end;
SetTimer("change", 10000, 0);
}

public OnGameModeExit() <exitType:end>
{
printf("This mode was ended by the server");
}

public OnGameModeExit() <exitType:gmx>
{
printf("This mode was ended by the timer");
}

public change()
{
state exitType:gmx;
GameModeExit();
}


Come potete vedere il codice è più efficiente, semplice, veloce e leggibile. Inoltre la velocità garantita dalla natività di questa funzionalità è un altro motivo in più per usare le Automata.

- Spiegazione:
Le Automata si basano su degli stati di una funzione che vengono definiti cosi:
Codice:
state NomeStato:stato;

ed inoltre possono essere accompagnati da una condizione:
Codice:
new var = 1;
state (var == 2) NomeStato:stato;

Qui lo stato non viene definito perchè (var == 2) è falso.

Quindi per dichiarare delle copie di una funzione, eseguite in base allo stato bisogna aggiungere accanto alla funzione "NomeStato:stato1", quando vogliamo eseguire la funzione quando lo stato di "NomeStato" è "stato1". Esempio:
Codice:
dprint(message[]) <debugState:on>
{
print(message);
}

Eseguirà la funzione solo quando debugState è on.
Inoltre possiamo far in modo che una funzione abbia più occasioni per essere eseguita separando vari stati tra le ,
Ad esempio:
Codice:
dprint(message[]) <debugState:on, debugState:on2, omgState:on>
{
print(message);
}

Verrà eseguita se debugState è on, debugState è on2 o omgState è on.
Possiamo anche far eseguire una funzione se lo stato di questa non è nessuno di quelli dichiarati accanto alla funzione mettendo semplicemente <> accanto a questa.
Esempio:
Codice:
dprint(message[]) <debugState:on>
{
print(message);
}
dprint(message[]) <>
{
return 0;
}

Quindi in questo caso se debugState è on esegue la prima funzione, altrimenti esegue la seconda.
Invece quando mettiamo la funzione senza niente accanto questa sarà eseguita sempre.
Esempio:
Codice:
dprint(message[]) <debugState:on>
{
print(message);
}
dprint(message[])
{
return 1;
}

Il secondo verrà sempre eseguito mentre il primo solo quando debugState è on.

- entry()
Questa è una funzione speciale come main() che viene richiamata quando si assegna uno stato. Esempio:
Codice:
main ()
{
printf("hello");
state myState:moo;
printf("world");
}

entry() <myState:moo>
{
printf("change");
}


Top
 E-mail  
 

Visualizza ultimi messaggi:  Ordina per  
 Pagina 1 di 1 [ 1 messaggio ] 

  Apri un nuovo argomento Rispondi all’argomento

Tutti gli orari sono UTC + 1 ora [ ora legale ]



Chi c’è in linea

Visitano il forum: Nessuno e 2 ospiti


Non puoi aprire nuovi argomenti
Non puoi rispondere negli argomenti
Non puoi modificare i tuoi messaggi
Non puoi cancellare i tuoi messaggi
Non puoi inviare allegati

Cerca per:
Vai a:  
cron