Introdução :
Bom, eu desenvolvi este tutorial com os erros mais comuns entre os novos,
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 vem 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ê vai 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 considerados neste tуpico serгo:
- Diretivas;
- Variáveis;
- Constantes;
- Enumeradores;
- Arrays
- Funções;
- Chamadas de retorno;
- Expressões;
- Loopings.
D iretivas:
Vamos começar o tutorial falando sobre diretivas, oque só, qual sua função e
como usá-las.
Bom como 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:
- Código:
#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 encontrar.
Diretiva: #define
No seu cуdigo PAWN:
- Código:
[size=14][size=13]#define Vermelho 0xFF0000FF
SendClientMessageToAll ( Vermelho, "Esta é uma frase em vermelho" ) ;[/size][/size]
[center][size=14]Depois de compilar, seria a mesma coisa que:[/size][/center]
[size=14]Código do peão:
[size=13]SendClientMessageToAll ( 0xFF0000FF, "Esta é uma frase em vermelho" ) ;[/size][/size]
diferença nenhuma, pois os dois cudigos acima são exatamente a
mesma coisa, somente que o compilador
troca "Vermelho" para "0xFF0000FF".
Para entender:
- Código:
#define APELIDO SIGNIFICADO
no in-game, agora que você já sabe que as definições são apenas "Apelidos"
que o peão troca pelo significado.
Agora vamos aprender sobre as principais diretivas do pawno, também
vou mostrar 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:
criamos uma definição:
- Código:
#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á transmitida:
- Código:
#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 tenha ela, apareçam erros.
- Código:
#define ATIVAR_MENSAGEM false// podemos considerar que 'true' é sim 'false' é nгo.
Quando falamos em "Condicionamento" logos pensando 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 especificam com
precisão ou valor da definição.
Operador: < (Menor que), no exemplo abaixo você pode notar que ele está
verificando
se 20 for menor que ATIVAR_MENSAGEM
- Código:
#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:
- Código:
#if ATIVAR_MENSAGEM > 20
compara se a definiзгo й menor OU igual hб 20.
- Código:
#if ATIVAR_MENSAGEM <= 20
ele verifica se a definição é maior ou igual há 20:
- Código:
#if ATIVAR_MENSAGEM >= 20
é diferente de 20:
- Código:
#if ATIVAR_MENSAGEM != 20
, agora vou explicar algumas funções extras das instruções :
- Código:
#if definido ATIVAR_MENSAGEM
printf ( "Foi definido ATIVAR_MENSAGEM" ) ;
#endif
#if !defined ATIVAR_MENSAGEM
printf ( "Não foi definido ATIVAR_MENSAGEM" ) ;
#fim se
Diretiva: #else
A diretiva #else é utilizda como com a tradução simples "se não",
- Código:
#if definido ATIVAR_MENSAGEM // verificamos se ATIVAR_MENSAGEM está definido
[size=13]
[/size]
- Código:
printf ( "Foi definido ATIVAR_MENSAGEM" ) ; // imprimimos a mensagem
#else // caso nгo for definido 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:
- Código:
#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 o mesmo nome:
- Código:
#define ATIVAR_MENSAGENS
#define ATIVAR_MENSAGENS
Você também pode definir ela mesmo:
- Código:
#define ATIVAR_MENSAGENS ATIVAR_MENSAGENS
[size=24]Variáveis :[/size]
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 criar-las elas
terrão o valor 0 automaticamente.
Para testar
- Código:
novo MinhaVariavel;
printf ( "Valor de MinhaVariavel :%d" , MinhaVariavel ) ;
Operador/Expressão | Significado |
+= | Adiciona uma valor hà nossa variável |
-= | Remover 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 que você ver como modificar os valores, vamos aplicar:
- Código:
[size=14][size=13]novo MinhaVariavel;
MinhaVariavel += 10 ; // botamos
printf ( "Valor de MinhaVariavel :%d" , MinhaVariavel ) ; // Imprime 10 sem console.
MinhaVariavel -= 5 ; // removemos 5 da variável "MinhaVariavel"
printf ( "Valor de MinhaVariavel :%d" , MinhaVariavel ) ; // Imprime 5 sem console.
MinhaVariavel *= 2 ;
printf ( "Valor de MinhaVariavel :%d" , MinhaVariavel ) ; // Imprime 10 sem console.
MinhaVariavel /= 2 ;
printf ( "Valor de MinhaVariavel :%d" , MinhaVariavel ) ; // Imprime 5 sem console.
MinhaVariavel = 59 ;
printf ( "Valor de MinhaVariavel dividido por 8 resto da divisao é %d" , MinhaVariavel % 59 ) ; // Imprime 8 sem console.[/size][/size]
Sу lembrando que uma variбvel sу pode armazenar UM valor, e tambйm armazenar
um id, como por exemplo, veiculo:
- Código:
novo 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 ser objeto ou não.
[size=24]C onstantes:[/size]
Constantes são um tipo de variável que ficam constantemente no mesmo valor, ou seja,
é como se fosse uma definição.
- Código:
const MinhaConstante = 500 ; // vemos que a constante tem o valor 500
printf ( "Valor: %d" , MinhaConstante ) ;
- Código:
Valor: 500
Com constantes nгo é possível modificar o valor dela:
- Código:
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).
[size=24]E numeradores:[/size]
Enumeradores são um tipo de organização de array, nela são
armazenados valores que podem ser chamados a qualquer instante, veja:
- Código:
enum MeuEnumerador / * Iniciamos nosso enumerador com o nome "Meu enumerador"
{
Nivel
// Aqui dentro inserimos as "Tags" que serão armazenados os valores
} ; // Concluímos nosso enumerador, agora vamos utilizá-lo em nosso array.
novo PlayerInfo [ MAX_PLAYERS ] [ MeuEnumerador ] ; // Agora criamos um array com o nome "PlayerInfo", coma a dimensão "MAX_PLAYERS" e utilizamos as TAGs do enumerador "MeuEnumerador".
- Código:
PlayerInfo [ playerid ] [ nível ] = 50 ;
Ao usar uma tag inexistente no enumerador o PAWNO resultará em um erro, entгo mantendo
botar nome de tags fбceis de lembrar para nгo se esquecer rapidamente = )
[size=24]A rrays:[/size]
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 multivariáveis, com ela podem ser armazenadas vários valores diferentes,
similar a uma variável normal que só pode armazenar um valor simultaneamente.
Criamos um array normal contendo 5 células:
- Código:
novo MinhaArray [ 5 ] ;
Seria a mesma coisa que:
- Código:
novo MinhaArray0;
novo MinhaArray1;
novo MinhaArray2;
novo MinhaArray3;
novo MinhaArray4;
Voltando para o assunto Array, cada valor pode ser armazenado em uma célula,
só lembrando que a célula no que está entre colchetes "[" & "]".
Como nosso exemplo, criamos um array com 5 células:
- Código:
novo MinhaArray [ 5 ] ;
Para modificar os valores dos mesmos:
- Código:
MinhaArray [ 0 ] += 50 ; // Incrementa a "MinhaArray" célula "0" ou valor "50".
- Código:
printf ( "MinhaArray[0] Valor: %d Célula: 0" , MinhaArray [ 0 ] ) ;
- Código:
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 matriz tridimensional:
- Código:
novo MinhaArray [ 1 ] [ 20 ] [ 40 ] ;
- Código:
MinhaArray [ 1 ] [ 0 ] [ 0 ] = 10 ;
MinhaArray [ 1 ] [ 0 ] [ 1 ] = 50 ;
MinhaArray [ 1 ] [ 1 ] [ 25 ] = 30 ;
- Código:
printf ( "%d |%d | %d | " , MinhaArray [ 1 ] [ 0 ] [ 0 ] , MinhaArray [ 1 ] [ 0 ] [ 1 ] , MinhaArray [ 1 ] [ 1 ] [ 25 ] ) ;
Exemplo de array Bidimencional:
- Código:
novo MinhaArray [ 20 ] [ 15 ] ;
- Código:
MinhaArray [ 0 ] [ 1 ] = 20 ;
MinhaArray [ 5 ] [ 9 ] = 5 ;
Mostrando:
- Código:
printf ( "%d | %d" , MinhaArray [ 0 ] [ 1 ] , MinhaArray [ 5 ] [ 9 ] ) ;
Exibe: "20| 5".
Arrays de uma dimensão:
Exemplo de uma matriz normal(uma dimensão):
- Código:
novo MinhaArray [ 100 ] ;
Manipulando:
- Código:
MinhaArray [ 0 ] = 50 ;
MinhaArray [ 97 ] = 87 ;
Mostrando:
- Código:
printf ( "%d,%d" , MinhArray [ 0 ] , MinhaArray [ 97 ] ) ;
Cuidado ao acessar uma dimensão que não existe!
pois dará erro ou possíveis travamentos!
[size=24]F unções:[/size]
Bom, existem 2 tipos de funções, as funções nativas e as funções nela nгo-nativas,
vão explicar-las:
As funções nativas sгo as que vem juntamente com um packpage do SA-MP, você
pode encontrar funções que podem manipular o servidor totalmente,
sendo a maioria com parâmetros.
Essas funções podem formar um exemplo de uso:
- Código:
Chute ( playerid ) ; // Expulsa o player do servidor
mas note-se que ao adicionar mais um parâmetro o pawno returnará
há um erro, este erro é comum, então preste atenção bem a atenção ao usar
uma função da qual nгo saiba os parâmetros, caso tenha dъvidas, procure
o comando na Wiki.sa-mp que fala só sobre funções nativas.
As funciones 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б estava criado uma funзгo com
mesmo nome da outra com certeza retornarб hб erro, entгo vamos hб obra:
Mais eai, como criar diversão?
Para criar funções extras, basta seguir a seguinte fórmula:
- Código:
stock MinhaFuncao ( numero, texto [ ] , Float : NumerosFlutuantes ) {
printf ( "[%d]%s ele é %.1f" , numero, texto, Float : NumerosFlutuantes ) ;
}
- Código:
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, vou mostrar um exemplo umpouco mais extenso,
- Código:
stock ContarCaracteresNaFrase ( frase [ ] ) { // Observe que usei "[]" para indicar texto/string, veja a tabela abaixo.
novos personagens; // Cria uma variável para armazenar a quantidade de letras.
Caracteres = strlen ( frase ) ; // Seta a variável "Caracteres" para a quantidade de letras da "frase[]" usando a função strlen.
retornar Caracteres; // Retorna a quantidade de letras.
}
na função explicadas todas as funções de cada linha.
Para testa-la, use:
- Código:
printf ( "Esta frase tem %d letra(s)" , ContarCaracteresNaFrase ( "SuYaNw Lindo" ) ) ;
Tabela de tags para usar em funções:
Marcação | Uso | Funзгo |
Flutuar[/d] | stock MinhaFuncao(Float: vida) | Serve para nъmeros flutuantes |
Texto[/d] | stock MinhaFuncao(Float: Text) | Serve para manipular textdraws |
Cardápio[/d] | stock MinhaFuncao(Float: Menu) | Servir para manipular menus |
Texto3D[/d] | stock MinhaFuncao(Float: Text3D) | Serve para manipular textos 3d |
usadas estão citadas acima.
Usando 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 ?
As referências são referencias de uma variável ou array que não mudam de valor, ou seja, elas mudam
dentro da função executada, e depois disso elas voltam ao valor original por exemplo:
- Código:
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:
- Código:
nova 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 ou valor de MinhaVariavel teria
modificado, mais como й por referкncia, nгo ocorre.
E ao imprimir o valor da nossa variável returnará o valor 2 novamente.
- Código:
printf ( "Valor: %d" , MinhaVariavel ) ;
[size=24]Callbacks :[/size]
Bom, essa é a parte que meche na estrutura do script, ela é responsável pela
manipulação da grande parte da maioria do servidor, são nelas que são
chamados todos os eventos do servidor, e agora você saberá manipular- 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 é executado.
Mais eai, como crio uma callback ?
É muito fácil, basta seguir a seguinte fórmula:
- Código:
encaminhar nome_callback ( parâmetros ) ;
public nome_callback ( parametros )
{
return true;
}
qualquer tentativa resultará em erro. E também 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 retorna strings.
[size=24]E xpressхes:[/size]
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 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 variável |
/= | Divide um valor para sua variável |
Uso:
- Código:
Variável ++ ; // Adiciona +1 hà nossa variável;
Variavel -- ; // Remove -1 da nossa variável;
Variavel = ( 2 * 2 ) ; // Seta o valor da variável para 4 (2*2);
Variavel = ( 2/1 ) ; _ _ // Define o valor da variável para 2 ( 2 / 1 = 1); Variavel += 2 ; // Adiciona +2 em nossa variável; Variavel -= 2 ; // Remove -2 de nossa variável; Variavel *= 2 ;
[size=13]
// Multiplica por 2 a nossa variável;
[/size]
- Código:
Variável /= 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 |
- Código:
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 usado 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:
- Código:
if ( Variavel == 10 || Variavel == 20 ) / / Verifica se a Variavel é igual á 10 OU igual á 20
Operador &&:
Este operador é diferente da décima, ele verifica se todas as condições
contidas são tão verdadeiras:
- Código:
if ( Variavel == 10 && Variavel < 20 ) //Verifica se a Variavel é igual há 10 e menor que 20, caso esta condição seja verdadeira ele executa o que está abaixo.
Acho que não precisa mais explicar sobre o assunto, porque o mesmo está claro.
[size=24]Looping :[/size]
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 ganhando a mesma função
várias vezes.
Por exemplo, queremos exibir o nome SuYaNw no console 10 vezes, como fizemos ?
Jeito errado:
- Código:
printf ( "SuYaNw" ) ;
printf ( "SuYaNw" ) ;
printf ( "SuYaNw" ) ;
printf ( "SuYaNw" ) ;
printf ( "SuYaNw" ) ;
printf ( "SuYaNw" ) ;
printf ( "SuYaNw" ) ;
printf ( "SuYaNw" ) ;
printf ( "SuYaNw" ) ;
printf ( "SuYaNw" ) ;
- Código:
for ( new i; i != 10 ; ++ i ) {
printf ( "SuYaNw" ) ;
}
Explicação:
O Looping for tem uma fórmula muito fácil de manipular, vou explicar:
Looping FOR:
Como no exemplo abaixo, ele cria a variável ie depois verifica se i != de 10,
caso for diferente de 10 ele vai adicionar +1( usando incrementaзгo ++),
e se a variбvel i chegar ao valor 10 o loop para
lembrar automaticamente que o 10й o nъmero de vezes que o loop serб executado
- Código:
for ( novo i; i != 10 ; ++ i ) {
}
O mesmo efeito usando outros tipos de loopings:
Looping: While
Bom, o loop while é parecido com o FOR, só que tem que criar separadamente as funções,
veja:
- Código:
novo i; // criamos a variável i
while ( i != 10 ) { // verificamos se é diferente de 10
printf ( "SuYaNw" ) ;
eu ++ ; // incrementa a variável i + 1.
}
Looping: Do..While
Este sistema de loop é parecido com o de cima,
- Código:
novo eu; // criando uma variável i.
faça {
printf ( "SuYaNw" ) ;
eu ++ ;
} ;
enquanto ( i != 10 ) ;
Bom por enquanto é isto, entгo por favor, aguardem a segunda parte para vocкs "Manipular"
oque vocкs aprenderam neste tutorial.