Páginas

08 mayo 2013

sprites del V9938 (2). OR de colores.

Como explicaba en la primera parte, el V9938, permite dibujar un color por cada linea del sprite, pero esto no soluciona mucho el trabajo de los grafistas. Por suerte el chip guarda un As en la manga: la superposición de sprites.

Dentro del valor de cada color, disponemos del bit 6 que indica si esa linea la fusionaremos con el color del plano anterior. Esto nos ofrece 3 colores o más por linea, ya que permite superponer varios sprites como si fueran bitplanos.

Ahora ya podemos representar nuestras figuras móviles con más detalle, pero el sistema tiene dos problemas:
  1. Gastamos 2 o más sprites. Si utilizamos esta medida para todas nuestras figuras, perdemos la ventaja de poder visualizar 8 sprites por linea.
  2. El calculo del color resultante se realiza mediante OR. Esto nos obliga a jugar con colores muy determinados, por lo que limita el uso de los colores y complica la tarea del grafista. 
El primer problema no es algo excesivamente importante. Tendremos que diseñar nuestros juegos adaptados a esta limitación. Si por ejemplo, nuestro juego es un shoot'em up, para los disparos podemos usar solo un sprite. La superposición es un sistema totalmente combinable que podemos utilizar cuando creamos necesario.

El segundo problema, se puede solucionar modificando la paleta con el orden que cuadre con los cálculos de OR que nos interese.

Recomendación: A la hora de diseñar una fase de un juego, es mejor empezar por definir los colores de los sprites y luego los que necesitemos para los gráficos, donde también podremos aprovechar los de los sprites.

A continuación muestro un ejemplo de una de las tablas más útiles, ya que seguramente uno de los colores que más usaremos será el negro (1) . Con esta, dispondremos de acceso a varias combinaciones de tonos de colores:


Nota: En la wiki de la MRC, hay un artículo que analiza muy bien el funcionamiento del color OR, donde se muestran varias tablas y casos de uso de juegos de Konami (The OR Color).


Como funciona?

Para el caso de 3 colores por línea, necesitaremos definir dos sprites que se situarán en planos consecutivos. El del plano superior, en la información de los colores el bit de OR, lo pondremos a 0 y en el de plano inferior lo pondremos a 1 (activo). A la hora de dibujar los sprites, los puntos que coincidan en los dos, se mostrarán con el color resultante del OR de los dos colores asignados a la línea de cada sprite.



A la hora de visualizarlos, tendremos que procurar que siempre estén colocados en la misma posición, escribiendo las mismas coordenadas en los atributos de los dos sprites, excepto en Basic como ahora veremos.


Facilidades en Basic

La versión 2 del MSX Basic, proporciona algunas facilidades frente a otros lenguajes (C o ASM), gracias al comando PUT SPRITE, que nos simplificará algunas tareas con relación a la superposición de colores. 

Lo primero que nos encontramos es su parámetro de color, que escribe el valor a las 16 líneas de la tabla de colores de los sprites, situada en la VRAM (h1C00 en screen4). Es una ventaja si vamos a usar solo 3 colores para el diseño de nuestra figura, ya que nos ahorraremos de escribir esos datos en cada plano (16B por sprite).
60 PUT SPRITE 2,(100,130),&H1,2
70 PUT SPRITE 3,(100,130),&H42,3 -- Activamos el bit de OR (h40) y asignamos el color 2.

Obtendremos un sprite con los colores 1, 2 y como extra el 3.

La segunda facilidad, es que podemos controlar la posición de los 2 sprites únicamente accediendo al que se encuentra en el plano superior.
100 PUT SPRITE 2,(100,Y(i)+20),&H1,2 -- movemos los planos 0 y 1 (OR) solo cambiando la posición del sprite 0.

Ejemplo (bajar):
10 DEFINT A-Z
12 DIM Y(100)
14 COLOR 15,14,14:SCREEN 4,2
16 RESTORE 10540:GOSUB 1030:rem palette
20 RESTORE 10020:HL=BASE(24):GOSUB 1010:rem patrones sprites
30 RESTORE 11010:FOR I=0 to 99:READ A:Y(I)=A:NEXT
40 PUT SPRITE 0,(180,100),0,0
50 PUT SPRITE 1,(180,100),0,1:rem los colores se asignan a la vram (linea 80)
60 PUT SPRITE 2,(100,130),&H1,2
70 PUT SPRITE 3,(100,130),&H42,3:rem los colores se asignan desde putsprite
80 RESTORE 10350:HL=&H1C00:GOSUB 1010:rem colores sprites
90 FOR I=0 to 99
100 PUT SPRITE 2,(100,Y(i)+20),&H1,2
110 IF INKEY$="" THEN NEXT ELSE END
120 GOTO 90
1000 REM -- LOAD DATA based on the function from Rafael Jannone
1010 READ R$: IF R$="*" THEN RETURN ELSE VPOKE HL,VAL("&H"+R$):HL=HL+1:GOTO 1010
1020 rem Set Palette
1030 FOR C=1 TO 15:READ R,G,B:COLOR=(C,R,G,B):NEXT
1040 RETURN
10000 REM colorOR
10010 REM SPRITE DATA
10020 DATA 07,0F,7F,7F,7F,1F,1F,0F,0F,17,17,1F,07,0F,1F,0F
10030 DATA E0,10,88,88,C8,C8,88,10,E0,B0,B8,B8,F8,B0,F8,F0
10040 DATA 00,07,0F,3F,0D,0D,0F,06,00,0B,0B,03,00,03,03,00
10050 DATA 00,E0,F0,F0,B0,B0,F0,E0,00,C0,D0,D0,00,40,00,00
10060 DATA 07,1F,3F,7F,7F,FF,FF,FF,FF,FF,FF,7F,7F,3F,1F,07
10070 DATA E0,18,C4,E2,E2,F1,F1,F1,F1,F1,F1,E2,E2,C4,18,E0
10080 DATA 00,07,1F,3F,3F,7F,7F,7F,7F,7F,7F,3F,3F,1F,07,00
10090 DATA 00,E0,F8,FC,FC,FE,FE,FE,FE,FE,FE,FC,FC,F8,E0,00
10330 DATA *
10340 REM COLOR MODE2 DATA
10350 DATA 01,01,01,01,01,01,01,01,01,01,01,01,01,01,01,01
10360 DATA 48,48,48,48,4A,4A,4A,4A,4A,42,42,42,42,44,44,44
10500 DATA *
10510 REM MSX2_Palette
10520 REM Red, Green, Blue
10540 DATA 0,0,0
10550 DATA 1,5,1
10560 DATA 3,6,3
10570 DATA 2,2,5
10580 DATA 3,3,7
10590 DATA 5,2,1
10600 DATA 2,6,7
10610 DATA 6,2,2
10620 DATA 7,0,0
10630 DATA 6,6,3
10640 DATA 7,7,0
10650 DATA 1,4,1
10660 DATA 7,3,0
10670 DATA 6,6,6
10680 DATA 7,7,7
11000 REM sinus 0 -140 (100)
11010 DATA 70,65,61,56,52,48,43,39,35,32,28,25,21,18,15,12
11020 DATA 10,8,6,4,3,1,1,0,0,0,0,0,1,2,3,5
11030 DATA 7,9,11,14,17,20,23,26,30,34,37,41,46,50,54,58
11040 DATA 63,67,72,76,81,85,89,93,98,102,105,109,113,116,119,122
11050 DATA 125,128,130,132,134,136,137,138,139,139,139,139,139,138,138,136
11060 DATA 135,133,131,129,127,124,121,118,114,111,107,104,100,96,91,87
11070 DATA 83,78,74,70

Referencias:

03 mayo 2013

Publicada devtool BytesGen!

Acabo de publicar una pequeña herramienta para generar tablas de senos, cosenos, números aleatorios o a partir de ficheros binarios. La salida puede ser en código Basic, C, Ensamblador y Ensamblador de SDCC.

La opción de ficheros binarios, permite añadirle un valor para indicar el inicio de los datos y poder saltar cabeceras como en el caso de los ficheros binarios del MSX Basic (ejem: SC2).

Esta desarrollado en Microsoft Visual Basic 2008 Express. Proporciono los fuentes por si alguien lo quiere adaptar a sus necesidades o mejorarlo.



05 abril 2013

sprites del V9938 (MSX2)


Con motivo del testeo de la aplicación spriteSX, me he metido a aprender el funcionamiento de los sprites del V9938 (MSX2), a nivel práctico (una asignatura pendiente que tenia desde hace tiempo), y  he decidido realizar este post como apunte, que espero que sea útil para quien en algún momento pueda necesitarlo.

Empezaré recordando las características de los sprites del V9938:
  • 256 patrones de 8x8 o 64 patrones de 16x16
  • visualización normal o modo zoom (x2), de todos los sprites.
  • 32 planos (los valores más altos se ven por debajo)
  • hasta 8 por línea.
  • un color por línea.
  • colisión ajustable a nivel de línea.
  • se pueden crear sprites con 3 colores por linea (o más), superponiendo varios sprites y activando el bit de OR en los colores.
A nivel de memoria de vídeo, se conserva la tabla de atributos de sprites, aunque el byte asignado al color no tiene efecto, y se añade una tabla de colores para los 32 planos de sprites (* 16 valores por sprite) (ver las direcciones de las tablas en cada modo de pantalla).
Podemos definir hasta 64 patrones de sprite de 16x16 y asignar a cada plano el que queramos, pero a la hora de asignar sus colores, tendremos que copiarlos en la su correspondiente posición de la tabla de colores. Esto puede ser algo molesto, ya que si tenemos un juego en el que vamos cambiando los sprites de forma dinámica o utilizamos el mismo patrón en diferentes planos, tendremos que volcar su información de color para cada plano.

En cada valor de color, no solo tenemos el código de color, también podemos habilitar algunas funciones: (info via Portar)
Bit 0-3 - Código de color (0-15)
Bit 4 - No se usa.
Bit 5 - Ignora las colisiones con otros sprites. (1=Ignora)
Bit 6 - Mix de color con el siguiente sprite de prioridad más alta.
Bit 7 - Early clock (cambia la línea 32 píxeles a la izquierda)
El bit de Early clock, se usa principalmente para cuando deseemos que el sprite aparezca/desaparezca de forma gradual, por el borde izquierdo de la pantalla. El echo de que se pueda hacer a nivel de línea, lo deja abierto a nuestra creatividad. :P

También disponemos de una coordenada y mágica, que oculta el sprite y los siguientes situados en planos inferiores. Su valor para los nuevos modos del V9938 será la posición 216.

Nota: La activación de los modos de sprite (tamaño y zoom), tanto en Basic con la instrucción SCREEN, como directamente desde los registros del VDP, son exactamente igual que en el TMS9918.

Para acabar, añadiré un ejemplo (descargar), que he utilizado como prueba de la salida de datos para Basic del spriteSX. Para no alargar demasiado este post, dedicaré en uno próximo, el tema del OR de colores.

10 DEFINT A-Z
12 COLOR 15,4,4:SCREEN 4,2
14 RESTORE 10540:GOSUB 1030
20 RESTORE 10020:HL=BASE(9):GOSUB 1010
30 N=7:X=0:Y=0
40 for i=0 to N
50 PUT SPRITE I,(X*16,Y*16),15,I
60 X=X+1:IF X=8 THEN X=0:Y=Y+1
70 NEXT
72 RESTORE 10350:HL=&H1C00:GOSUB 1010
80 IF INKEY$="" THEN 80 ELSE END
1000 REM -- LOAD SPRITES by Rafael Jannone
1010 READ R$: IF R$="*" THEN RETURN ELSE VPOKE HL,VAL("&H"+R$):HL=HL+1:GOTO 1010
1020 rem Set Palette
1030 FOR C=1 TO 15:READ R,G,B:COLOR=(C,R,G,B):NEXT
1040 RETURN
10000 REM Frutas 16x color
10010 REM SPRITE DATA
10020 DATA 0F,1F,3D,3F,7B,7C,BF,BF,9F,EF,6F,1F,0F,05,05,1D
10030 DATA C0,E0,60,C0,40,80,80,84,86,DE,C0,C0,80,00,00,C0
10040 DATA 03,07,4F,CF,4D,4F,2C,1E,3F,3F,3F,3F,1F,02,02,06
10050 DATA C0,E2,E6,E2,A2,F4,38,7C,FE,FE,FE,FC,F8,40,40,60
10060 DATA 05,07,1A,2E,6F,5B,5C,5B,5F,58,6F,2D,16,02,02,06
10070 DATA 40,C0,B8,D4,D4,6A,EA,6A,EA,6A,D4,D4,F8,40,40,60
10080 DATA 05,07,1F,3F,7F,7F,7F,7D,7F,7F,78,3F,1F,04,04,0C
10090 DATA 40,C0,F0,F8,FC,FC,FC,7C,FC,FC,3C,F8,F0,40,40,60
10100 DATA 07,1F,3F,3F,7F,71,7F,7F,7F,7E,3E,3F,1F,07,02,06
10110 DATA E0,F8,FC,FC,FE,8E,FE,FE,FE,7E,7C,FC,F8,E0,40,60
10120 DATA 00,07,1F,3F,7F,71,FF,FF,7B,7C,3F,1F,07,02,02,06
10130 DATA 00,E0,F8,FC,FE,8E,FF,FF,DE,3E,FC,F8,E0,40,40,60
10140 DATA 05,1E,3F,6F,57,6E,3F,00,07,05,07,04,06,03,02,06
10150 DATA 60,F8,F4,EA,76,BE,7C,00,E0,60,E0,20,60,C0,40,60
10160 DATA 05,1E,3F,6F,57,6E,3F,07,07,05,07,04,06,03,02,06
10170 DATA 60,F8,F4,EA,76,BE,7C,E0,E0,60,E0,20,60,C0,40,60
10180 DATA *
10340 REM COLOR MODE2 DATA
10350 DATA 0C,0C,0C,0C,02,02,03,03,03,03,03,02,0C,0F,0F,07
10360 DATA 0C,02,02,02,0C,02,02,02,02,02,02,02,0C,0E,0E,05
10370 DATA 0A,0A,0B,0B,0B,0B,0B,0B,0B,0B,0B,0B,0B,0E,0E,05
10380 DATA 0C,0C,09,09,09,09,09,09,09,09,09,09,09,05,0F,07
10390 DATA 0D,0D,0D,0D,0D,0D,0D,0D,0D,0D,0D,0D,0D,0D,07,07
10400 DATA 0D,0A,0B,0B,0B,0B,0B,0B,0B,0B,0B,0B,0A,0E,05,05
10410 DATA 08,09,09,09,09,09,08,0E,0D,0D,0D,0D,0D,0D,0E,0E
10420 DATA 0A,0E,0A,0E,0A,0E,0A,05,0F,0F,0F,0F,0F,0F,0E,0E
10430 DATA *
10510 REM MSX2_Palette
10520 REM Red, Green, Blue
10540 DATA 0,0,0
10550 DATA 1,5,1
10560 DATA 3,6,3
10570 DATA 2,2,5
10580 DATA 3,3,7
10590 DATA 5,2,1
10600 DATA 2,6,7
10610 DATA 6,2,2
10620 DATA 7,0,0
10630 DATA 6,6,3
10640 DATA 7,7,0
10650 DATA 1,4,1
10660 DATA 7,3,0
10670 DATA 6,6,6
10680 DATA 7,7,7

Disponéis de más información en:

24 febrero 2013

veejingSX v0.9.9.6b automatic control


Con motivo de la celebración del evento chiptune stage V6 (celebrado este pasado sábado 23 de febrero y organizado por el club sprite), he realizado una versión con un cambio menor, de la funcionalidad. He eliminado el modo selectivo (la activación de los diferentes contenidos con las teclas numéricas), para añadir un modo automático de disparar contenidos aleatorios. Este se activa mediante los números, siendo el 1, la más rápida y el 9 la más lenta. El 0 se utiliza para desactivar este modo.

También he sustituido las teclas usadas para lanzar algunos contenidos de forma aleatoria por las usadas por el modo selectivo, que son más accesibles (tab, shift y ctrl).

Podéis bajarlo desde la WEB del proyecto.

27 enero 2013

dibujo LSDJboy (v2)


A finales del 2012 participé en la compo del segundo aniversario de CulturaChip [II CUMPLE CC], en la categoría de Composición Gráfica, consiguiendo el segundo puesto! :D

La imagen esta realizada utilizando Photoshop Elements v2, con las limitaciones gráficas del modo de pantalla screen 2, de los ordenadores MSX (TMS9918). Para conseguir más colores en determinados sitios (la cara, gameboy y el cable), utilicé sprites de 16x16 x 1 color, que dibujé en una capa a parte. También le he añadido tramas (no muchas) y donde me ha sido posible, algún punto para crear efecto de antialiasing.

Más tarde me ha apetecido hacer una versión (v2), mejorando alguna cosa y añadiendo el altavoz, donde dibujé unos textos.

Para crear el SC2, he utilizado la WEB tool, MSX Screen conversor de Jannone, del dibujo sin la parte de los sprites. Para estos, los he dibujado utilizando una aplicación que estoy desarrollando (spriteSX), y los he volcado en código Basic, donde más tarde los he juntado con la imagen y guardado el resultado (VRAM), en un fichero binario [ bsave"fichero.sc2",0,16383,S].
  • Podéis descargar el fichero en formato SC2 nativo de MSX.
  • Para ver y escuchar el resto de participaciones podéis ir a la siguiente WEB.

05 enero 2013

Revista Super Juegos

Hace unos días me encontré en el armario, el número 3 de la revista Super Juegos. Esta publicación de la editorial Manhattan Transfer, trataba de juegos en general (tablero, cartas, etc) y videojuegos. Fue la precursora de la MSX Extra, ya que publico 2 números "extra" Ordenadores MSX y que luego paso a ser independiente.


22 octubre 2012

amiVJing v0.5b


El pasado viernes 19 de Octubre, participé en el lowcycle, haciendo las visuales de la sesión de neuroflip. He utilizado el programa que estoy desarrollando, para ordenadores Amiga, amiVJing. En estas últimas semanas lo he mejorado, pero aun le falta bastante para ser una herramienta completa.

Entre las novedades, se encuentra la lectura de la paleta de los ficheros ILBM, necesaria para componer la paleta del dualplayfield + sprites. Este punto es importante, ya que simplifica la carga de medios. También utilizo 7 sprites de 64x64 pixels de 4 colores, que se muestran de forma animada, (de momento solo 2 animaciones), y para la capa principal (donde se muestran pantallas fijas), le he añadido un efecto de distorsión horizontal (glitch). El código ahora es más limpio y he usado etiquetas para acceder mejor a sus diferentes partes, ya que el editor es algo tosco.

En futuras versiones, quiero añadir más animaciones de sprites, FXs y multicarga de medios. Este último punto consistiría en asignar a las teclas de función, la carga de las imágenes y así poder personalizar cada parte de una sesión.


Para esta última versión, he pasado al AmiBlitz v2.44, pensando en que habrían mejorado algunos problemas que encontré en la 2.1 (animaciones y lectura de la paleta con AGARed, AGAGreen y AGABlue en slices), pero no ha sido así.