GTA-Center.com » Forum http://www.gta-center.com/forums/ |
|
[GUIDA] Automata http://www.gta-center.com/forums/viewtopic.php?f=40&t=253 |
Pagina 1 di 1 |
Autore: | Peppe [ 07/11/2010, 17:41 ] |
Oggetto del messaggio: | [GUIDA] Automata |
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"); } |
Pagina 1 di 1 | Tutti gli orari sono UTC + 1 ora [ ora legale ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |