Hola a todos.
Gracias josepzin! Le preguntaré a @darro99
Escribo lo que yo hago para obtener los caracteres que tengo a derecha e izquierda del personaje y así saber en que plataforma/suelo/lugar de la pantallas te encuentras.
- Primeramente tengo dos direcciones en la pagina cero que contienen las coordenadas x e y del personaje. Estas 'variables' con fáciles de calcular al principio de la generación del nivel pues sabes de antemano donde vas a colocar al personaje.
Esta nomenclatura es de Kickass, es como una estructura de datos que puedes encontrar en cualquier lenguaje como C por ejemplo:
namespace vars_player{
.label pant_y = $46 //Coordenada y del juagador en la pantalla de caracteres
.label pant_x = $47 //Coordenada y del juagador en la pantalla de caracteres
}
Aquí solo se declara estos nombres asignados a las paginas cero $46 y $47.
- También debemos declarar un puntero a la pantalla para una vez obtenida la dirección de la misma poder recoger su valor.
namespace paint{
.label dir_pant = $48 //Esta dirección realmente son dos, $48 y $49 pues es un puntero, y necesitamos dos bytes.
}
- Por último también definimos un lista con las direcciones altas y bajas de cada una de la lineas de la pantalla.
tabla_screen_lo:
.byte [ SCREEN_CHAR + 0 ] & $00ff
.byte [ SCREEN_CHAR + 40 ] & $00ff
.byte [ SCREEN_CHAR + 80 ] & $00ff
.byte [ SCREEN_CHAR + 120 ] & $00ff
.byte [ SCREEN_CHAR + 160 ] & $00ff
.byte [ SCREEN_CHAR + 200 ] & $00ff
.byte [ SCREEN_CHAR + 240 ] & $00ff
.byte [ SCREEN_CHAR + 280 ] & $00ff
.byte [ SCREEN_CHAR + 320 ] & $00ff
.byte [ SCREEN_CHAR + 360 ] & $00ff
.byte [ SCREEN_CHAR + 400 ] & $00ff
.byte [ SCREEN_CHAR + 440 ] & $00ff
.byte [ SCREEN_CHAR + 480 ] & $00ff
.byte [ SCREEN_CHAR + 520 ] & $00ff
.byte [ SCREEN_CHAR + 560 ] & $00ff
.byte [ SCREEN_CHAR + 600 ] & $00ff
.byte [ SCREEN_CHAR + 640 ] & $00ff
.byte [ SCREEN_CHAR + 680 ] & $00ff
.byte [ SCREEN_CHAR + 720 ] & $00ff
.byte [ SCREEN_CHAR + 760 ] & $00ff
.byte [ SCREEN_CHAR + 800 ] & $00ff
.byte [ SCREEN_CHAR + 840 ] & $00ff
.byte [ SCREEN_CHAR + 880 ] & $00ff
.byte [ SCREEN_CHAR + 920 ] & $00ff
.byte [ SCREEN_CHAR + 960 ] & $00ff
tabla_screen_hi:
.byte [ [ SCREEN_CHAR + 0 ] & $ff00 ] >> 8
.byte [ [ SCREEN_CHAR + 40 ] & $ff00 ] >> 8
.byte [ [ SCREEN_CHAR + 80 ] & $ff00 ] >> 8
.byte [ [ SCREEN_CHAR + 120 ] & $ff00 ] >> 8
.byte [ [ SCREEN_CHAR + 160 ] & $ff00 ] >> 8
.byte [ [ SCREEN_CHAR + 200 ] & $ff00 ] >> 8
.byte [ [ SCREEN_CHAR + 240 ] & $ff00 ] >> 8
.byte [ [ SCREEN_CHAR + 280 ] & $ff00 ] >> 8
.byte [ [ SCREEN_CHAR + 320 ] & $ff00 ] >> 8
.byte [ [ SCREEN_CHAR + 360 ] & $ff00 ] >> 8
.byte [ [ SCREEN_CHAR + 400 ] & $ff00 ] >> 8
.byte [ [ SCREEN_CHAR + 440 ] & $ff00 ] >> 8
.byte [ [ SCREEN_CHAR + 480 ] & $ff00 ] >> 8
.byte [ [ SCREEN_CHAR + 520 ] & $ff00 ] >> 8
.byte [ [ SCREEN_CHAR + 560 ] & $ff00 ] >> 8
.byte [ [ SCREEN_CHAR + 600 ] & $ff00 ] >> 8
.byte [ [ SCREEN_CHAR + 640 ] & $ff00 ] >> 8
.byte [ [ SCREEN_CHAR + 680 ] & $ff00 ] >> 8
.byte [ [ SCREEN_CHAR + 720 ] & $ff00 ] >> 8
.byte [ [ SCREEN_CHAR + 760 ] & $ff00 ] >> 8
.byte [ [ SCREEN_CHAR + 800 ] & $ff00 ] >> 8
.byte [ [ SCREEN_CHAR + 840 ] & $ff00 ] >> 8
.byte [ [ SCREEN_CHAR + 880 ] & $ff00 ] >> 8
.byte [ [ SCREEN_CHAR + 920 ] & $ff00 ] >> 8
.byte [ [ SCREEN_CHAR + 960 ] & $ff00 ] >> 8
Donde SCREEN_CHAR es una constate que contiene el inicio de la pantalla. En mi caso es la dirección $4400
Función que recoge el carácter a la derecha del jugador:
getCaracterDer:
ldy vars_player.pant_y
lda tabla_screen_lo,y
sta paint.dir_pant
lda tabla_screen_hi,y
sta paint.dir_pant + 1
ldy vars_player.pant_x
iny
lda (paint.dir_pant),y
Lo que se hace es cargar el puntero dir_pant con las coordenadas prefijadas del personajes gracias a la tabla de direcciones. Una vez cargado el puntero con la linea correspondiente que nos marca pant_y podemos recoger el desplazamiento sobre esta dirección con pant_x con el direccionamiento indirecto.
Al final de la función obtenemos en el acumulador el carácter que marcaban las coordenadas pant_y/pant_x.
Espero que esto sirva de algo.
Salu2!