bueno chicos. aquí tienen el segundo cap (las variables) es un enórme capítulo, así que cópienlo a un bloc de notas o algo por que de verdad, es muy grande y con varios sub apartados dentro. sin mas que decir, os dejo con la traducción del manual.
Si estuviste lo suficientemente despierto en las clases de matemáticas como para comprender los fundamentos de las ecuaciones, entender las variables debería ser pan comido. Pero para los que se quedaron dormidos o, como yo, decidieron que era mucho más entretenido jugar al ahorcado en el fondo de la clase, he aquí una sencilla explicación que debería resolver el misterio.
En pocas palabras, una variable es como una cesta que contiene algo. Una variable puede indicar la salud de un jugador en un juego de acción, el precio actual del pescado o que el significado de la vida es 42. Básicamente, puede contener cualquier valor que le des, y puedes recuperar y jugar con ese valor tanto como quieras. BGT soporta cinco tipos básicos de variables, dos de los cuales experimentaremos en este capítulo. Los tipos soportados son variables integrales, variables de punto flotante, variables de cadena, variables booleanas y variables de objeto. Pero antes de pasar a aprender sobre todos estos tipos diferentes, hay una cosa que tendremos que cubrir.
5.2. Declarar y asignar variables
Para establecer una variable, primero tiene que decirle a BGT qué tipo de variable está buscando usar, seguido de un nombre que usará para referirse a su variable la próxima vez que venga a cambiar o leer de ella.
Todas las variables deben tener un nombre. No hay excepciones. Un nombre de variable puede contener letras de la a a la z, incluidas las mayúsculas, los números del 1 al 0 y los subrayados. Sin embargo, el nombre de una variable nunca debe comenzar con un número, aunque es perfectamente legal tener números en cualquier otra parte del nombre.
Considere el siguiente ejemplo:
string your_name;
Esto le dice a BGT que queremos una variable de tipo cadena, llamada tu_nombre. Cuando vuelva a leer este código, sabrá que su_nombre es probable que contenga el nombre del jugador. De nuevo, tenemos un punto y coma al final para denotar el final de una declaración.
Ahora tenemos una variable en blanco. Para que esta variable sea utilizable necesitamos darle un valor. Podemos hacerlo utilizando uno de los dos métodos. Si ha predeterminado el contenido de la variable, es decir, un mensaje que puede ser mostrado al usuario, puede asignar el valor en la misma línea que la declaración, así:
string winning_message="Congratulations! You have won the game!";
Esto le dice a BGT:
- Crear una variable de tipo cadena. Las cadenas serán tratadas con más detalle en la sección de Variables de cadena.
- Llámela mensaje_ganador.
- Asigne el valor "¡Felicidades! Ha ganado el juego!" a winning_message.
- Fin de la declaración
Se puede asignar un nuevo valor a una variable en cualquier punto del bloque de código actual. Ten en cuenta que si no asignas un valor a una variable, sino que sólo la declaras como
tipo x;
type puede ser cualquier tipo de variable primitiva soportada por BGT (ver más abajo). Los objetos funcionan de forma diferente, pero esto se tratará más adelante. Si tiene una declaración como esta sin un valor inicial dado a la variable, entonces tendrá un valor indefinido. En otras palabras, puede ser cualquier cosa, dependiendo del tipo de la variable. Simplemente contendrá lo que sea que esté almacenado en esa ubicación de memoria en el momento en que la variable fue creada, y por lo tanto nunca debe usar una variable cuando no está aún inicializada con un valor. El compilador de scripts BGT intentará advertirle cuando vea que está haciendo esto, pero no puede hacerlo con precisión en todas las situaciones. Por lo tanto, siempre debe dar a sus variables valores iniciales cuando las cree, a menos que pueda asegurar con un 100% de certeza que la variable recibirá un valor significativo antes de ser utilizada.
Ahora que hemos discutido cómo configurar nuestras variables, podemos aprender sobre los diferentes tipos y sobre cómo cambiarlas y compararlas.
5.3. Variables integrales y melocotones malos
Las variables integrales son aquellas que contienen un entero básico, es decir, un número entero. Estas variables no admiten puntos decimales.
Puede realizar operaciones aritméticas sobre ellas como más, menos, veces y dividido por. BGT también admite funciones matemáticas más complejas, por si alguna vez las necesita. Si tiene curiosidad, aquí viene un ejemplo de cómo se pueden utilizar las variables integrales en el mundo real.
int apples=5;
int bananas=2;
int oranges=8;
int fruit_basket=apples+bananas+oranges;
Aquí se ven cuatro variables. Una llamada manzanas, otra llamada plátanos, una tercera llamada naranjas y finalmente una llamada cesta_frutas. Pero cuando le dimos un valor a cesta_fruta en realidad no especificamos un valor directamente, sino que sumamos los valores de las tres variables de tipo de fruta para obtener el número total de frutas en la cesta. Divirtámonos y veamos una versión ligeramente ampliada de este ejemplo.
int apples=5;
int bananas=2;
int oranges=8;
int fruit_basket=apples+bananas+oranges+1;
¿Por qué puse +1 al final? Porque también había un melocotón, pero se había estropeado, así que no me molesté en darle su propia variable. También demuestra claramente lo fácil que es mezclar variables y números literales en las expresiones, lo que técnicamente te permite escribir fórmulas extremadamente potentes si lo deseas.
Ahora vamos a elaborar un poco más y hacer algunos cálculos más con estas variables. Digamos que queremos averiguar cuántas frutas habría en la cesta si sólo se pusieran la mitad de las naranjas, más el melocotón malo. Podríamos hacer lo siguiente:
int apples=5;
int bananas=2;
int oranges=8;
int fruit_basket=apples+bananas+oranges+1;
int robbed_basket=fruit_basket-(oranges/2);
¿Adivina ahora qué valor tendrá la variable llamada robbed_basket? Así es, 12. La cesta contenía 16 frutas en total, de las cuales 8 eran naranjas. Luego quitamos la mitad de las naranjas, y así terminamos con 12.
Pero mira una vez más la línea donde la variable cesta_robada obtiene su valor. ¿Ves que hemos puesto parte del cálculo entre un paréntesis izquierdo y otro derecho? En este caso no significa que estemos llamando a algún tipo de función, aquí simplemente tiene el mismo propósito que en la aritmética regular que es asegurarse de que la expresión se calcula en el orden correcto. De esta manera, puedes calcular expresiones matemáticas avanzadas y estar seguro de que el resultado es siempre el esperado. Eso suponiendo que hayas escrito la expresión correctamente para empezar, lo cual está un poco fuera del alcance de este tutorial.
Te voy a dar un último ejemplo de cómo se pueden manipular las variables numéricas. Éste no tiene ninguna utilidad práctica; sólo pretende mostrar la flexibilidad de las variables numéricas, y cómo pueden utilizarse para realizar cálculos no permitidos en las matemáticas regulares. Echa un vistazo a lo siguiente...
int x=3;
x=x3;
int y=8;
int z=x/y;
z+=x-1;
x=z+4;
Como puede ver, sólo un montón de cálculos sin sentido que no sirven para nada más que para intentar demostrar algunas de las posibilidades que tiene cuando se trabaja con números en el lenguaje BGT.
Una cosa nueva que notará, sin embargo, es el uso de += y *=. Esto significa que, en el caso de *= el valor del lado derecho en la expresión matemática debe ser tomado por el valor actual de la variable. Así, por ejemplo:
int x=5;
x*=3;
Ahora x tendrá el valor de 15, ya que 5*3 es 15. Puedes utilizar todos los operadores numéricos, es decir, +, -, * y /, de la misma manera.
Hay un operador aritmético adicional que puedes utilizar, el operador Módulo. Se representa con un signo de porcentaje (%) y también puede utilizarse con el signo =. El Módulo divide dos números y le da el valor restante. Por ejemplo:
int x=11;
x%=3;
En este caso x será el equivalente a 2, ya que 11 dividido entre 3 es igual a 3, y le sobra 2. Ese 2 es el resultado del Módulo.
Hay otros dos operadores que ahorran tiempo y que puedes utilizar. Se conocen como operadores de autoincremento y autodecremento. Estos son ++ y -- (dos signos más, o dos signos menos). Son buenos para los contadores de bucle, etc.
Cuando escribimos la siguiente línea:
x++;
usted como escritor, y acelera el programa. Si está incrementando una variable una vez, puede que no note el cambio. Si, por otro lado, está cambiando constantemente un contador, notará la diferencia. Aunque una variable integral es de un tipo, puede especificar el rango potencial permitido de la variable. Los dos que suelen interesarle son short, un entero de 16 bits (2 bytes) que va de -32768 a 32767, y long, un entero de 32 bits (4 bytes) que va de -2147483648 a 2147483647.
En otras situaciones, aunque más ocasionales, se pueden utilizar enteros sin signo. Se trata de enteros que no admiten números negativos, por lo que duplican el límite máximo.
A continuación se presenta una lista completa de palabras clave relacionadas con los enteros:
- int8: Un entero de 8 bits (1 byte), que va de -128 a 127.
- int16: Un entero de 16 bits (2 bytes), que va de -32768 a 32767.
- int32: Un entero de 32 bits (4 bytes), que va de -2147483648 a 2147483647.
- uint8: Un entero de 8 bits (1 byte) sin signo, que va de 0 a 255.
- uint16: Un entero de 16 bits (2 bytes) sin signo, que va de 0 a 65535.
- uint32: Un entero sin signo de 32 bits (4 bytes), que va de 0 a 4294967295.
- int: Alias de int32.
- short: Alias de int16.
- long: Alias de int32.
- uint: Alias de uint32.
- ushort: Alias de uint16.
- ulong: Alias de uint32.
5.4. Variables de coma flotante
Las variables de punto flotante son muy similares a las variables con las que estás familiarizado si has trabajado con ecuaciones, contienen un número. Ni más ni menos. Las variables de punto flotante pueden ser con o sin decimales.
Todas las variables de punto flotante tienen signo, lo que significa que pueden ser números positivos o negativos.
Los tipos soportados son:
- Float: Punto flotante de 32 bits de precisión simple
- Doble: Doble precisión de 64 bits en coma flotante
Si no sabes qué valores van a ir en tu variable, probablemente sea mejor usar dobles, ya que soportan el rango más amplio, permitiendo números positivos y negativos, y números enteros y reales, es decir, números con decimales.
Otra cosa que hay que mencionar es que, si, por cualquier razón, el valor de una variable numérica intenta ir más allá de su límite, el compilador emitirá una advertencia y la variable se restablecerá al valor mínimo soportado, por lo que es esencial que mantengas un seguimiento de cualquier cambio que se produzca en tus variables.
5.5. Variables de cadena
Las variables de cadena son muy diferentes de las numéricas que acabamos de explorar. Sin embargo, son muy útiles, y pronto veremos por qué. Una variable de cadena puede contener texto, es decir, una cadena de caracteres simples que formarán algo interesante; de ahí el nombre, cadena. Una cadena puede contener el nombre del reproductor, una ruta en el disco duro o el contenido de un archivo, o cualquier otra cosa que desee. Cuando se utilizan valores de cadena siempre hay que rodearlos con comillas, para que el intérprete no se confunda en cuanto a lo que es código BGT y lo que es parte de su cadena. ¿Le suena eso? Así es... La función de alerta que utilizamos en nuestro primer ejemplo funciona con cadenas.
Creo que la mejor manera de entender las cadenas es verlas en acción. Así que aquí vamos...
string my_name="John Doe";
alert("My name is", my_name);
Como ves aquí, el primer parámetro de la función de alerta se sigue dando de la misma manera que lo hicimos en el primer ejemplo, pero la diferencia viene en el segundo parámetro. En lugar de especificar algo entre comillas para que se muestre en el cuadro de mensaje, hemos dado el nombre de la variable de cadena que acabamos de crear. ¿El resultado? Que "Juan Pérez" se imprime en el cuadro de mensajes con el título "Me llamo". Sí, ¡así de sencillo!
Ahora bien, ¿por qué no rodeamos mi_nombre con comillas en el segundo parámetro de la alerta? Porque eso imprimiría "mi_nombre" literalmente en lugar de tomar el valor de una variable llamada mi_nombre, y no queremos eso.
Intentemos hacer algo más elegante con las cadenas de texto, ¿de acuerdo?
string my_name="John Doe";
string message_string="My name is " + my_name + " and don't you ever forget it!";
alert("Important information", message_string);
string my_name="John Doe";
string message_string="My name is " + my_name + " and don't you ever forget it!";
alert("Important information", message_string);
¿Qué? ¿Qué es eso de " + nombre_de_la_variable + "? Bueno, " + nombre_de_la_variable + " simplemente inserta el valor de una variable en una cadena. Así que la impresión en el cuadro de mensajes será:
Me llamo Juan Pérez y no lo olvides nunca.
Y como habrás adivinado, la variable entre los dos signos más no tiene que ser necesariamente otra cadena. Ilustremos esto con un ejemplo ampliado...
string my_name="John Doe";
int age=23;
string message_string="My name is " + my_name + ", I'm " + age + " years old and don't you ever forget it!";
alert("Important information", message_string)
¿La impresión? Como probablemente esperas, será simplemente:
Me llamo John Doe, tengo 23 años y ¡no lo olvides nunca!
¿Te has dado cuenta de que también hemos utilizado un número entero?
Cualquier variable con cualquier tipo de datos puede colocarse en una variable de cadena, siempre que el resultado de esa variable pueda convertirse en una cadena.
Por supuesto, puedes construir la cadena de mensajes dentro de la llamada a la función de alerta; no tienes que hacer una variable separada para ella si no quieres. Podría hacer lo siguiente...
string my_name="John Doe";
int age=23;
alert("Important information", "My name is " + my_name + ", I'm " + age + " years old and don't you ever forget it!");
Naturalmente la impresión será la misma, el script es sólo una línea más corta.
Vamos a divertirnos un poco con el código de ejemplo de John Doe, y hagamos que haga algo ligeramente más interesante. Mira el siguiente fragmento y ve si puedes averiguar lo que hace.
string my_name="John Doe";
int age=random(5, 50);
string message_string="My name is " + my_name + ", I'm " + age + " years old and don't you ever forget it!";
alert("Important information", message_string);
Lo has adivinado. La función aleatoria que también proporciona el motor BGT, genera un número aleatorio en un rango que usted especifica. En este caso, solicitamos un número entre 5 y 50, lo que significa que Juan Pérez nos dirá una edad diferente cada vez que le preguntemos. La primera vez que ejecuté esto en mi máquina me dijo que John Doe tenía 25 años, la segunda vez me aseguró que tenía 36 y la tercera vez afirmó que tenía 18... ¡Hablando de un mentiroso patológico!
Dejando a Juan Pérez para que contemple su edad en paz, vamos a ver otro ejemplo de cómo se pueden sumar los hilos.
string string1="I am a ";
string string2="string!";
string string3=string1 + string2;
string string4=string1 + "nice " + string2;
El ejemplo anterior muestra lo sencillo que es sumar cadenas, tanto variables como valores literales. Mientras que la cadena1 y la cadena2 son valores literales almacenados en variables, la cadena3 es el resultado de esas dos variables sumadas y la cadena4 son las dos variables sumadas de nuevo pero con un valor literal en medio. Puede combinar las variables y los valores literales de la forma que desee, lo cual es bastante útil en un gran número de aplicaciones, como sin duda descubrirá si utiliza las cadenas en BGT con frecuencia.
Como vimos en la sección anterior, se podría hacer lo siguiente con una variable numérica:
int x=10;
x+=15;
Lo que por supuesto da a x el valor final de 25. Ahora, te alegrará saber que puedes hacer lo mismo con cadenas. El siguiente código es perfectamente legal:
string my_string="Hello there";
my_string+=" my friend.";
Por supuesto, mi_cadena contendrá ahora el texto "Hola amigo". No puedes, como habrás adivinado, utilizar ninguno de los otros operadores numéricos como -, * y / de la misma manera para las cadenas ya que no llenarían ninguna función en este caso.
También hay otra cosa importante que hay que saber sobre las cadenas. Para poder utilizar caracteres especiales, debemos usar lo que se llama un carácter de escape. Se trata de un carácter designado que indica al compilador que el siguiente carácter no debe ser tratado como un carácter literal, sino como un código para el carácter que debe utilizarse. El carácter de escape utilizado en BGT es una barra invertida.
A continuación se muestra una lista de los caracteres que se deben utilizar después del carácter de escape y lo que realmente representan:
- =
- "="
- n=nueva línea
- r=retorno
- t=tabulación
He aquí algunos ejemplos:
string string1="this\tis\ta\tstring\tusing\ttabs\tinstead\tof\tspaces.";
string string2="this is a\r\nmultiline\r\nstring.";
string string3="My current directory is \"c:\program files\bgt\my_game\my_script.bgt\"";
Observe cómo la cadena multilínea utiliza los caracteres r y n para crear una nueva línea. Esta es la secuencia de caracteres utilizada por Windows.
5.6. Constantes
Una constante es básicamente lo mismo que una variable normal, con una diferencia principal. Una vez que se le asigna un valor a una constante, no puede cambiarse en tiempo de ejecución. Su valor permanece igual durante toda la vida del programa, de ahí el nombre de constante, a diferencia de una variable cuyo valor puede cambiar, es decir, variar, en cualquier momento.
El propósito de una constante es principalmente para la legibilidad, y para ahorrar tiempo.
Se declara una constante de la misma manera que se hace con cualquier variable, añadiendo la palabra clave const antes del tipo de datos.
Tomemos el siguiente ejemplo:
const string snd_ext=".wav";
sound gun;
sound beep;
sound ambience;
sound music;
gun.load("sounds/gun"+snd_ext);
beep.load("sounds/beep"+snd_ext);
ambience.stream("sounds/wind"+snd_ext);
music.stream("sounds/music"+snd_ext);
La ventaja aquí es que, si tu juego se hace mucho más grande y decides convertirlo al formato ogg, simplemente cambias la asignación de la constante snd_ext a ".ogg". Entonces todas tus asignaciones de sonido, si usan la constante, se cambian a ese valor sin tener que ir a cambiar cada sonido individual.
Además, el motor BGT viene con ciertas constantes. En la documentación que acompaña a cada función se menciona cuándo se debe utilizar una determinada constante. La constante se pasa a la función por su nombre, aunque lo que realmente ocurre es que se pasa un determinado valor, como un número o una cadena, entre bastidores. Sólo utilizas el nombre de la constante para facilitarte las cosas, también podrías haber escrito el número en sí mismo y aún así tener un código que funcione. Sin embargo, al abrir un archivo en modo de escritura, por ejemplo, el nombre "archivo_escritura" tiene mucho más sentido que el número 2.
También hay un tipo especial de constante llamada enum. Esta es la abreviatura de enumeración, y por lo tanto sólo puede contener valores numéricos, enteros. Son útiles para agrupar constantes, permitiendo una mejor gestión del código. He aquí un ejemplo:
enum movement
{
left=-1,
right=1
}
enum weapon
{
fist,
club,
slingshot,
gun,
bomb
}
Lo que hemos hecho aquí es crear dos conjuntos de enumeraciones, uno llamado movimiento y otro llamado arma. En cada enumeración hemos proporcionado al intérprete una lista de constantes separadas por comas y, en el caso de nuestro ejemplo de movimiento, sus valores correspondientes. Por ejemplo, hemos asignado el nombre izquierda a -1, y derecha a 1. En el caso de arma, sin embargo, no hemos dado ningún valor. Esto se debe a que el intérprete puede asumir automáticamente nuestros valores. Si no se dan valores, a la primera constante se le asignará el valor 0, y cada una de las siguientes se incrementará en 1. Esto es útil aquí, ya que podemos concentrarnos puramente en decidir qué armas queremos. También tiene la ventaja añadida de que si queremos añadir un arma adicional en el futuro, no hay que hacer malabares con los números.
Tenga en cuenta que los enums tienen que ser definidos globalmente; no pueden ser definidos dentro de una función.
5.7. Resumen
Echemos un vistazo rápido a lo que hemos cubierto en este capítulo, junto con algunos consejos adicionales.
- Las variables son como cestas que pueden contener datos de diferentes tipos.
- Una constante es una variable cuyo valor no puede cambiarse en tiempo de ejecución.
- Las variables integrales pueden contener números positivos o negativos, dependiendo de si las declaras con o sin signo, pero sólo sin decimales.
- Las variables de coma flotante pueden contener números positivos o negativos, con o sin decimales.
- Puedes realizar operaciones aritméticas sobre variables numéricas como 3+5=8, tanto utilizando variables referenciadas por su nombre como valores literales.
- Si no conoce los valores que se almacenarán en una variable numérica, es mejor utilizar un doble.
- Mantenga siempre un registro de sus variables, o puede terminar con resultados inesperados si se excede el límite.
- Las cadenas son una lista de caracteres que forman algo útil.
- Puede ensamblar cadenas para formar otras nuevas combinando variables referenciadas por su nombre, con valores literales entre comillas.
- Sumando dos variables numéricas juntas, ambas con el valor de 1, será 2.
- Si se suman dos variables de cadena, ambas con el valor "1" (fíjate en las comillas), se obtendrá 11.
- Las variables son uno de los fundamentos del desarrollo de juegos, y de la programación en general.
- Las variables y constantes en BGT distinguen entre mayúsculas y minúsculas. Por lo tanto, tienes que referirte a ellas exactamente como las has declarado o como aparecen en la documentación.
Naturalmente la impresión será la misma, el script es sólo una línea más corta.