01.12.2012, 06:21
(
Last edited by zSuYaNw; 17/09/2013 at 01:18 AM.
)
Oque vocк precisa saber sobre PAWN
Introduзгo:
Bom, eu desenvolvi este tutorial com os erros mais comuns entre os novatos,
nгo apenas erros e sim dicas para quem quer comeзar a programar ou estб
aprendendo mais que estб encontrando muitas dificuldades.
Pois bem, quem comeзa na programaзгo, nгo tem a mнnima ideia do que й
objetos, variбveis, arrays, tabulaзгo, conexгo e como funciona o PAWN.
Com o passar do tempo vocк irб aprender muitas coisas, alйm de saber muitas
coisas que podem ser aplicadas na vida real.
Este tutorial serб aplicado para explicaзгo bбsica sobre programaзгo,
por isto dъvidas avulsas de outros sistemas/includes nгo serгo
respondidos neste tуpico. o tutorial tambйm serб dividido em duas partes,
a parte da explicaзгo e a segunda parte й como manipular.
Primeiro de tudo vocк tem que saber que '//' ou '/* */' sгo comentбrios, por isto
eles sгo ignorados pelo compilador.
Os assuntos abordados neste tуpico serгo:
- Diretivas;
- Variбveis;
- Constantes;
- Enumeradores;
- Arrays
- Funзхes;
- Callbacks;
- Expressхes;
- Loopings.
Diretivas:
Vamos comeзar o tutorial falando sobre diretivas, oque sгo, qual sua funзгo e
como usб-las.
Bom as diretivas sгo funзхes especнficas do compilador pawno.exe, elas sгo
para vocк criar configuraзхes que nгo serгo enviadas ao AMX, ou seja, sгo
apenas definiзхes, segue o exemplo:
Diretiva: #Include
Esta diretiva й a mais importante de todas, ela que carrega scripts externos
e transforma-o em um, й muito boa para vocк ogranizar seu gamemode.
Ela й muito usada para carregar inclusхes, como:
pawn Code:
#include <a_samp>
somente lembrando para nуs incluir uma biblioteca ela deve estar
na pasta "Includes" e com extensгo .inc, a pasta includes fica
na mesma pasta em que o PAWNO se encontra.
Diretiva: #define
No seu cуdigo PAWN:
pawn Code:
#define Vermelho 0xFF0000FF
SendClientMessageToAll(Vermelho, "Esta й uma frase em vermelho");
pawn Code:
SendClientMessageToAll(0xFF0000FF, "Esta й uma frase em vermelho");
diferenзa nenhuma, pois os dois cуdigos acima sгo exatamente a
mesma coisa, somente que o compilador
troca "Vermelho" para "0xFF0000FF".
Para entender:
pawn Code:
#define APELIDO SIGNIFICADO
no in-game, agora que vocк jб sabe que definiзхes sгo apenas "Apelidos"
que o pawno troca pelo significado.
Agora iremos aprender sobre as principais diretivas do pawno, tambйm
mostrarei exemplos,
Diretiva #if,
Bom, esta diretiva й muito usada quando queremos comparar uma definiзгo,
ou melhor dizendo um "Apelido", com ela podemos fazer facilmente um cуdigo
de configuraзгo, veja o exemplo:
Primeiramente criamos uma definiзгo:
pawn Code:
#define ATIVAR_MENSAGEM true// podemos considerar que 'true' й sim 'false' й nгo.
Depois da definiзгo, iremos fazer a condiзгo, da qual verificaremos se
a mensagem estб ativada:
pawn Code:
#if ATIVAR_MENSAGEM == true // Verificamos que "ATIVAR_MENSAGEM" Estб exatamente igual hб 'true'.
printf("Mensagem ativada");
#endif // note que esta diretiva й essencial para compilar, pois ela й que termina a condiзгo acima, caso nгo tiver ela, aparecerб erros.
pawn Code:
#define ATIVAR_MENSAGEM false// podemos considerar que 'true' й sim 'false' й nгo.
Quando falamos em "Condiзгo" logos pensamos em "Comparaзгo", e
no pawno tem vбrios modos de comparar valores, vamos ver os
"Operadores de comparaзгo", os operadores sгo sнmbolos que especнfica com
precisгo o valor da definiзгo.
Operador: < (Menor que), no exemplo abaixo vocк pode nota que ele estб
verifciando
se 20 for menor que ATIVAR_MENSAGEM
pawn Code:
#if ATIVAR_MENSAGEM < 20
Operador: > (Maior que), este operador й usado para comparar valores sendo maior que ele,
como no exemplo abaixo, ele verifica se a definiзгo ATIVAR_MENSAGEM й maior que 20:
pawn Code:
#if ATIVAR_MENSAGEM > 20
compara se a definiзгo й menor OU igual hб 20.
pawn Code:
#if ATIVAR_MENSAGEM <= 20
ele verifica se a definiзгo й maior ou igual hб 20:
pawn Code:
#if ATIVAR_MENSAGEM >= 20
й diferente de 20:
pawn Code:
#if ATIVAR_MENSAGEM != 20
bбsicas, agora irei explicar algumas funзхes extras das diretivas:
Diretiva: #if defined
Esta diretiva й muito utlizada para verificar se foi definido uma palavra, exemplo:
pawn Code:
#if defined ATIVAR_MENSAGEM
printf("Foi definido ATIVAR_MENSAGEM");
#endif
#if !defined ATIVAR_MENSAGEM
printf("Nгo foi definido ATIVAR_MENSAGEM");
#endif
Diretiva: #else
A diretiva #else й utilizda como com a simples traduзгo "se nгo",
pawn Code:
#if defined ATIVAR_MENSAGEM // verificamos se ATIVAR_MENSAGEM estб definido
printf("Foi definido ATIVAR_MENSAGEM"); // imprimimos a mensagem
#else // caso nгo for definida a ATIVAR_MENSAGEM
printf("Nгo foi definido ATIVAR_MENSAGEM"); // imprimimos outra imagem
#endif // fim
Diretiva:#undef
Esta diretiva sу tem uma funзгo, ela remove uma definiзгo, veja no exemplo:
pawn Code:
#define ATIVAR_MENSAGENS 50 // definimos o valor de ATIVAR_MENSAGENS para 50
#undef ATIVAR_MENSAGENS // removemos a definiзгo
#define ATIVAR_MENSAGENS 60 // definimos novamente com o valor 60
Cuidado!
Vocк nгo pode definir duas vezes com mesmo nome:
pawn Code:
#define ATIVAR_MENSAGENS
#define ATIVAR_MENSAGENS
Vocк tambйm definir ela mesmo:
pawn Code:
#define ATIVAR_MENSAGENS ATIVAR_MENSAGENS
Variбveis:
Variбveis nada mais sгo doque "midia de armazenamento" ou seja, elas podem armazenar
qualquer valor, des-de que os valores sejam maiores ou menores que 0, ao cria-las elas
terгo o valor 0 automaticamente.
Para testar
pawn Code:
new MinhaVariavel;
printf("Valor de MinhaVariavel й :%d", MinhaVariavel);
Operador/Expressгo | Significado |
+= | Adiciona uma valor hб nossa variбvel |
-= | Remove um vaor hб nossa variбvel |
*= | Multiplica um valor hб nossa variбvel |
/= | Divide um valor da nossa variбvel |
= | Setamos um valor hб nossa variбvel |
% | Resto da divisгo, й usado quando a divisгo nгo й exata. |
Depois vocк ver como modificar os valores, vamos aplicar:
pawn Code:
new MinhaVariavel;
MinhaVariavel += 10; // botamos
printf("Valor de MinhaVariavel й :%d", MinhaVariavel); // Imprime 10 no console.
MinhaVariavel -= 5;// removemos 5 da variбvel "MinhaVariavel"
printf("Valor de MinhaVariavel й :%d", MinhaVariavel); // Imprime 5 no console.
MinhaVariavel *= 2;
printf("Valor de MinhaVariavel й :%d", MinhaVariavel); // Imprime 10 no console.
MinhaVariavel /= 2;
printf("Valor de MinhaVariavel й :%d", MinhaVariavel); // Imprime 5 no console.
MinhaVariavel = 59;
printf("Valor de MinhaVariavel dividida por 8 resto da divisгo й %d", MinhaVariavel % 59);// Imprime 8 no console.
Sу lembrando que uma variбvel sу pode armazenar UM valor, e tambйm armazenar
um id, como por exemplo, veiculo:
pawn Code:
new MinhaVariavel;
MinhaVariavel = CreateVehicle(522, 5457.47, 567.788, 0.0, -1,-1, 9);
printf("ID Do carro й %d", MinhaVariavel);
Tudo se resume que variбvel armazena um valor, podendo de ser objeto ou nгo.
Constantes:
Constantes sгo um tipo de variбvel que ficam constantemente no mesmo valor, ou seja,
й como se fosse uma definiзгo.
pawn Code:
const MinhaConstante = 500; // vemos que a constante tem o valor 500
printf("Valor: %d", MinhaConstante);
Code:
Valor: 500
Com constantes nгo й possнvel modificar o valor dela:
pawn Code:
const MinhaConstante = 500; // vemos que a constante tem o valor 500
printf("Valor: %d", MinhaConstante);
MinhaConstante = 500; // ERRO
Constantes sу podem armazenar valores inteiros, nгo podendo
Armazenar nъmeros flutuantes(floats).
Enumeradores:
Enumeradores sгo um tipo de organizaзгo de array, nela sгo
armazenados valores que podem ser chamados a qualquer instante, veja:
pawn Code:
enum MeuEnumerador / * Iniciamos nosso enumerador com o nome "Meu enumerador"
{
Nivel
// Aqui dentro inserimos as "Tags" que serгo armazenados os valores
}; // Concluimos nosso enumerador, agora vamos utilizб-lo em nossa array.
new PlayerInfo[ MAX_PLAYERS ] [ MeuEnumerador ]; // Agora criamos a array com o nome "PlayerInfo", coma a dimensгo "MAX_PLAYERS" e utilizamos as TAGs do enumerador "MeuEnumerador".
pawn Code:
PlayerInfo[playerid][Nivel] = 50;
Ao usar uma tag inexistente no enumerador o PAWNO resultarб a erro, entгo aconselho
botar nome de tags fбceis de lembrar para nгo se esquecer rapidamente =)
Arrays:
Bom, este assunto й muito importante, pos vocк irб utilizar na maioria dos seus cуdigos,
uma dica que dou й sempre contar cйlulas precisamente ou criar uma Variбvel Gobal,
com uma prй-definiзгo de string, normalemnte usando 128, pois este й o mбximo de texto,
Mais vamos hб explicaзгo:
As arrays sгo multi variбveis, com ela podem ser armazenados vбrios valores diferentes,
similar a uma variбvel normal que sу pode armazenar um valor simultaniamente.
Criamos uma array normal contendo 5 cйlulas:
pawn Code:
new MinhaArray[ 5 ];
Seria a mesma coisa que:
pawn Code:
new MinhaArray0;
new MinhaArray1;
new MinhaArray2;
new MinhaArray3;
new MinhaArray4;
Voltando para o assunto Array, cada valor pode ser armazenado em uma cйlula,
sу lembrando que cйlula й oque estб entre colchetes "[" & " ]".
Como nosso exemplo, criamos uma array com 5 cйlulas:
pawn Code:
new MinhaArray[5];
Para modificar os valores dos mesmos:
pawn Code:
MinhaArray[0] += 50; // Incrementa a "MinhaArray" cйlula "0" o valor "50".
pawn Code:
printf("MinhaArray[0] Valor: %d Cйlula: 0", MinhaArray[0]);
pawn Code:
new MinhaArray[5] = {
50, // Cйlula 0
0, // Cйlula 1
0, // Cйlula 2
0, // Cйlula 3
0 // Cйlula 4
};
por valores nгo utilizados.
Nota(s):
As arrays sу sгo no mбximo tridimensional, que sгo 3 dimensхes em uma array sу.
Exemplo de array tridimencional:
pawn Code:
new MinhaArray[1][20][40];
pawn Code:
MinhaArray[1][0][0] = 10;
MinhaArray[1][0][1] = 50;
MinhaArray[1][1][25] = 30;
pawn Code:
printf(" %d |%d | %d | ", MinhaArray[1][0][0], MinhaArray[1][0][1], MinhaArray[1][1][25]);
Exemplo de array Bidimencional:
pawn Code:
new MinhaArray[20][15];
pawn Code:
MinhaArray[0][1] = 20;
MinhaArray[5][9] = 5;
Mostrando:
pawn Code:
printf("%d | %d", MinhaArray[0][1], MinhaArray[5][9]);
Exibe: "20| 5".
Arrays de uma dimensгo:
Exemplo de uma array normal(uma dimensгo):
pawn Code:
new MinhaArray[100];
Manipulando:
pawn Code:
MinhaArray[0] = 50;
MinhaArray[97] = 87;
Mostrando:
pawn Code:
printf("%d, %d", MinhArray[0], MinhaArray[97]);
Cuidado ao acessar uma dimensгo que nгo existe!
pois darб erro ou possнveis crashs!
Funзхes:
Bom, existe 2 tipos de funзхes, as funзхes nativas e as funзхes nгo-nativas,
irei explica-las:
As funзхes nativas sгo as que vem juntamente com a packpage do SA-MP,
nelas vocк pode encontrar funзхes que podem manipular o servidor totalmente,
sendo a maioria com parвmetros.
Nessas funзхes podemos formar um exemplo de usagem:
pawn Code:
Kick(playerid); // Expulsa o player do servidor
mais note-se que ao adicionar mais um parвmetro o pawno returnarб
hб um erro, este erro й comum, entгo preste bem a atenзгo ao usar
uma funзгo da qual nгo saiba os parвmetros, caso tiver dъvidas, procure
o comando na Wiki.sa-mp que fala sу sobre funзхes nativas.
As funзхes nгo-nativas sгo as que nгo vem com a packpage do sa-mp,
entгo vocк tem que cria-las, pois elas sгo funзхes prуprias, cбlculos,
etc...
Entгo as funзхes que nгo existe na biblioteca do sa-mp sгo denomiadas
de nгo-nativas, mais lembrando que se jб estiver criado uma funзгo com
mesmo nome da outra com certeza returnarб hб erro, entгo vamos hб obra:
Mais eai, como criar funзхes ?
Para criar funзхes extras, basta seguir a seguinte fуrmula:
pawn Code:
stock MinhaFuncao(numero, texto[], Float:NumerosFlutuantes){
printf("[%d]%s ele й %.1f", numero, texto, Float:NumerosFlutuantes);
}
pawn Code:
MinhaFuncao(20, "Oi, Este й um tutorial do SuYaNw Dбcio", 10.0);
Mбs Garfield, como podemos fazer funзхes com este pequeno exemplo ?
Simples, irei mostrar um exemplo umpouco mais extenso,
pawn Code:
stock ContarCaracteresNaFrase(frase[]){ // Note que usei "[]" para indicar texto/string, olhe a tabela abaixo.
new Caracteres; // Cria uma variбvel para armazenar a quantidade de letras.
Caracteres = strlen(frase); // Seta a variбvel "Caracteres" para quanditade de letras da "frase[]" utilziando a funзгo strlen.
return Caracteres; // Returna a quantidade de letras.
}
na funзгo explicadas todas as funзхes de cada linha.
Para testa-la, use:
pawn Code:
printf("Esta frase tem %d letra(s)", ContarCaracteresNaFrase("SuYaNw Lindo"));
Tabela de tags para usar em funзхes:
Tag | Uso | Funзгo |
Float[/d] | stock MinhaFuncao(Float: vida) | Serve para nъmeros flutuantes |
Text[/d] | stock MinhaFuncao(Float: Text) | Serve para manipular textdraws |
Menu[/d] | stock MinhaFuncao(Float: Menu) | Serve para manipular menus |
Text3D[/d] | stock MinhaFuncao(Float: Text3D) | Serve para manipular textos 3d |
usadas estгo citadas acima.
Utilizando Referкncia em funзхes, bom, este й um pouco mais elevado, precisa de uma grande
atenзгo para aprender esta parte, entгo vamos lб:
Oque sгo referкncias ?
Referкncias sгo referencia de uma variбvel ou array que nгo mudam de valor, ou seja, elas sу
mudam dentro da funзгo executada, e apуs isto elas voltam ao valor original por exemplo:
pawn Code:
stock Multi(&Soma){
return Soma * 2;
}
Quando usamos uma variбvel para utilizar a funзгo criada, ela nгo serб modificada globalmente,
somente localmente, veja os exemplos:
pawn Code:
new MinhaVariavel = 2; // criei uma variбvel simples com o valor 2.
printf("Multiplicado: %d", Multi(MinhaVariavel)); // Exibe a soma de 2 x 2 = 4.
Todos nуs sabemos se fosse uma funзгo normal o valor de MinhaVariavel teria
modificado, mais como й por referкncia, isto nгo ocorre.
E ao imprimir o valor da nossa variбvel returnarб o valor 2 novamente.
pawn Code:
printf("Valor: %d", MinhaVariavel);
Callbacks:
Bom, essa й a parte que meche na estrutura do script, ela й responsбvel por
manipulamento da grande parte da maioria do servidor, sгo nelas que sгo
chamados todos os eventos do servidor, e agora vocк saberб manipula-las.
As callbacks sгo chamadas quando ocorre algum evento no servidor(como
dito antes), para explicar melhor vamos pegar a callback "OnPlayerConnect",
Essa callback й chamada quando o player conecta, ao player conectar tudo
que estiver nesta callback й executada.
Mais eai, como crio uma callback ?
Й muito fбcil, basta seguir a seguinte fуrmula:
pawn Code:
forward nome_callback(parametros);
public nome_callback(parametros)
{
return true;
}
qualquer tentativa resultarб em erro. E tambйm que se tentar criar uma callback
sem declarar resultarб em erro tambйm.
E sobre Funcionalidade, ela й basicamente a mesma coisa que uma "Funзгo",
somente a diferenзa que nгo returna strings.
Expressхes:
Eu acho esta parte mais essencial para programaзгo em geral, por iso vocк
tem que entender bem e se esforзar, pois nela que vocк aprenderб a manipular
nъmeros.
Bom, vamos aprender primeiramente as expressхes matemбticas, das quais
nуs usamos para calcular nъmeros, elas sгo:
Expressгo | Explicaзгo |
++ | Usado para incrementar que serб sempre +1 |
-- | Usado para decrementar que serб sempre -1 |
* | Usado para multiplicar |
/ | Usado para dividir |
+= | Adiciona um valor hб sua variбvel |
-= | Retira um valor de sua variбvel |
*= | Multiplica um valor para sua variavel |
/= | Divide um valor para sua variбvel |
Uso:
pawn Code:
Variavel ++; // Adiciona +1 hб nossa variбvel;
Variavel --; // Remove -1 da nossa variбvel;
Variavel = (2 * 2); // Seta o valor da variavel para 4 (2*2);
Variavel = (2 / 1); // Seta o valor da variavel para 2 ( 2 / 1 = 1);
Variavel += 2 ;// Adiciona +2 em nossa variбvel;
Variavel -= 2; // Remove -2 de nossa variбvel;
Variavel *= 2; // Multiplica por 2 a nossa variбvel;
Variavel /= 2; // Divide por 2 a nossa variбvel;
Essas sгo as expressхes matemбticas, e agora vamos as expressхes
de condiзхes:
Expressгo | Explicaзгo |
> | Maior que |
< | Menor que |
>= | Maior ou igual que |
<= | Menor ou igual que |
!= | Diferente de |
== | Igual que |
pawn Code:
if(Variavel > 10)// Verifica se a Variavel й maiorque 10;
if(Variavel < 10)// Verifica se a Variavel й menor que 10;
if(Variavel >= 10)// Verifica se a Variбvel й maior ou igual hб 10;
if(Variavel <= 10)// Verifica se a Variбvel й menor ou igual hб 10;
if(Variбvel != 10)// Verifica se a Variбvel й diferente de 10;
if(Variбvel == 10)// Verifica se a variбvel й igual hб 10.
Agora vamos falar um pouco sobre os operadores lуgicos:
que sгo eles:
Operador | Significado |
|| | Ou |
&& | E |
Os operadores lуgicos || e && sу tem uma explicaзгo, e sгo
sempre utilizados em condiзхes, vamos hб explicaзгo primeiro:
Operador ||:
Este operador verifica mais de uma condiзгo, se uma delas for
verdadeira a condiзгo returna true, veja o exemplo:
pawn Code:
if(Variavel == 10 || Variavel == 20) / /Verifica se a Variavel й igual б 10 OU igual б 20
Operador &&:
Este operador й diferente do decima, ele verifica se todos as condiзхes
contidas sгo verdadeiras:
pawn Code:
if(Variavel == 10 && Variavel < 20) //Verifica se a Variavel й igual hб 10 e menor que 20, caso esta condiзгo estiver verdadeira ele executa oque estб abaixo.
Acho que nгo precisa mais explicar sobre o assunto, porque o mesmo estб claro.
Looping:
O Looping й uma repetiзгo com condiзхes diferentes(as vezes) mais na grande maioria
ele serve para fazer repetiзхes das quais nгo precisamos ficar chamando a mesma funзгo
vбrias vezes.
Por exemplo, queremos exibir o nome SuYaNw no console 10 vezes, como fizemos ?
Jeito errado:
pawn Code:
printf("SuYaNw");
printf("SuYaNw");
printf("SuYaNw");
printf("SuYaNw");
printf("SuYaNw");
printf("SuYaNw");
printf("SuYaNw");
printf("SuYaNw");
printf("SuYaNw");
printf("SuYaNw");
pawn Code:
for(new i; i != 10; ++i){
printf("SuYaNw");
}
Explicaзгo:
O Looping for tem uma formula muito fбcil de manipular, irei explicar:
Looping FOR:
Como no exemplo abaixo, ele cria a variбvel i e depois verifica se i != de 10,
caso for diferente de 10 ele vai adicionando +1( usando incrementaзгo ++),
e se a variбvel i chegar ao valor 10 o loop para automaticamente
Lembrando que o 10 й o nъmero de vezes que o loop serб executado
pawn Code:
for(new i; i != 10; ++i){
}
O mesmo efeito usando outro tipos de loopings:
Looping: While
Bom, o loop while й parecido com o FOR, sу que tem que criar separadamente as funзхes,
veja:
pawn Code:
new i; // criamos a variбvel i
while(i != 10){ // verificamos se i й diferente de 10
printf("SuYaNw");
i ++; // incremente a variбvel i + 1.
}
Looping: Do..While
Este sistema de loop й parecido com o de cima,
pawn Code:
new i; // criando a variбvel i.
do{
printf("SuYaNw");
i ++;
};
while(i != 10);
Bom por enquanto й isto, entгo por favor, aguardem a segunta parte para vocкs "Manipular"
oque vocкs aprenderam neste tutorial.