Karoshi MSX Community
05 de Julio de 2021, 06:57:24 pm *
Bienvenido(a), Visitante. Por favor, ingresa o regístrate.

Ingresar con nombre de usuario, contraseña y duración de la sesión
Noticias:
 
   Inicio   Ayuda Buscar Ingresar Registrarse  
Páginas: [1]
  Imprimir  
Autor Tema: sprites multiplexer para msx 2  (Leído 5112 veces)
0 Usuarios y 1 Visitante están viendo este tema.
samsaga2
Karoshi Fan
**
Mensajes: 76


Email
« : 20 de Abril de 2013, 07:47:31 am »

A ver si podeis ayudarme. Para hacer el parpadeo de los sprites lo que hacía en msx1 era rotarlos. Volcar primero sprites 0 1 2 3 4..., en el siguiente frame sprites 1 2 3 4 ... 0, luego 2 3 4 ... 0 1 etc... Mi problema es que en msx 2 no es tan fácil porque tambíén hay que mover la tabla de colores de sprites con lo que es un gasto innecesario. ¿Como puedo implementar el multiplexer de sprites en msx 2?
En línea
nenefranz
Karoshi Fan
**
Mensajes: 67



« Respuesta #1 : 20 de Abril de 2013, 10:01:16 am »

Buenas,

Entiendo que si consideras un malgasto mover la tabla de colores de sprites cada vez es porque los sprites que mostrarás no cambiarán de color, sólo el patrón y su posición. ¿Es así?
Se me ocurre que repitiendo dos veces los colores de los sprites en la tabla de colores, y luego cambiando en cada "frame" el plano donde muestras los sprites.
Como esta explicación no es demasiado clara Smiley, pongo un ejemplo (ejemplo extremo):

Imagina que quieres mostrar 16 sprites (será el máximo posible).
Primero rellenas la tabla de colores de sprites: rellenas los colores para los 16 primeros planos, y repite los mismos colores en los siguientes 16 planos.
El plano 0 y 16 utilizarán el mismo color (cuando digo color me refiero a poner los mismos 16 valores en la tabla de colores), el plano 1 y 17 los mismos, etc.

Código:
plano :  00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
color :  00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15

En el ejemplo he puesto que cada plano utiliza un color diferente, es sólo un ejemplo exagerado.
Ahora en cada frame del juego/animación cambias el plano en el que muestras cada sprite.
Cuando pongo -- es que no se muestra ningún sprite en ese plano, creo que se hace poniendo 216 en la posición Y.
(esto último lo digo de memoria, no recuerdo bien que valor hay que poner. En MSX1 para no mostrar el sprite se pone Y=209 pero en MSX2 es otro valor)

En el primer frame muestras los sprites en los 16 primeros planos:
Código:
color :  00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15
plano :  00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
patron:  40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

En el siguiente frame muestras el primer sprites del frame anterior como el último:
Código:
color :  00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15
plano :  00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
patron:  -- 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 40 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
(ahora el primer sprite pasa a ser el último aunque con el mismo color)

En el siguiente frame volvemos a repetir el procedimiento anterior:

Código:
color :  00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15
plano :  00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
patron:  -- -- 42 43 44 45 46 47 48 49 50 51 52 53 54 55 40 41 -- -- -- -- -- -- -- -- -- -- -- -- -- --

Vamos repitiendo este procedimiento hasta que todos los sprites se muestran en los planos 16-31, entonces vuelves a empezar como en el frame1 utilizando los planos 0-15.

Este "procedimiento" tiene la limitación de poder utilizar sólo 16 planos de sprites como máximo.
Además de que estás muy "enconsertado" a la hora de repartir los sprites. Porque siempre deberás utilizar los mismos planos.
Por ejemplo: el prota siempre en el plano 0, el enemigo 1 en el plano 1, enemigo 2 en plano 2, etc.
Si por ejemplo matas al enemigo 3 ... ese plano tendrás que deshabilitarlo, y en el momento de rotar planos tendrás que saltarlo.

Ejemplo: imagina que esta es la configuración del frame actual.

Código:
color :  00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15
plano :  00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
patron:  -- -- 42 43 44 45 46 47 48 49 50 51 52 53 54 55 40 41 -- -- -- -- -- -- -- -- -- -- -- -- -- --

El enemigo 3 está en el plano 3, y lo matán ... por tanto habría que "eliminarlo", por tanto lo deshabilitamos.
Código:
color :  00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15
plano :  00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
patron:  -- -- -- -- 44 45 46 47 48 49 50 51 52 53 54 55 40 41 42 -- -- -- -- -- -- -- -- -- -- -- -- --
si en el siguiente frame el enemigo 3 sigue muerto, cuando rotemos tendríamos que saltarnos el plano 3 e ir a por el 4:

Código:
color :  00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15
plano :  00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
patron:  -- -- -- -- -- 45 46 47 48 49 50 51 52 53 54 55 40 41 42 -- 44 -- -- -- -- -- -- -- -- -- -- --

¿No se si me explico bien, o te he liado?

Por supuesto si utilizas menos sprites (por ejemplo 12) la estructura quedaría así (los planos 24-31 no los utilizarías):
Código:
color :  00 01 02 03 04 05 06 07 08 09 10 11 00 01 02 03 04 05 06 07 08 09 10 11
plano :  00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23
patron:  40 41 42 43 44 45 46 47 48 49 50 51 -- -- -- -- -- -- -- -- -- -- -- --

Seguro que debe existir alguna manera más eficiente de hacer todo esto, además no creo que se corresponda perfectamente a lo que estás haciendo.
Pero espero que la explicación te pueda dar ideas para que encuentres una mejor solución que se adapte mejor a tu proyecto.

Saludos,
En línea
nanochess
Karoshi Lover
***
Mensajes: 141


Programando algo buenísimo :)


WWW
« Respuesta #2 : 21 de Abril de 2013, 04:26:01 pm »

Cuando integré código para usar el modo MSX2 en Princess Quest y Mecha-8 también tuve el mismo problema, ¿saben qué hice? no hice nada, tengo dos códigos en la interrupción:

* En MSX1 (4 sprites en línea), se ciclan los sprites con el consabido parpadeo cuando hay muchos sprites.
* En MSX2 (8 sprites en línea, ¡pero 16 bytes de color!), simplemente copio la tabla directamente y en la práctica casi nunca tengo más de 8 sprites en línea.

Ahora en la rutina que se encarga de leer los monigotes y llenar la tabla de sprites para su uso por la interrupción, PRIMERO pongo el protagonista y después los enemigos (así en MSX2 el protagonista no desaparece si llegara a exceder 8 sprites).

Es más en Mecha-8, los sprites negros de las sombras de los enemigos los pongo AL FINAL de la tabla, de esta forma si ocurre el exceso de sprites desaparecen sus sombras PERO NO los enemigos.

Este orden no le afecta al ciclado de sprites en MSX1 y evita que desaparezcan sprites importantes en MSX2, y aparte hay que hacer otra rutina para llenar la tabla de color MSX2, todo un desbarajuste, pero funciona Smiley

Por supuesto también depende del juego para tratar de no mostrar demasiados sprites en la misma línea, supongo que ahora se entiende porque hay tantas curvas en mis juegos Smiley
En línea

Mira mis juegos MSX/Colecovision/Atari/Intellivision http://nanochess.org/retro_es.html, y sígueme en Twitter http://twitter.com/nanochess
samsaga2
Karoshi Fan
**
Mensajes: 76


Email
« Respuesta #3 : 24 de Abril de 2013, 08:37:50 am »

Veo que está complicado el tema. El problema es que mi juego es casi horizontal y ocurre a menudo que haya más de ocho sprites en linia. Intenté usar el vdp status#0 que indica el sprite "sobrante" (mi idea era no pintarlo en el siguiente frame) pero no sé porque no acabo de leer bien el sprite problematico.
En línea
theNestruo
Karoshi Lover
***
Mensajes: 236


Email
« Respuesta #4 : 24 de Abril de 2013, 06:01:52 pm »

Hola.

¿Pero exactamente cuál es el problema de volcar los colores? Porque al igual que muchos juegos cambian los patrones de los sprites al vuelo en cada frame se podrían volcar los colores.
Además, si no me equivoco, en VDP de MSX2 o superior ya puedes hacer ese volcado con otir sin problema...
En línea

theNestruo."Old BASIC programmers never die; they GOSUB but never RETURN."
nanochess
Karoshi Lover
***
Mensajes: 141


Programando algo buenísimo :)


WWW
« Respuesta #5 : 25 de Abril de 2013, 02:33:25 pm »

Pues sería cuestión de saber como son tus sprites, es decir como son los 16 bytes de colores que usan cada uno ¿todos usan el mismo color?, ¿la mayoría usan un color?, ¿todos de color diferente?, ¿usas doble o triple sprite por monigote?

He estado pensando en una técnica que te serviría muy bien sin importar el tipo de juego. El asunto es como sigue:

1. Tienes DOS tablas de sprites y DOS tablas de colores en zonas diferentes de la VRAM.
2. En un frame llenas UNA tabla de sprites con los sprites en orden (0-31), y en el otro frame llenas la OTRA tabla de sprites con los sprites en orden inverso (31-0)
3. Lo mismo para las tablas de colores.
4. En cada frame switcheas entre ambas tablas de sprites y de colores (modificando los registros base)

De esta forma consigues hasta 16 sprites en línea. Smiley
En línea

Mira mis juegos MSX/Colecovision/Atari/Intellivision http://nanochess.org/retro_es.html, y sígueme en Twitter http://twitter.com/nanochess
samsaga2
Karoshi Fan
**
Mensajes: 76


Email
« Respuesta #6 : 29 de Abril de 2013, 02:21:28 pm »

Pues uso los sprites al máximo, 32 sprites de colores diferentes y usando el bit para hacer xor de colores. Ahora en la interrupción estoy movimendo en cada frame 32 sprites más un volcado de pantalla, en total unos 768bytes. Sería viable añadir también volcar la tabla de colores en cada interrupción (512bytes más)? Me parece demasiada vram para una interrupción.
En línea
theNestruo
Karoshi Lover
***
Mensajes: 236


Email
« Respuesta #7 : 29 de Abril de 2013, 07:38:56 pm »

Si te sirve de referencia, yo ahora mismo estoy volcado 10 patrones de sprites (320 bytes), atributos para 12/14 (48 bytes) y luego toda la tabla de nombres (768 bytes). En total unos 1200 bytes. Todo esto sin la BIOS, sino usando una versión adaptada de FLDIRVM de SapphiRe que anda por los snippets, creo.
La primera parte, la de los sprites, la hago sin NOPs. La segunda, la de la tabla de nombre, con NOPs. Y a 60Hz (que es el peor de los casos) todo esto acaba a medio frame.
Como en tu caso se trata de MSX2, creo que no hacen falta los NOPs (alguien que controle más del tema que me corrija si no es cierto). He probado a quitarlos y a 60Hz acaba cuando lleva 1/3 de frame.
Además, mis volcados no son directos y además hay fragmentos que no tengo optimizados. Vamos, que tengo algún cálculo que otro en medio de los volcados. Así que seguramente en un caso más cercano al ideal (por ejemplo, que la NAMTBL y la SPRATR se vuelquen tal cual de algún buffer en RAM) puedas rebajarlo un poco...

De todos modos, lo mejor es que pruebes. Mete el volcado de la NAMTBL dos veces (que serían más bytes de los que realmente quieres volcar) y, si eso no se te va de frame, cualquier cosa de menos bytes tampoco se te va a ir Wink
En línea

theNestruo."Old BASIC programmers never die; they GOSUB but never RETURN."
nanochess
Karoshi Lover
***
Mensajes: 141


Programando algo buenísimo :)


WWW
« Respuesta #8 : 29 de Abril de 2013, 08:15:32 pm »

Pues uso los sprites al máximo, 32 sprites de colores diferentes y usando el bit para hacer xor de colores. Ahora en la interrupción estoy movimendo en cada frame 32 sprites más un volcado de pantalla, en total unos 768bytes. Sería viable añadir también volcar la tabla de colores en cada interrupción (512bytes más)? Me parece demasiada vram para una interrupción.
Hmmm... Si llevas demasiado, hay un truco para que te des cuenta fácilmente.

En el momento de entrar en la rutina de interrupción pones el registro de borde en color blanco, y saliendo de la rutina de interrupción lo devuelves al color que estés usando.

En teoría el blanco no debería mostrarse más allá de un cuarto de pantalla por arriba, de lo contrario no te queda tiempo para el juego Wink
En línea

Mira mis juegos MSX/Colecovision/Atari/Intellivision http://nanochess.org/retro_es.html, y sígueme en Twitter http://twitter.com/nanochess
Páginas: [1]
  Imprimir  
 
Ir a:  

Impulsado por MySQL Impulsado por PHP Powered by SMF 1.1.21 | SMF © 2013, Simple Machines XHTML 1.0 válido! CSS válido!