23.07.2011, 00:42
(
Последний раз редактировалось [BEP]AcerPilot; 15.08.2011 в 17:39.
)
State machines (automata)
O que й, para que serve e como usar
O que й, para que serve e como usar
Introduзгo
Se vocк nunca leu a pawn lang, й quase 100% de certeza que nгo conhece state machines, ou automata. Atй hoje, nunca vi NENHUM script lanзado que utilize automata, o que й uma vergonha, jб que esse mйtodo й muito ъtil. Mas tambйm existem algumas pessoas que leram, e sabem o que sгo. Umas delas sou eu, e por isso estou fazendo este guia. PAWN nativamente suporta um sistema chamado state machines, ou automata, que basicamente permitem que vocк use mъltiplas cуpias da mesma funзгo para diferentes circunstвncias.
Antes de comerзamos, quero deixar uma coisa clara: State machines, ou automata, nгo foram feitos para serem usados como arrays, pois nгo podem possuir indexes, ou seja, vocк nгo poderб usar automata com fins de gerenciar as aзхes cada player, por exemplo.
Exemplo
Vamos usar o seguinte cуdigo como exemplo:
pawn Код:
new print;
forward PrintShit();
main()
{
print = 0;
SetTimer("PrintShit", 1000, 1);
}
public PrintShit()
{
if(print == 1)
{
print("Estamos mostrando uma frase no console.");
}
else
{
return 1;
}
}
public OnPlayerCommandText(playerid, cmdtext[])
{
if(strcmp(cmdtext, "/print", true) == 0)
{
if(print == 0)
{
print = 1;
}
else
{
print = 0;
}
}
return 0;
}
pawn Код:
#include <a_samp>
forward PrintShit();
main()
{
state print:no;
SetTimer("PrintShit", 1000, 1);
}
public PrintShit() <print:yes>
{
print("Estamos mostrando uma frase no console.");
}
public PrintShit() <print:no>
{
return 1;
}
public OnPlayerCommandText(playerid, cmdtext[]) <print:no>
{
state (strcmp(cmdtext, "/print", true) == 0) print:yes;
return 0;
}
public OnPlayerCommandText(playerid, cmdtext[]) <print:yes>
{
state (strcmp(cmdtext, "/print", true) == 0) print:no;
return 0;
}
Uma coisa importante a ressaltar й que a diretiva 'state' pode ter condicionais dentro da mesma. Essa linha:
pawn Код:
state (strcmp(cmdtext, "/print", true) == 0) print:yes;
pawn Код:
if(strcmp(cmdtext, "/print", true) == 0)
{
state print:yes;
}
Vantagens
Usando automata, nгo precisamos usar variбveis globais, ou seja, nгo usamos espaзo a mais na memуria, e o cуdigo fica mais limpo e mais rбpido, como disse anteriormente, alйm de nгo precisar de enormes 'if's e 'else's ou grandes estruturas como 'switch', com automata vocк pode criar vбrios 'PrintShit's, 'OnGameCommandText's etc. Nгo hб problema nenhum em usar a mesma automata em vбrias funзхes ao mesmo tempo.
Explicaзгo
Agora que jб vemos alguns exemplos e sabemos como funciona vamos olhar mais detalhadamente no cуdigo:
- state
pawn Код:state a:s;
Como falei anteriormente, vocк pode usar condicionais dentro da diretiva 'state':
pawn Код:state (c == 1) a:s;
pawn Код:if(c == 1) state a:s;
- Funзхes
Uma funзгo pode ter vбrias cуpias delas mesma para serem usadas em vбrias circunstвncias, afinal esse й o principal 'recurso' da automata. Vocк pode orientar uma funзгo para nгo ter estados, ter apenas um, vбrios, ou ser chamada se todos os outros estados nгo forem vбlidos.
- Nenhum estado
pawn Код:stock Math()
{
new x = 2;
new y = 4;
printf("%i", y-x);
}
- Um estado
pawn Код:stock Math() <calcs:on>
{
new x = 2;
new y = 4;
printf("%i", y-x);
}
- Estados mъltiplos
pawn Код:stock Math() <calcs:on, calcs:always>
{
new x = 2;
new y = 4;
printf("%i", y-x);
}
Quando se usa nъmeros como estados, precisa-se adicionar um underline ('_') antes do nъmero, pois sнmbolos nгo podem comeзar com nъmeros, como no exemplo:
pawn Код:stock Math() <calcs:_1, calcs:_2>
{
new x = 2;
new y = 4;
printf("%i", y-x);
} - Outros estados
pawn Код:stock Math() <>
{
new x = 2;
new y = 4;
printf("%i", y-x);
}
- Nenhum estado
- entry
Й uma funзгo especial que funciona como uma callback. A callback OnPlayerCommandText nгo й chamada quando o jogador envia um comando? A 'entry' й chamada quando se muda o estado de uma automata.
O cуdigo:
pawn Код:main()
{
print("Hello");
state printstring:sure;
print("World");
}
entry() <printstring:sure>
{
print("Fuckin'");
}
Код:Hello Fuckin' World
Espero que todos tenham entendido. Qualquer dъvida, nгo hesite em perguntar. Para mais informaзхes, leia a pawn lang a partir da pбgina 37.