Categorías
Programación

Sprites en basic

Archivo.doc

Programa


1 Comprendiendo conceptos.

2 ¿Qué es un Sprite?.

3 screen 0.

4 screen 1.

5 screen 2.

6 Creando nuestro Sprite nave en screen 2,1.

7 Moviendo nuestro sprite nave en screen 2,1.

Comprendiendo conceptos

Lo primero es comprender que el msx solo entiende de tiles y sprites

Todos las direcciones de la memoria RAM deben de ser expresadas en sistema hexadecimal para una mejor compresión ya que el ordenador va leyendo byte a byte (ejemplo: 01010101) en la ram de manera secuencial o horizontal.

Es importante saber que la pantalla está dividida en 3 zonas asociadas a los “bancos 0,1 y 2”.

Para asignar el modo gráfico se pone screen modo_video, tamaño_sprites.

También hay que entender que solo se trata de volcar los datos en la parte de la VRAM que según el modo gráfico (o el screen) que hayas puesto está destinada a

screen 0

screen 1

screen 2

screen 3

¿Qué es un Sprite?

Un Sprite de 8x8px es esto:

¿Te das cuenta con el byte (los 8 bits) son la unidad básica de almacenamiento?

Con este trozo de código vamos a analizar las letras que están metidas en la tabla de sprites del modo screen 0 (ver siguiente apartado)

Vamos a analizar la letra z


0 'Vamos a analizar la z en minúscula'
1 numerosprit=122
2 print "Vamos a analizar la letra: ";chr$(numerosprit)
5 print "1 fila "; vpeek(base(2)+(numerosprit*8))
6 print "2 fila "; vpeek(base(2)+(numerosprit*8)+1)
7 print "3 fila "; vpeek(base(2)+(numerosprit*8)+2)
8 print "4 fila "; vpeek(base(2)+(numerosprit*8)+3)
9 print "5 fila "; vpeek(base(2)+(numerosprit*8)+4)
10 print "6 fila "; vpeek(base(2)+(numerosprit*8)+5)
11 print "7 fila "; vpeek(base(2)+(numerosprit*8)+6)
12 print "8 fila "; vpeek(base(2)+(numerosprit*8)+7)
13 print 
14 print "Ahora en binario"

15 print "1 fila "; bin$(vpeek(base(2)+(numerosprit*8)))
16 print "2 fila "; bin$(vpeek(base(2)+(numerosprit*8)+1))
17 print "3 fila "; bin$(vpeek(base(2)+(numerosprit*8)+2))
18 print "4 fila "; bin$(vpeek(base(2)+(numerosprit*8)+3))
19 print "5 fila "; bin$(vpeek(base(2)+(numerosprit*8)+4))
110 print "6 fila "; bin$(vpeek(base(2)+(numerosprit*8)+5))
111 print "7 fila "; bin$(vpeek(base(2)+(numerosprit*8)+6))
112 print "8 fila "; bin$(vpeek(base(2)+(numerosprit*8)+7))



Como se come los ceros vamos a arreglarlo un poco:

Vamos a cambiar la “z” minúscula por nuestro muñeco Sprite y ponemos print “zaragoza”


0 numerosprit=122

1 ' Vamos a sustituir la zeta por nuestro muñeco
2 vpoke base(2)+(numerosprit*8),24
3 vpoke base(2)+(numerosprit*8)+1,24
4 vpoke base(2)+(numerosprit*8)+2,36
5 vpoke base(2)+(numerosprit*8)+3,36
6 vpoke base(2)+(numerosprit*8)+4,36
7 vpoke base(2)+(numerosprit*8)+5,24
8 vpoke base(2)+(numerosprit*8)+6,24
9 vpoke base(2)+(numerosprit*8)+7,60

21 print "Vamos a analizar la letra: ";chr$(numerosprit)
15 print "1 fila "; vpeek(base(2)+(numerosprit*8))
16 print "2 fila "; vpeek(base(2)+(numerosprit*8)+1)
17 print "3 fila "; vpeek(base(2)+(numerosprit*8)+2)
18 print "4 fila "; vpeek(base(2)+(numerosprit*8)+3)
19 print "5 fila "; vpeek(base(2)+(numerosprit*8)+4)
110 print "6 fila "; vpeek(base(2)+(numerosprit*8)+5)
111 print "7 fila "; vpeek(base(2)+(numerosprit*8)+6)
112 print "8 fila "; vpeek(base(2)+(numerosprit*8)+7)
113 print 
114 print "Ahora en binario"

115 print "1 fila "; bin$(vpeek(base(2)+(numerosprit*8)))
116 print "2 fila "; bin$(vpeek(base(2)+(numerosprit*8)+1))
117 print "3 fila "; bin$(vpeek(base(2)+(numerosprit*8)+2))
118 print "4 fila "; bin$(vpeek(base(2)+(numerosprit*8)+3))
119 print "5 fila "; bin$(vpeek(base(2)+(numerosprit*8)+4))
120 print "6 fila "; bin$(vpeek(base(2)+(numerosprit*8)+5))
121 print "7 fila "; bin$(vpeek(base(2)+(numerosprit*8)+6))
122 print "8 fila "; bin$(vpeek(base(2)+(numerosprit*8)+7))

300 print

301 print "zaragoza"

screen 0

24 líneas, 32 columnas

Es posible ver las direcciones de las tablas poniendo print base (0) para la tabla mapa o nombre y print base (2) para la tabla patrones de sprites de letras

Dibujos de letras ascii

Con asc(letra) obtenemos la posición y con chr$(numero) obtenemos la letra.

En el apartado ¿Qué es un Sprite? está explicado todo lo necesario.

screen 1

Nos permite trabajar con colores de letras.

Para obtener las direcciones de las tablas podemos poner base(5) para la Tabla nombres o mapa, base(7) para la tabla patrones de Sprite y base(6) para la tabla color

En este caso la tabla quedaría dividida en 3 zonas

screen 2

El tamaño_sprite puede ser 0 (8x8px), 1 (8x8px ampliado), 2 (16×16 x), 3 (16x16px) ampliado

Es posible ver las direcciones de las tablas poniendo base (del 10 al 19):

256px de ancho * 192px de alto.

Como para definir cada tile necesitamos 8 bytes serán

256/8=32 filas y 192/8=24 columnas

14336 / h3800 -> 16383 / 3fff
(tamaño 2048 / h800)  
Tabla de patrones de sprites
En vasic base(14)
Aquí es donde se ponen los 8 bytes que componen tu sprite para definir su dibujo, con la ayuda de la “tabla atributos de sprites” llamaremos a este bloque y le podremos su posición en pantalla.
12288 / h3000 -> 14335 / h37ff
Tamaño: 2048 / h0800
Tabla color tiles banco 2
Aquí se definen los bloques de 8 bytes que definen el color de los tiles definidos en la “tabla tiles banco 2” la tabla que representa a la parte superior de la pantalla
10240 / h2800 -> 12287 / h2fff
Tamaño: 2048 / h0800
Tabla color tiles banco 1
Aquí se definen los bloques de 8 bytes que definen el color de los tiles definidos en la “tabla tiles banco 1” la tabla que representa a la parte central de la pantalla
8192 / h2000 ->10239 / h27ff
Tamaño: 2048/ h0800
Tabla color tiles banco 0
En basic base (11)
Aquí se definen los bloques de 8 bytes que definen el color de los tiles definidos en la “tabla tiles banco 0” la tabla que representa a la parte inferior de la pantalla
h1800 vacía
6912 /h1b00 -> 7039 / h1b7f
Tamaño 128 /h0080  
Tabla de atributos de Sprite (AOM)
En basic base(13)
Cada “atributo de Sprite” son 8 bytes que definen su bloque de 32 bits de la tabla “patrones de sprite”, su posición x, y, color (los colores del sprite no tienen nada que ver con los tiles)  
6144 / h1800 -> 6911 / h1aff
Tamaño 768 / h0300  
Tabla mapa o nombres de tiles
En basic base(10)
Aquí es donde se pone el bloque de bytes que corresponde con el tile definido en la tabla “tiles banco 0,1,2”
4096 / h1000 ->  6148 /h17ff
Tamaño: 2048 / h0800
Tabla tiles banco 2
Lo mismo que banco 0 y banco 1 pero para el banco 2
2048 / h0800 -> 4095 / h0fff
Tamaño: 2048 /h0800
Tabla tiles banco 1
Lo mismo que el tiles banco 0 pero para el banco 1
0 / h0000 -> 2047 / h07ff
Tamaño: 2048/h0800
Tabla tiles banco 0
En basic base(12)
Aquí se definen los bloques de 8 bytes que definen 1 tile para la parte superior de la pantalla de las 3 partes que tiene la pantalla (ejemplo 1) Este tile estará relacionado con los 8 bytes del “Color tiles banco 0” y con la “tabla mapa”  

Imagen 1.

Creando nuestro Sprite nave en screen 2,1

Abrimos el programa “spriyeSX devtool” y creamos un nuevo Sprite de 8×8 monocolor:

Como puedes ver los 2 primeros bytes correponden a las filas 1 y 2 porque tienen 1 cero.

Tenemos que saber que para manejar los sprites en basic tenemos 4 comandos:

1.sprite$(numero_plano_o_sprite): Aquí asignaremos nuestros 8 bytes en la “tabla patrones de sprites”

2. color sprite$ (numero_plano_o_sprite)=string_con_los_bytes$

3.put sprite entero_numero_plano_o_sprite, (posición_x, posición_y), color

4.on Sprite gosub numero_linea: cuando chocan 2 sprites se irtá a la subrutina indicada en numero_linea

5.sprite on/off/stop: activa o desactiva las interrupciones de los sprites


1 ' Programa 


1 'Inicializando'
1 ' Lo 1 es definir el color de caracteres 15 blanco, fondo 4 azul y margen 7 azul celeste
10 color 15,4,7
1 'Lo 2 es comfigurar la pantalla con screen modo_video, tamaño_sprites'
1 'el tamaño_sprite puede ser 0 (8x8px), 1 (8x8px ampliado), 2 (16x16 x), 3 (16x16px) ampliado'
20 screen 2,1


1 ' Definiendo nuestro sprite'
115 for i=1 to 8
    120 read a
    1 'chr determina el caracter que corresponde a (argumento) y se irán cocatenado
    125 sp$=sp$+chr$(a)
130 next i
1 'Aquí le estamos poniendo en el sprite o plano 0 e la "tabla patrones de sprites" los bytes de nuestra nave'
135 sprite$(0)=sp$
1 'Aquí le estamos poniendo en la "Tabla atributos de sprite' el plano o sprite 0, la posicion, el color y el sprite
140 put sprite 0,(100,100),15,0
145 goto 145

1000 DATA &h000,&h000,&h018,&h03C,&h066,&h07E,&h05A,&h000


Moviendo nuestro sprite nave en screen 2,1



1 ' Programa 

1 '------------------------'
1 '     Inicializando'
1 '------------------------'
1 ' Brramos la pantalla'
5 cls
1 ' Lo 1 es definir el color de caracteres 15 blanco, fondo 4 azul y margen 7 azul celeste
10 color 15,4,7
1 ' Lo 2 es comfigurar la pantalla con screen modo_video, tamaño_sprites'
1 ' el tamaño_sprite puede ser 0 (8x8px), 1 (8x8px ampliado), 2 (16x16 x), 3 (16x16px) ampliado'
20 screen 2,1
1 ' Desactivamos el sonido de las teclas
30 key off
40 let k$=""
50 let px=100: let py=100

1 '------------------------'
1 '       main'
1 '------------------------'
1 'Llamamos a la subrutina para poner nuestro sprite en la tabla patrones de sprite'
100 gosub 1000
1 'llamamos a la subrutina para capturar el teclado'
200 gosub 2000
1 'Llamamos a la subrutina actualizar sprite personaje'
300 gosub 3000
1 ' El goto es como una especie de while para que vuelva  capturar el teclado y dibujar'
400 goto 200

1 '------------------------'
1000 'Subrutina definiendo nuestro sprite'
1 '------------------------'
1110 for i=1 to 8
    1 'Aquí le indicamos que los datos de read a se encuentra en la linea 1150'
    1115 'restore 1150
    1120 read a
    1 'chr determina el caracter que corresponde a (argumento) y se irán cocatenado
    1125 sp$=sp$+chr$(a)
1130 next i
1 'Aquí le estamos poniendo en el sprite o plano 0 e la "tabla patrones de sprites" los bytes de nuestra nave'
1135 sprite$(0)=sp$
1150 DATA &h000,&h000,&h018,&h03C,&h066,&h07E,&h05A,&h000
1200 return

1 '------------------------'
2000 'Subrutina de captura de teclado'
1 '------------------------'
2010 k$=inkey$
2020 if k$="o" then px=px-1
2030 if k$="p" then px=px+1
2040 return

1 '------------------------'
3000 'Subrutina actualizar personajes'
1 '------------------------'
1 'Aquí le estamos poniendo en la "Tabla atributos de sprite' el plano o sprite 0, la posicion, el color y el sprite, nuestra nave
3020 put sprite 0,(px,py),15,0
3040 return

10000 end

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *