Aspect ratio

Una cosa que siempre me resultó molesta de los MSX era que si dibujabas un cuadrado o un circulo, en pantalla aparecía un rectángulo o una elipse achatados respectivamente. Había que aplicar un factor de 1,4 aproximadamente en el eje Y para que visualmente tuvieran el mismo ancho que alto. Además, por lo que sé, esa relación entre los ejes X e Y es diferente si el ordenador es NTCS en lugar del PAL europeo. No quiero que mi juego  tenga ese aspecto achatado característico así que estoy diseñando los gráficos con la Y multiplicada por ese 1’4:

Imagen creada en Pixen con las Y “estiradas”

Eso complica un poco las cosas porque si bien es fácil crear una elipse o un rectángulo con las dimensiones correctas, hacer que todas esas rayitas oblicuas queden en su sitio y correctamente orientadas tiene su dificultad. Al final el resultado ha sido más que satisfactorio (para mí):

Resultado en un MSX2 real.

Con la imagen del HUD de momento finalizada me he puesto por fin a codificar: carga de imágenes en VRAM, composición de la pantalla por capas, doble buffer y movimiento del puntero. En la película el punto de mira se mueve por el interior del circulo central del HUD con un mando y la posición de la cabina con otro (según he podido deducir). Yo por simplificar estoy haciendo que cuando el puntero llega al borde del círculo empuja a la cabina en esa dirección:

En este punto me he encontrado con otro problema. Limitar el movimiento dentro del círculo es relativamente sencillo en un computador con un procesador de 8 bits a 4MHz: no hay más que comprobar que la distancia al cuadrado del puntero al centro es menor que el cuadrado del radio del circulo (uso el cuadrado para evitar hacer la raíz cuadrada). Sooooolo queeee en realidad no es un círculo sino una elipse porque como soy tan guay quería que mis círculos no estuvieran achatados. Recuerda que aunque la imagen se muestre como la captura del MSX2 real, internamente el dibujo es la elipse de la primera imagen de esta entrada. Comprobar que un punto está dentro de una elipse no es tan trivial en un procesador como el que hemos mencionado. En este punto he tenido que ser imaginativo y calcular los límites de la elipse de forma off-line en una hoja de cálculo.

Como cada uno de los cuatro sectores en los que podemos dividir una elipse son simétricos dos a dos en los ejes vertical y horizontal, en realidad solo he tenido que calcular los límites del sector superior derecho. Para cada X he calculado la Y máxima y las he guardado en un array.

static TINY y[50] = {
 69,69,69,69,69,69,68,68,68,68,
 68,67,67,67,66,66,65,65,64,64,
 63,62,62,61,60,59,58,58,57,56,
 55,53,52,51,50,48,47,45,44,42,
 40,38,36,33,30,27,24,20,14,0
 };

Para comprobar que el punto de mira está dentro de los limites de la elipse, suponiendo que el centro de la elipse es el origen de coordenadas:

  1. Compruebo que el valor absoluto de la X del punto de mira es menor que la longitud de ese array.
  2. Si se cumple lo anterior, compruebo que el valor de la Y del punto de mira es menor que el valor guardado en el array para esa X.
 x = abs(x);
 y = abs(y);

 if (x<50 && y<y[x]) {
  /* Mover punto de mira */
 } else {
  /* Mover cabina */
 }

Funciona, como se puede ver en el vídeo.

Continuará…

Un año más tarde…

Al final las cosas nunca salen como uno planea. Después de un año sólo puedo decir que he aprendido mucho y que mis proyectos de juegos están en su mayoría parados. Por el camino ha caído un tercer premio en la Imagin Bank Challenge 2016 (Games Edition) y una vuelta a mis orígenes.

Me explico: Yo empecé en esto de la programación con unos 13 ó 14 años con un ordenador MSX de primera generación, concretamente con un Panasonic CF-2700. Por esos tiempos ya intentaba hacer mis primeros juegos y soñaba con tener un MSX2. Hace poco adquirí en una subasta de eBay un Philips NSM 8250 con una disquetera adicional (como un NMS 8255), que era uno de los modelos que más deseaba tener. Nunca llegué a publicar ningún juego, ni siquiera en la escena amateur que se creó casi al final de la vida de ese estándar de ordenadores de 8 bits.

 

MSX2 game concept test from Onikami on Vimeo.

 

He decidido quitarme esa espinita viendo que aun hoy en día se siguen publicando títulos para esas máquinas. Después de escribir en BASIC una prueba de concepto para comprobar si un MSX2 tiene la potencia necesaria, he decidido que mi primer juego para MSX2 (y espero que primero que publique para el estándar) sea un juego de combate espacial inspirado en la película The Last Starfighter. Espero que la próxima vez que escriba en este blog sea en breve para contar mis avances, y no dentro de un año.