sábado, 29 de marzo de 2014

Minimapa en pantalla para ZDoom

Estuve buscando durante un tiempo en los foros de ZDoom y Doomworld acerca de ésto, y al parecer nadie tiene algo concreto al respecto.

Un minimapa es, a grandes razgos, un trozo de escenario que se muestra a una esquina de la pantalla, como parte del hud. Ésto sirve para guiarse sin la necesidad de recurrir al mapa en pantalla completa.





Algo así como ésto:

Concepto de minimapa en HESK.

Ahora bien, existen varios aspectos que tienen que ser tomados en cuenta.

Un minimapa debe ser flexible. Esto significa que debe de ser legible y cómodo para todo tipo de escenarios, sean éstos grandes o diminutos. Y ésta es precisamente la primer contrariedad con la que me he topado al desarrollar ésta temprana versión.

Si bien el mapa ya estaba en etapa funcional (Aunque solo en determinadas resoluciones), tenía la particularidad de que solo serviría para mi mapa. Ésto no solo se debía a que no contaba con un lector de terreno como el que lleva el port de la amiga de Doom64, lo cual resultaría en traducir todo el terreno del mapa en una imagen encuadrada, si no que además tampoco estaba seccionado. Ésto significa que, de tener lugar, el que el indicador de posición se saldría del encuadre y seguiría su camino por el resto de la pantalla.

Error en el encuadre.

Además, algo muy importante, es que en ésta primera versión el mapper necesitaría colocar al PlayerStart en el 0 absoluto en las coordenadas. El no hacerlo, incurría en el error mostrado anteriormente.

Sin embargo, la solución a éste último asunto es sencilla: Establecer un punto de partida mediante GetActorX y GetActorY, y asignarle a los valores resultantes un equivalente de 0.0. De ésta manera, si el actor se encuentra en x160 + x-350, ambos valores serían considerados traducidos a 0.0, de manera que ambos valores irían a la par con el cambio de posición del jugador.

Es decir, en ACS sería algo así:

int nposx = GetActorX (PlayerNumber()); // Se obtiene las coordenadas X de jugador y se la guarda en la variable nposx.
int nposy = GetActorY (PlayerNumber()); // Se obtiene las coordenadas Y de jugador y se la guarda en la variable nposy.

int posx = nposx - 160.0; // Al valor de nposx se le resta (En caso de ser positivos) los puntos obtenidos de la posición X del thing que spawnea al jugador, reseteando el valor inicial a 0.0, pero manteniendo el mismo susceptible a los cambios respecto de la posición inicial.

int posy = nposy + 350.0; // Al valor de nposy se le suma (En caso de ser negativos) los puntos obtenidos de la posición Y del thing que spawnea al jugador, reseteando el valor inicial a 0.0, pero manteniendo el mismo susceptible a los cambios respecto de la posición inicial.

Por supuesto que lo anterior se puede hacer en dos lineas y con dos variables solamente, pero yo lo hice de esa manera para que resulte más fácil de entender para aquellos que no estén muy interiorizados en ACS.

Yo no creo que sea imposible crear un minimapa en pantalla, seccionado y con texturas personalizadas, pero sí llevaría mucho tiempo, y yo por el momento es de lo que menos dispongo.

No hay comentarios:

Publicar un comentario