lunes, 31 de marzo de 2014

Elementos en pantalla ACS - ZDoom (Doom in Hexen Format) - Parte 2: Inclusión básica y trucos de comandos.

Todo comando tiene una forma especifica de ser incluido en ACS, además de los subsecuentes trucos que podemos aplicar para que se comporten de una manera especial.

En éste segundo paso voy a explicar como se incluyen y algunos trucos, suficientes como para crear un pequeño indicador a modo de HUD en nuestra pantalla.




De igual manera que antes, voy a crear un pequeño apéndice para evitar lecturas innecesarias al que ya tenga ciertos conocimientos en el asunto:

1: Crear un script (Principios e inclusión básicos).
2: Imprimir un icono o imagen con HudMessage.
3: Obtener la resolución de video que se está utilizando.
4: Utilizar variables en comandos.


Si aún no has leído la primer parte, te recomiendo que le pegues una ojeada: http://hexagon1970.blogspot.com.ar/2014/03/elementos-en-pantalla-acs-zdoom-doom-in.html


Crear un script (Principios e inclusión básicos)

Para crear un script se deben hacer 2 cosas escenciales:

1) Incluir una librería que genere todos los comandos:

En la mayoría de casos, se utiliza una librería llamada zcommon.acs. Ésto se hace mediante un comando denominado directiva. La directiva que utilizamos para ésto es #include. Todas las directivas se ejecutan al principio de todo, antes de confeccionar ningún script.

2) Confeccionar un script:

Un script básico se confecciona con ciertos parámetros básicos, valga la redundancia.

Primero hay que indicar que efectivamente se trata de un script, una secuencia de comandos. Para ésto simplemente escribimos "Script". Luego se indica el número o nombre de script. Para ésto, se escribe el numero (El limite de scripts es un poco más de 32000). Si es un nombre, deberá ser escrito entre comillas.

Luego del número, se indica el tipo de script. Nosotros vamos a utilizar, al menos con los ejemplos de éste tutorial, solo tres:

Open: Se ejecuta cuando carga el escenario.
Enter: Se ejecuta cuando el jugador entra en el escenario.
(void): Solo se ejecuta cuando es activado mediante un thing o mediante otro script.

Para conocer el resto de tipos de scripts, visita el artículo en la wiki de ZDoom (Inglés).

Luego de indicar que lo que sigue es un script, el nombre o número, y el tipo, debemos encerrar el código entre llaves {}.

Entonces, con lo anterior, nos queda algo como ésto:

#include

Script 1 ENTER

{

// Éste es nuestro script.

}

Por supuesto, un script vacío no va a servir de nada. Para eso vamos a asignarle los comandos que vimos en el capitulo anterior.

Ésto se hace simplemente escribiendo el comando con su formato correspondiente (Indicado en la explicación de cada comando, escrito anteriormente) y terminándolo con un punto y coma (;).

Ésto es muy importante, y es un error muy común también, más que nada por descuido. Si no terminamos el comando con un punto y coma, nos va a dar error.

Ejemplo:

Script 1 ENTER

{

HudMessage (s: "Hola"; HUDMSG_PLAIN, CR_Orange, 1, 0.5, 0.5, 0);

}

Es común que algunos comandos a su vez utilicen un punto y coma para separar propiedades. Hay que prestar mucha atención a ésto también.

También se puede incluir comentarios en los scripts, para seguir la linea de nuestro trabajo. Para scripts con una sola linea se escriben dos barras:

// Comentario

Si queremos hacer un comentario más grande, de varias lineas, debemos comenzarlo con un /* y terminarlo con un */. Por ejemplo:

/*

Comentario de
varias lineas

*/

Para repetir un mismo script existe el comando Restart. Sin embargo, para evitar un error general, debemos anteponer siempre un Delay de al menos 1 tic.

Script 1 ENTER

{

HudMessage (s: "Hola"; HUDMSG_PLAIN, CR_Orange, 1, 0.5, 0.5, 0);
Delay (1);
Restart;

}


Siempre es una buena idea consultar con la Wiki de ZDoom en caso de tener alguna duda.


                           

Imprimir un icono o imagen con HudMessage.

Imprimir una imagen con HudMessage es muy fácil. Solamente se debe utilizar un comando aparte del HudMessage: SetFont.

Para ésto, vamos a importar a nuestro archivo (Wad o PK3) una imagen cualquiera. Supongamos que a ésta imagen la llamamos ICON_H.

Lo que tenemos que hacer es sencillo: Con SetFont indicamos, como fuente, el nombre de nuestro archivo de imagen (ICON_H, en éste caso).
Luego, con HudMessage, creamos un mensaje que contenga simplemente "A". El resto es lo mismo.

Éste ejemplo imprime la imagen ICON_H en el centro de la pantalla:

SetFont ("Icon_H");
HudMessage (s: "A"; HUDMSG_PLAIN, 1, 0, 0.5, 0.5, 0);

Si SetFont se ubica luego de HudMessage, el truco no tendrá efecto. Tomar en cuenta que si utilizamos SetHudSize va a resultar afectado de manera total el comportamiento del comando. En ésto voy a hacer hincapié en la próxima parte, cuando explique como posicionar un elemento en pantalla al crear un hud personalizado.


                           

Obtener la resolución de video que se está utilizando.

Para ésto es necesario utilizar el comando GetCVar y volcar su resultado en una variable de ACS. Para eso, sencilamente tenemos que hacer lo siguiente:

int video_width = GetCVar (vid_defwidth);
int video_height = GetCVar (vid_defheight);

Recordemos que solo podemos declarar una variable de ésta manera dentro de un Script. En caso de que queramos utilizar la misma variable en todo nuestro ACS, deberíamos declarar la variable al principio, asignarle un valor cualquiera, y luego redefinirlo mediante un script. Algo así:

#include "zcommon.acs"

int video_width = 0;
int video_height = 0;

Script 1 ENTER

{

video_width = GetCVar (vid_defheight);
video_height = GetCVar (vid_defheight);

}


                           

Utilizar variables en comandos.

Ésto es infinitamente útil para que un mismo comando maneje diferentes valores.

Voy a poner un ejemplo muy básico: Un script que imprime en pantalla la resolución que se está utilizando.

Comencemos:

#include "zcommon.acs"

Script 1 ENTER 

{

int video_width = GetCVar ("vid_defwidth");
int video_height = GetCVar ("vid_defheight");
HudMessage (i: video_width , s: "x" , i: video_height ; HUDMSG_PLAIN, 1, 0, 0.5, 0.5, 0);
Delay (1);
Restart;

}

Lo que hace el script anterior es, paso por paso:

1) Incluir la librería correspondiente.

2) Crear un script que se ejecute al entrar (Y abrimos llave).

3) Crear dos variables: video_width y video_height. A la primera le asignamos el ancho de la resolución, a la segunda le asignamos el alto. Ésto lo hacemos mediante el comando GetCVar. Recuerden que ésto solo puede hacerse dentro de un script, porque si lo hacemos por fuera, ACS va a tomarlo como un string, que se declara de manera diferente, y obviamente nos va a dar error de sintaxis.
Hay un metodo para unir ambas variables, que voy a explicar más adelante.

4) Con HudMessage indicamos que imprima el valor de las variables. Prestar atención: Antes de ingresar el nombre de la variable, debemos indicar el tipo.

Una variable con letras y números es una variable encadenada (String). Entonces, a la hora de indicarla, debemos hacerlo con una S y dos puntos (S:).
Una variable con números enteros (Integer) debemos indicarla con una I y dos puntos (I:).
Una variable con números fijos, por último, se debe indicar con un F y dos puntos (F:).

Si queremos mezclar variables con un valor fijo, debemos indicarlo cada vez. Observar como delante de la primer variable indiqué con una I: que se trataba de una variable entera. Luego indiqué un S:, y agregué un texto entre comillas, puesto que se trata de un texto fijo. Si en vez de utilizar un texto fijo queremos utilizar una variable con letras, simplemente le sacamos las comillas. Luego, de vuelta, indicamos que la variable es I:, e ingresamos el nombre de la misma.
Es importante notar que cada variable o valor se separa con comas simples, y para cerrar el argumento se utiliza un punto y coma ( ; ).

También podemos combinar variables con valores fijos. Ésto nos sirve para ahorrar código en la linea con el HudMessage. Para ésto, utilizaremos un subcomando llamado strparam.

Mucha atención: Hay que ser muy precisos respecto al tipo de dato que manejamos aqui. Si el valor que nos devuelve el comando es entero, debemos indicar que se trata de un valor entero. De otra forma, no funcionará la asignación.

Para saber qué tipo de valor nos da un comando, lo mejor es visitar la wiki. El que estamos utilizando en el ejemplo retorna un valor entero (320) y (200).

Entonces, deberíamos hacer algo así:

Script 1 ENTER 

{

int video_width = GetCVar ("vid_defwidth");
int video_height = GetCVar ("vid_defheight");
int video = strparam(i:video_width, s:"x", i:video_height);

HudMessage (s: video ; HUDMSG_PLAIN, 1, 0, 0.5, 0.5, 0);
Delay (1);
Restart;



Strparam se utiliza de la siguiente manera:

int nombredevariable = strparam(variables y valores a mezclar, separadas por comas);

Cabe aclarar que éste comando tiene algunos resultados inconclusos, sobre todo con variables que de alguna manera afecten al jugador o a los things del mapa. De cualquier forma, con el uso que se le dio en el ejemplo no tendría que haber problemas.

Hay que aclarar que no siempre es necesario aclarar el tipo de variable que se está utilizando. Por ejemplo:

Script 1 ENTER 

{

int posicion = 0.5;

HudMessage (s: video ; HUDMSG_PLAIN, 1, 0, posicion, posicion, 0);
Delay (1);
Restart;



El anterior ejemplo funcionaria, puesto que el comando sabe que en esos espacios el tipo de dato que debe ser escrito es fijo (Con decimales). Si en nuestra variable tuvieramos un valor entero, el comando incurriría en un error, con resultados inesperados.

Quizá te deberás estar preguntando: ¿Entonces por qué al indicar el tiempo que el texto debe estar en pantalla no se utilizo un decimal, si se maneja con numeros fíjos (Con decimales obligatorios)?

Ésto es porque, en éste caso, al escribir un valor entero en lugar de uno fijo deriva en un error, lo que genera que ese valor automáticamente se convierta en 0.0. Puedes hacer la prueba ingresando cualquier otro número entero. Por ejemplo, si ingresas 2, verás que ese texto no dura 2 segundos, si no que es eterno. Eso es porque, en éste caso en particular, un error se traduce en 0.0.


                           

Con estos sencillos trucos, es posible crear un pequeño indicador en pantalla y, con algo de creatividad, generar un efecto de degradado, que le de un estilo más prolijo a nuestra función. Ésto ya está explicado en mi otro tutorial, acerca de como crear fades con casi cualquier función: http://hexagon1970.blogspot.com.ar/2014/03/in-wad-tutorial-de-acs-basico.html

También incluye un archivo ejemplo.

En ésto, sin embargo, voy a ahondar con la tercera y última parte. Por supuesto que cada quién puede ir intentándolo desde ahora, y comentar si tiene alguna duda o dificultad.

De todas maneras, la tercer parte la voy a escribir mañana, que ya van casi 11 horas de escritura desde que comencé con la primer parte de la guía, y quizá no sea necesario apurarse (Aunque tampoco creo que haya lectores que estén leyendo ésto en éste mismo instante jajaja). En todo caso, quien quiera ir intentándolo, que lo haga, y mañana quedarán todas las dudas disipadas con la tercer parte.

En ella no solo voy a explicar como crear paso a paso un indicador funcional y vistoso, si no que además voy a incluir un archivo como ejemplo, que incluso pueden utilizar en sus mapas si les parece.

Saludos.

No hay comentarios:

Publicar un comentario