SA-MP Forums Archive
[Tool/Web/Other] Aprende Pawn. Scripting Basico. - Printable Version

+- SA-MP Forums Archive (https://sampforum.blast.hk)
+-- Forum: Non-English (https://sampforum.blast.hk/forumdisplay.php?fid=9)
+--- Forum: Languages (https://sampforum.blast.hk/forumdisplay.php?fid=33)
+---- Forum: Español/Spanish (https://sampforum.blast.hk/forumdisplay.php?fid=29)
+----- Forum: Lanzamientos/Releases (https://sampforum.blast.hk/forumdisplay.php?fid=59)
+----- Thread: [Tool/Web/Other] Aprende Pawn. Scripting Basico. (/showthread.php?tid=554993)



Aprende Pawn. Scripting Basico_ES - edpibes22 - 06.01.2015

Bueno amigos, les traigo esta pequeсa guнa del cуdigo pawn, es el primer tutorial de una serie de tutoriales, esta guнa es la de wiki.sa-mp pero esta traducida por mi!

1.-Si ves faltas de ortografнa puedes informбrmelo-Te lo agradecerнa.
2.-Si bien ves no todo es muy entendible, esto se debe a que necesitas terminar de ver todos los tutoriales para poder entender dicho cуdigo pawn.
3.-Por favor, no tomas esto como una fuente de insultos, es solo un aporte que espero que les sirva a varias personas!

PD: Todo absolutamente todo fue traducido por mi. si tienes dudas sobre algo no dudes en preguntar!

GUIA PAWN EN ESPAСOL


INICIO

Bueno para empezar les mostrare un codigo simple que comun mente es usado.

Code:
#include <a_samp>
 
main()
{
	print("Hello World!");
	return 1;
}
Los diferentes aspectos los veremos uno a su vez! Usaremos este codigo como base.

INCLUDE-Incluir

Bueno un include es usado para cargar el script-codigo que se encuentra en pawno/include/miinclude.inc.

El include basicamente es un script-codigo que define varias funciones, ya que en muchos casos es muy molesto definir funciones o callback en nuestro gamemode o filterscript.

Code:
#include <a_samp>
Aca podemos ver la definicion de un include.
# =Esto signo es para indicar que se definira algo.
include =Esto indica que se definira o llamara un include.
<a_samp> =Aka indica el include que se define o se llama.
< > = este signo es necesario para decir o indicar que es un archivo .inc

CALLS-Llamada

Esto es usado para llamar funciones o callback. En el primer codigo muesta a main() esta funcion es llamada para describir o interpretar textos posiblemente en la consola o en el servidor.

Code:
return 1;
return =Sirve para devolver algun valor o accion. Aka se puede devolver el codigo escrito anteriormente o devolver a otra funcion.

1 = Reprensenta la devolucion al dicho codigo anterior.
0 = Significa que no devolvera ningun valor.

DECLARACIONES

Las lнneas de impresiуn y de retorno tienen ';' (Punto y coma) en ellos, esto sуlo indica el final de un estado (un estado es un grupo de una o mбs funciones y operadores que en conjunto hacen algo, similar a una frase en lenguaje comъn). La mayorнa de la gente pone declaraciones separadas en lнneas separadas, pero esto no es necesario, sуlo hace las cosas mбs claras, lo que sigue es igualmente vбlida:

Code:
main() { print("Hello World!"); return 1; }
Los {} s (frenos (brackets rizado), y no con parйntesis (entre parйntesis)) encierran un grupo de instrucciones que se deben ejecutar en conjunto (como un pбrrafo en el lenguaje comъn).

Code:
main()  print("Hello World!"); return 1;
Usted recibirб un error porque ahora el "retorno 1"; no se agrupa por lo que no es parte de main(). Grupo de Parйntesis: un conjunto de estados en un solo estado (llamado una sentencia compuesta) y las funciones tienen un ъnico estado con ellos. Sin la impresiуn de llaves y devoluciуn son totalmente declaraciones por separado, por lo que hay dos, como una funciуn sуlo puede tener una ъnica sentencia, la segunda no estб en una funciуn.
Pero, en general, se puede ampliar sentencias compuestas con el uso de la (,) operador coma pero esto no es sugerido, ya que no es la mejor prбctica de codificaciуn. Un ejemplo es el siguiente:
Code:
main()  print("Hello World!"), return 1;
FUNCIONES
Una funciуn es bбsicamente un trozo de cуdigo que hace algo y se puede decir que hacer esta cosa de otro lugar. Tambiйn puede pasar datos sobre lo que hizo volver al lugar que le dijo que se ejecute (en lugar que "llame”).
Llamada
Code:
print("Hello World!");
Como se describe en Inicio , esto llama a la funciуn llamada "print" (definido en a_samp.inc, por lo que usted lo necesita para incluirlo) y le dice a “El” para en la consola la (plabra hola) Una funciуn consiste en el nombre de la funciуn (por ejemplo, print), que indica al sistema el trozo de cуdigo que desea llamar, y una lista de parбmetros, encerrado en () despuйs de que el nombre de la funciуn, pasan de datos adicionales a la funciуn de ayudar a que correr. Si no tiene parбmetros que se necesita millones de funciones:
Code:
printa();
printaa();
printab();
printac();
etc...
Las funciones pueden tener tantos parбmetros como quieras, desde 0 (puede haber un lнmite superior, pero es por lo menos 12:
Code:
printf("Hello World!", 1, 2, 3, 4, 5, 6);
No te preocupes por lo que hace esa funciуn, por ahora, sуlo tiene 7 parбmetros, cada uno separado por una coma.
Definiciуn
Ademбs de ser capaz de llamar a las funciones ya existentes tambiйn se puede escribir y llamar a su propia:
Code:
#include <a_samp>
 
main()
{
	return MyFunction();
}
 
MyFunction()
{
	print("Hello World!");
	return 1;
}
Esto sуlo hace exactamente lo mismo que el cуdigo original, pero estб escrito de manera diferente. main () es llamado cuando se inicia el modo (se llama automбticamente) llama a la nueva funciуn personalizada llamada MyFunction ().Esta funciуn imprime el mensaje en la consola del servidor entonces devuelve el nъmero 1 a main (). main () toma el valor devuelto (1) y luego la devuelve al servidor sн mismo (es decir, el lugar que llama principal en el primer lugar). Como "volver MyFunction ();" es un estado ъnico que podнa hacer:




Code:
#include <a_samp>
 
main() return MyFunction();
 
MyFunction()
{ 
	print ( "Hola Mundo!" ) ;
	 volver  1 ;
 }
Pero la mayorнa de las personas no lo hacen por motivos de claridad. Tampoco se puede utilizar el valor de retorno MyFunction en absoluto y hacer:
Code:
#include <a_samp>
 
main()
{
	MyFunction();
	return 1;
}
 
MyFunction()
{
	print("Hello World!");
	return 1;
}
Parбmetros
Los parбmetros son un tipo de variables que no es necesario declarar como vienen desde el lugar que llamу a la funciуn:
Code:
#include <a_samp>
 
main()
{
	return MyFunction("Hello World!");
}
 
MyFunction(string[])
{
	print(string);
	return 1;
}
Este cуdigo todavнa hace lo mismo, pero ahora estamos diciendo MyFunction () lo que se vea. La llamada pasa la cadena "Hola Mundo!" a la funciуn de donde se almacena en una cadena variable llamada (el [] significa que es una matriz tal como se explica mбs adelante). La funciуn de impresiуn se la llama, pasa el contenido de la variable de cadena, sabemos que es una variable, ya que no tiene el ""de mas.
Variables
Una variable es bбsicamente un poco de memoria, es donde se almacenan los datos y se puede cambiar y leer segъn se requiera. Las variables son una o mбs cйlulas, una cйlula es de 32 bits (4 bytes) grandes y por defecto firmу para que puedan almacenar -2147483648-2147,483647 millones (aunque -2147483648 no estб bien definido en PAWN y da resultados extraсos si aparece). Una variable a partir de mбs de una cйlula se llama una matriz, las cadenas son un tipo especial de matriz donde cada cйlula tiene un carбcter de la cadena (o 4 caracteres en cadenas envasados, pero no estбn cubiertos aquн).

Declaraciуn
Para crear una nueva variable se tiene que declarar:
Code:
new
	myVariable;
Esto le indica al sistema para crear una nueva variable llamada myVariable, el valor inicial de esta variable serб 0.
Ajuste
Code:
new 
	myVariable = 7 ;
Esto declara una nueva variable y fija su valor inicial a 7, por lo que la impresiуn de la variable ahora darб 7. Para mostrar una variable que no es una cadena tenemos que volver a la funciуn printf () como se mencionу anteriormente y hacer:
Code:
new
	myVariable = 7;
printf("%d", myVariable);
Una vez mбs, por ahora todo lo que necesita saber es que esto imprimirб el valor de myVariable (es decir, 7 en este punto) en el servidor.


Code:
new
	myVariable = 7;
printf("%d", myVariable);
myVariable = 8;
printf("%d", myVariable);
Ese cуdigo imprimirб 7, cambie el valor de la variable a 8 y mostrara el nuevo valor en la ventana del servidor tambiйn. Hay muchas otras cosas que usted puede hacer con variables, algunas se enumeran a continuaciуn, la mayorнa se enumeran en otra parte:
Code:
myVariable = myVariable + 4 ;
Establece el valor de myVariable al antiguo valor de myVariable plus 4, es decir, aumentar su valor por 4. Esto tambiйn se puede escribir como:
Code:
myVariable += 4 ;
Lo cual significa "aumentar myVariable por 4".
Code:
myVariable -= 4 ;
Esto disminuirб el valor por 4.
Code:
myVariable *= 4 ;
Esto multiplicarб el valor por 4.
Code:
myVariable /= 4 ;
Eso dividira el valor por 4.
Arrays
Declaraciуn
Una matriz es una variable en la que puede almacenar mъltiples piezas de datos a la vez y acceder a ellos de forma dinбmica. Una matriz se declara a un tamaсo de conjunto en tiempo de compilaciуn por lo que necesita saber cuбntas piezas de datos necesita para almacenar de antemano, un buen ejemplo de esto es la matriz MAX_PLAYERS muy comъn, esto tiene una ranura para cada jugador, posiblemente conectado , para que sepa que los datos de un jugador no interferirбn con los datos de otro jugador.
Code:
new
	myArray[5];
Ese cуdigo serб declarar una matriz de 5 ranuras grandes, asн que usted puede almacenar 5 piezas de datos normales a la vez en que solo lo que no puedes hacer es algo como lo siguiente:
Code:
new
	myVariable = 5,
	myArray[myVariable];
Ese cуdigo parece que serнa crear una matriz del tamaсo de cualquier nъmero, se almacena en myVariable (aquн 5, pero podrнa ser cualquier cosa), pero no se puede hacer esto. En PAWN se asigna la memoria para las variables cuando se compila el cуdigo, esto significa que las matrices son siempre un tamaсo, no se puede establecer el tamaсo a lo que quieras cuando quieras.
Accediendo
Para establecer un valor en una matriz tiene que decir quй en que parte de la matriz desea almacenar los datos, esto se puede hacer con otra variable:
Code:
new
	myArray[5];
myArray[2] = 7;
Esto declara una matriz con 5 ranuras y dar a la tercera ranura un valor de 7, dado que las variables siempre comienzan como 0 esto harб que los valores de la matriz sean:
Code:
0, 0, 7, 0, 0
їPor quй es que no:
Code:
0, 7, 0, 0, 0
usted se estб preguntando? Es porque contando realidad comienza desde el nъmero 0 y no por 1. Considere lo siguiente:
Code:
2, 4, 6, 8
Si usted va a travйs de la lista a continuaciуn, despuйs del nъmero 2 que ya han tenido un nъmero (el 2), esto significa que si usted estб contando los nъmeros en el momento en que llegue al nъmero 4 ya estб en uno, no estбs en uno al llegar a la 2, que estб en cero. Asн, el 2 es en la posiciуn cero y el 4 es en la posiciуn uno, y por lo tanto se deduce que la 6 estб en la posiciуn dos, que es donde el 7 en el primer ejemplo anterior es. Si etiquetamos las ranuras para el primer ejemplo tenemos:
Code:
0 1 2 3 4
0 0 7 0 0
Hay cinco ranuras,como se puede ver, y esto es muy importante, no hay ninguna ranura CINCO, haciendo lo siguiente podrнa estrellar su servidor:
Code:
new
	myArray[5];
myArray[5] = 7;
Como se mencionу anteriormente el нndice de matriz (el нndice es el slot al que estб escribiendo) puede ser cualquier cosa, un nъmero, una variable, o incluso una funciуn que devuelve un valor.
Code:
new
	myArray[5],
	myIndex = 2;
myArray[myIndex] = 7;
Una vez que tenga una matriz y un нndice que puede utilizar ese bloque exactamente como si se tratara de cualquier otra variable:
Code:
myArray[2] = myArray[2] + 1;
myArray[2] += 1;
myArray[2]++;
Ejemplo
Como se mencionу anteriormente un tipo comъn de matriz es la matriz MAX_PLAYERS. MAX_PLAYERS no es una variable, esto define lo que se explica mбs adelante, pero por ahora aceptar que es un nъmero constante igual al nъmero mбximo de jugadores que un servidor puede mantener (esto por defecto es 500, aunque se cambie el nъmero en su archivo server.cfg). El siguiente cуdigo utiliza variables normales para contener datos para 4 jugadores y hacer algo con esos jugadores en una funciуn (por simplicidad asumen MAX_PLAYERS es 4 por ahora):



Code:
new
	gPlayer0,
	gPlayer1,
	gPlayer2,
	gPlayer3;
 
SetPlayerValue(playerid, value)
{
	switch(playerid)
	{
	    case 0: gPlayer0 = value; // is the same as doing if(playerid == 0)
	    case 1: gPlayer1 = value; // is the same as doing if(playerid == 1)
	    case 2: gPlayer2 = value; // is the same as doing if(playerid == 2)
	    case 3: gPlayer3 = value; // is the same as doing if(playerid == 3)
	}
}
Vea la secciуn sobre las estructuras de control para obtener mбs informaciуn sobre lo que estб pasando allн, tambiйn tenga en cuenta que esto podrнa hacerse como un interruptor, pero eso es menos clara para el ejemplo y efectivamente el mismo cуdigo de todos modos.
Ahora compara eso con el uso de una matriz con una ranura por jugador, teniendo en cuenta un нndice de matriz puede ser cualquier valor:
Code:
new
	gPlayers[MAX_PLAYERS];
 
SetPlayerValue(playerid, value)
{
	gPlayers[playerid] = value;
}
Eso crearб una matriz global (vйase la secciуn sobre el alcance) con una ranura para cada jugador, entonces la funciуn asignarб lo que estб en el "valor" variable a la ranura para el jugador especificado. El primer ejemplo era grande, con sуlo cuatro jugadores, con 4 lнneas por jugador, eso es 2.000 lнneas para 500 jugadores (si puede ser menor, pero aъn asн es mucho), la segunda versiуn es una sola lнnea sin importar el nъmero de jugadores que tiene.
STRING
__________________________________________________ __________________________
Uso bбsico
Una cadena es un tipo especial de matriz, una que se utiliza para contener mъltiples personajes para crear una palabra o frase u otro texto legible por humanos. Un carбcter es un byte de largo (aunque no se extienden conjuntos donde un personaje es mъltiples bytes, pero estos no estбn bien definidos en SA: MP) y por defecto un carбcter ocupa una celda (una variable normal o una ranura de matriz). Los caracteres se codifican en un sistema llamado ASCII , el carбcter "A" estб representada por el nъmero 65, diciendo que el sistema muestre un nъmero darб 65, diciendo que el sistema muestre un personaje darб un Capital. Obviamente es un carбcter ъnico ocupa una sola cйlula de mъltiples caracteres (es decir, de texto) se ocuparб de varias celdas, colecciones de cйlulas, como se acaba de explicar, se llaman matrices.
Las cadenas en PEУN (y otros idiomas) son lo que se llama "NULL terminado", esto significa que cuando se alcanza 0, la cadena. Esto no es lo mismo que el carбcter "0", representada por el nъmero 48, este es el carбcter nulo, representado por el nъmero 0. Esto significa que usted puede tener una matriz de cadenas 20 cйlulas grandes, pero sуlo tienen una cadena de 3 caracteres Si el cuarto carбcter es el carбcter nulo, seсalando el final de la cadena. No se puede sin embargo, tiene una cadena de 20 caracteres de longitud como el carбcter NULL DEBE estar en la cadena, por lo que en una matriz de 20 cйlulas se puede tener una cadena de caracteres 19 y un carбcter de terminaciуn NULL.
Code:
new
	myString[16] = "Hello World!";
Ese cуdigo declara una nueva cadena con el espacio suficiente para una cadena de 15 caracteres y lo establece inicialmente a la cadena de 5 caracteres "Hello World!", Las comillas alrededor del texto indican que se trata de una cadena.Internamente, la gama se verб asн:
Code:
104 101 108 108 111 0 xxxxxxxxxx
La "x" quiere decir nada, en este ejemplo que todo serб 0, pero que a ellos despuйs de que el carбcter nulo no importa lo que son, que no afectarб a la cadena.
Las cadenas pueden ser manipulados como matrices normales, por ejemplo:
Code:
new
	myString[16] = "Hello World!";
myString[1] = 97;
Va a cambiar el carбcter en la ranura 1 a la naturaleza representada por el nъmero 97 (a minъscula "a"), lo que resulta en la cadena de la lectura "hello". Esto se puede escribir mucho mбs legible y fбcil de editar como:
Code:
new
	myString[16] = "Hello World!";
myString[1] = 'a';
Las comillas simples alrededor de la "a" significa que es un personaje, no es una cadena, los personajes no tienen que ser terminada en nulo, ya que sуlo alguna vez una cйlula de largo, tambiйn se pueden utilizar indistintamente con nъmeros si usted sabe lo que representan .


Code:
new
	myString[16] = "Hello World!";
myString[1] = '\0';
'\ 0' es de dos personajes, sin embargo, el \ es un carбcter especial que modifica el carбcter siguiente, \ 0 significa NULL, ese cуdigo es lo mismo que:
Code:
new
	myString[16] = "Hello World!";
myString[1] = 0;
Pero no es lo mismo que:
Code:
new
	myString[16] = "Hello World!";
myString[1] = '0';
Las primera y segunda versiones resultarбn en la cadena simplemente:
Code:
h
La tercera versiуn resultarб en la cadena:
Code:
h0llo
Carбcter de escape
Como se ha mencionado brevemente una barra invertida es un carбcter especial, haciendo:
Code:
'\'
o:
Code:
"\"
Darб un error de compilaciуn porque el \ modifica el siguiente carбcter por lo que esas constantes no se a finalizado correctamente, esto puede ser usado para crear caracteres que normalmente no pueden ser creados, por ejemplo:

Code:
new
	myString[4] = "\"";
Ese cуdigo crearб una cadena que consiste en sуlo una doble cita, normalmente una doble cita seсala el final de una cadena escrita pero la barra invertida hace que la doble cita inmediatamente despuйs de que una parte de la cadena, y la doble cita despuйs de que termina la cadena en lugar . Otros caracteres especiales son:
Code:
\ 0	Carбcter NULL    	Finaliza una cadena.
EOS	Carбcter NULL    	(Igual al anterior)
\ N	Salto de lнnea      	utilizar \ n para una nueva lнnea en Linux (tambiйn funciona en Windows)
\ R	Retorno de carro 	Use \ r \ n para una nueva lнnea en Windows
\\	Backslash          	Se utiliza para poner una barra invertida real en una cadena
\ '	Comilla simple      	Se utiliza para utilizar una comilla simple real como un carбcter entre comillas simples (uso: '\' ')
\ "	       Las comillas dobles         	Se utiliza para poner una doble cita real en una cadena
\ Xnnn;	Nъmero hexadecimal      	Se utiliza para establecer el carбcter al personaje representado por el nъmero hexadecimal especificado en su lugar en NNN
\ NNN;	Nъmero      	Se utiliza para establecer el carбcter al personaje representado por el nъmero especificado en lugar de NNN (ver \ 0)
Hay otros, pero esos son los principales.

Etiquetas
Una etiqueta es una pieza adicional de informaciуn sobre una variable que define el lugar donde se puede usar, proporcionando informaciуn sobre su funcionalidad. Las etiquetas pueden ser fuertes (comenzando con una letra en mayъscula) o dйbil. Por ejemplo:
Code:
new
    Float:a = 6.0;
La parte "float" es la etiqueta, esto define esta variable como un flotador (no enteros / nъmero real) y determina donde se puede utilizar.
Code:
native SetGravity(Float:gravity);
Esto significa que la funciуn setGravity toma un ъnico parбmetro que tiene que ser un flotador, por ejemplo:
Code:
SetGravity(6.0);
Code:
new
   Float:fGrav = 5.0;
SetGravity(fGrav);
Que establecerб la gravedad al 6 (6.0 como un flotador) y luego 5 (5.0 como un flotador). Usando la etiqueta equivocada en el lugar equivocado con frecuencia a un desajuste de la etiqueta:
Code:
SetGravity(MyTag:7);
Que intentarб establecer la gravedad a 7 con la etiqueta "MyTag", es claramente no es un "flotador", por lo que estб mal. Tambiйn tenga en cuenta que las etiquetas son sensibles a mayъsculas.
Las etiquetas personalizadas pueden ser definidos por los usuarios:
Code:
new myTag: variable = 0,
 
    AppleTag: another = 1;
Esto es perfectamente vбlido, sin embargo, cuando la adiciуn de estas dos variables directamente , debe utilizar '_:' a 'de-tag', de lo contrario el compilador producirб una advertencia de "etiqueta desajuste '.
Alcance
Alcance es donde se puede utilizar una variable. Hay cuatro бmbitos principales: local, estбtico estбtico, global y local global. Todas las variables sуlo se pueden utilizar despuйs de que se declaran asн que esto es correcto:
Code:
new
    var = 4;
printf("%d", var);
Esto estб mal:


Code:
printf("%d", var);
new
    var = 4;
local
Una variable local se declarу un "new" dentro de una funciуn o parte de una funciуn:
Code:
MyFunc()
{
    new
        var1 = 4;
    printf("%d", var1);
    {
        // var1 still exists as this is a lower level
        new
            var2 = 8;
        printf("%d %d", var1, var2);
    }
    // var2 no longer exists as this is a higher level
}
// var1 no longer exist
s
Las variables locales se restablecen cada vez, por ejemplo:
Code:
for (new i = 0; i < 3; i++)
{
    new
        j = 1;
    printf("%d", j);
    j++;
}
Imprimirб:
Code:
1
1
1
Debido a que se crea j, impreso, incrementa entonces destruido, entonces el cуdigo de bucles.
estбtica local
Un local de estбtica puede ser utilizado en el mismo lugar que un local, pero no olvida que es antiguo valor, por ejemplo:



Code:
MyFunc()
{
    static
        var1 = 4;
    printf("%d", var1);
    {
        // var1 still exists as this is a lower level
        static
            var2 = 8;
        printf("%d %d", var1, var2);
    }
    // var2 no longer exists as this is a higher level
}
// var1 no longer exists
Ese cуdigo se comportarб exactamente el mismo que el nuevo ejemplo, sin embargo esto:
Code:
for (new i = 0; i < 3; i++)
{
    static
        j = 1;
    printf("%d", j);
    j++;
}
Imprimirб:
Code:
1
2
3
Debido a que j es estбtico, lo recuerda su antiguo valor.
global
Las variables globales se declaran fuera de una funciуn y pueden ser utilizados en cualquiera de las funciones:
Code:
new
    gMyVar = 4;
 
MyFunc()
{
    printf("%d", gMyVar);
}
Ellos nunca se restablecen o pierden.


estбtica mundial
Variables estбticas globales son como globales normales, pero sуlo se pueden utilizar en el archivo en el que se declaran:
Archivo1:
Code:
static
    gsMyVar = 4;
 
MyFunc()
{
    printf("%d", gsMyVar);
}
 
#include "File2"
Archivo2:
Code:
MyFunc2()
{
    // This is wrong as gsMyVar doesn't exist here
    printf("%d", gsMyVar);
}
estбtico tambiйn se puede aplicar a las funciones de la misma manera.

Creditos: https://sampwiki.blast.hk/wiki/Scripting_Basics
Doblado al Espaсol por: Edmundo Abraham Guerrero Morataya. https://www.facebook.com/Edguerreromora
PD: algunas cosas no estan bien explicadas pues eso se debe a que para entenderlas mejor deves ver los demas tutoriales.


NOTA: Este tutorial es exclusivamente a personas interesadas en aprender pawn.

Espero que todo lo anterior te allб sido ъtil.