Menu principal

Para ir cerrando el mini curso, vamos a realizar un menú principal, en el que estará el nombre del juego, una leyenda que nos indique como comenzar a jugar (algo así como «Pulse F1 para comenzar»), y un efecto sencillo, para que no quede tan soso. Para muestra, mejor un vídeo:

Primero vamos a describir el efecto. Es simplemente un ciclado de colores del fondo de pantalla (se acuerdan? los primeros posts… ), pero les vamos a introducir un cutre delay, para que se engrosen las lineas. El efecto es medio azaroso, debido a que no hacemos ningún control del raster, pero así quedó mas o menos bonito ( eso si, pulsas una tecla y se desbanda completamente… esas cosas que tiene la simpleza 😛 ).
Ademas, la pantalla la dibujamos con caracteres invertidos, así tapamos todo, y lo que se muestra es el fondo que pasa a través de los caracteres invertidos…
Pfff, como explicación es pésima, mejor un ejemplo visual:

Caracteres invertidos jetpac_solo
Fondo ciclando anima_texto
Resultado final anima_texto_2

Para el código del ciclado de colores vamos a hacer lo siguiente:

main_menu:
{
          ldx            #0             
          stx            cborde
          ldx            #1             // establecemos colores de 
          stx            cfondo         // borde y fondo

          lda            #0      
          sta            spractive      // desactivamos todos los sprites
  
          ldx            #<menu_screen   // utilizamos la función
          stx            lsbCopyAddress     // que explicamos en el 
          ldx            #>menu_screen   // capitulo anterior y ... 
          stx            msbCopyAddress 
          jsr            copyToScreen       // copiamos pantalla

          ldx            #<menu_color
          stx            lsbCopyAddress
          ldx            #>menu_color
          stx            msbCopyAddress     
          jsr            copyToScreenColor  // idem para colores 

          // INICIO DEL EFECTO DE FONDO.
          ldy #0                  // inicializo indice tabla colores

loop:
          ldx            $CB       // leo ultima tecla pulsada
          cpx            #$04      // si pulso F1
          beq            go_main   // comienzo el juego

          lda            color_ramp,y   // tomamos el color de la 
                                        // tabla de colores que vamos 
                                        // a ciclar

loop_raster:
          ldx            raster    
r_line:   cpx            #$0         // posición de comparación (r_line + 1)
          bne            loop_raster
                                     // esto es mejorable... 
          inc            r_line+1    // incrementa posición de comparación
          inc            r_line+1    // esto lo que hace es engrosar la linea
          inc            r_line+1    // de fondo 
          inc            r_line+1    // es algo así como código automodificable
          inc            r_line+1    // si quitan algunos de estos inc
          inc            r_line+1    // se afina la linea
          inc            r_line+1    // si agregan se engrosa
          inc            r_line+1 
          inc            r_line+1 
          inc            r_line+1 
          inc            r_line+1 
          inc            r_line+1 
          sta            cfondo      // establezco el color de fondo    
          
          iny                        // tomo el próximo color de la rampa
          cpy            #7          
          bne            skip     
          ldy            #0          // y ciclo si llego al final de la rampa
          
skip:          
          jmp            loop     

go_main:
          jmp            start_game
}          
  
// colores que voy a ir ciclando en el fondo
color_ramp:
          .byte 7, 10, 8, 2, 9, 2, 8, 10

Ademas pueden ver que detectamos la pulsación de la tecla F1, eso se hace checkeando la posición de memoria $CB, que guarda la última tecla pulsada.

Quisiera detenerme en lo que me parece la parte mas confusa del código, que son las lineas inc r_line + 1. Lo que estamos haciendo aquí es modificar la posición de memoria ‘r_line + 1’, que corresponde a lo que en el código figura como ‘#$0’. Entonces, lo que hacemos es incrementar hasta el siguiente posición del raster, para luego cambiar al siguiente color. Si quito lineas ‘inc’, entonces la linea se afina, si agrego se engrosa…

Pueden descargar el proyecto desde el repositorio que se encuentra en https://github.com/moonorongo/jp_wars

y esto es todo por hoy, para la próxima entrega voy a tratar de poner algunos efectos de sonido (digo tratar, porque es un tema bastante difícil para mí… 😦 ). Hasta la próxima!

Actualización!!: A sugerencia del amigo @josepzin, del foro de Commodoremania, cambié la acción del menú principal para que, en vez de tener que pulsar F1 para comenzar, simplemente con disparar con cualquiera de los dos joysticks comience la acción. El código a continuación:

loop:
//          ldx            $CB       // CODIGO ANTERIOR:
//          cpx            #$04      // lo comenté a fin de 
//          beq            go_main   // mostrar el cambio realizado
          
          lda            joy1       // si pulso disparo 1
          and            #16           
          beq            go_main    // comienza el juego
          lda            joy2       // o disparo 2
          and            #16           
          beq            go_main    // también

Ahora si… 🙂

4 comentarios en “Menu principal

Replica a Gabriel Cancelar la respuesta