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 | |
Fondo ciclando | |
Resultado final |
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… 🙂
Muy bonita pantalla!!
Si se me permite una crítica: ¿porqué F1?? para empezar lo más natural y práctico es pulsar disparo.
Cierto… Lo voy a cambiar. Pasa que estaba pensando cómo detectar teclas, y en lo q menos pensé es en utilizar el disparo 😁
Ahora si! Fire to start!
No he tenido tiempo de probar el codigo pero luce muy chulo!!!