Página 3 de 4

Re: Experimentos pintado de sprites en ensamblador

Publicado: Lun, 16 Dic 2013, 13:01
por antoniovillena
Realmente no tengo la suficiente experiencia como para opinar, pero el ensamblador es siempre el mismo por lo que da igual, los problemas que surjan al portarlos a C o a otro lenguaje serán ajenos a la implementación.

Tampoco creo que el z88dk sea tan malo, así que cuando termine las rutinas lo portaré a este compilador, el paso a sdcc sería sencillo.

Al final he simplificado la API, ahora tan sólo se necesita escribir en una tabla de sprites y hacer una única llamada a do_sprites dentro del bucle principal de tu juego

Re: Experimentos pintado de sprites en ensamblador

Publicado: Lun, 16 Dic 2013, 13:05
por na_th_an
La diferencia principal es que para z88dk podrás hacer un .lib con toda la biblioteca. Los que vayan a usar las rutinas tendrán la ventaja de que sólo se incluirán en el binario final los objetos contenidos en la biblioteca que se utilicen.

Re: Experimentos pintado de sprites en ensamblador

Publicado: Lun, 16 Dic 2013, 13:17
por radastan
$this->bbcode_second_pass_quote('antoniovillena', '
')Al final he simplificado la API, ahora tan sólo se necesita escribir en una tabla de sprites y hacer una única llamada a do_sprites dentro del bucle principal de tu juego


Algo me dice que si me autorizas metemos tu librería en el curso de Z88DK de serie, si es tan sencilla es absurdo que haga yo otras rutinas menos eficientes para sprites al pixel. De todas formas trataré de currarme alguna por diversión, pero si me lo permites las tuyas serán las oficiales.

Sólo faltaría un scroll en alta resolución, pero eso me lo puedo currar yo.

Re: Experimentos pintado de sprites en ensamblador

Publicado: Lun, 16 Dic 2013, 14:18
por antoniovillena
$this->bbcode_second_pass_quote('radastan', '')$this->bbcode_second_pass_quote('antoniovillena', '
')Al final he simplificado la API, ahora tan sólo se necesita escribir en una tabla de sprites y hacer una única llamada a do_sprites dentro del bucle principal de tu juego


Algo me dice que si me autorizas metemos tu librería en el curso de Z88DK de serie, si es tan sencilla es absurdo que haga yo otras rutinas menos eficientes para sprites al pixel. De todas formas trataré de currarme alguna por diversión, pero si me lo permites las tuyas serán las oficiales.

Sólo faltaría un scroll en alta resolución, pero eso me lo puedo currar yo.


Por supuesto que te autorizo, faltaría más. A ver, la librería tal y como la estoy haciendo es para fondos estáticos, no valdría para scroll. Para fondos estáticos es más rápido borrar uno a uno los sprites y luego pintarlos, todo esto durante el borde superior/inferior o retrazo vertical para que no haya parpadeos.

Para lo que dices del scroll habría que coger una aproximación parecida a lo que hice en la primera demo. Es decir un volcado de pantalla en el momento justo y un pintado posterior de sprites, haciendo el scroll a la vez que el volcado de pantalla. El problema aquí es que es imposible hacer un scroll a pantalla completa en un frame, lo que se suele hacer es reducir el área de la pantalla o bien los fps (si usas dos frames tendrías 25fps, si usas tres, 16.67fps). Yo lo hice con una rutina de volcado sin scroll, un área de pantalla de la mitad (24x16 celdas) y 13 sprites en pantalla, se consiguen 50fps pero no sobra tiempo para nada más, por eso me lancé a esa segunda demo.

La forma de hacer el scroll es un tema aparte, si quieres tener un mapeado sin limitaciones (como Operation Wolf) no tienes más remedio que reducir los fps. Sin quieres algo rápido como en Cobra, no tienes más remedio que reducir el número de tiles que puede haber en una línea (esto te limita el mapeado), ya que el volcado se hace pusheando los registros a pila, y como el número de registros es limitado el número de tiles por línea también lo será.

Re: Experimentos pintado de sprites en ensamblador

Publicado: Lun, 16 Dic 2013, 15:14
por radastan
$this->bbcode_second_pass_quote('antoniovillena', 'A') ver, la librería tal y como la estoy haciendo es para fondos estáticos, no valdría para scroll.


Es que meter scroll con tu rutina me parece ya un absurdo para un simple curso, una cosa es dar facilidades a la gente y otra currarse un supermotor que ni en los tiempos de Dinamic, oiga.

Con scroll me refiero a lo mismo que tengo echo ya pero en alta resolución. No es necesario que en dicha área haya sprites para que tenga utilidad. Hay muchos juegos con scroll en una parte de la pantalla pero que no es navegable por los sprites. Es decir, no te preocupes, es un añadido que no debe entorpecer tu rutina porque no usará interrupciones. Incluso es utilizable como FX para alguna cosa (ej. movimiento de agua o lava), este tipo de scroll si tengo pensado que sea cíclico). Un ejemplo: una zona azul con burbujitas subiendo, con este scroll se arregla de vicio y puedes tener a tus sprites pupulando por la pantalla.

Para scroll a toda pantalla prefiero el de "a todo color", es muy triste un juego enteramente en monocromo o con líneas de color para evitar el "color crash" en el scroll (hay trucos, como dejar caracteres en negro, pero es otro tema).

Nada, muchas gracias por la autorización, serás convenientemente mencionado como autor, por supuesto. Igual que Na_Th_An por la ayuda que me está prestando.

A ver si entre esto y la churrera hacemos que 2014 sea el año del ZX Spectrum. :jias:

Re: Experimentos pintado de sprites en ensamblador

Publicado: Sab, 21 Dic 2013, 03:00
por antoniovillena
Al final se me está complicando la cosa. El problema es que la implementación 48k y 128k son tan distintas que tengo que agregar también el motor de tiles y el compresor de mapas a la librería. El funcionamiento de estos tres componentes (sprites, tiles y compresor) son similares, lo que se hace es escribir en ciertas zonas de memoria y el motor se encarga automáticamente de actualizar los elementos gráficos.

Re: Experimentos pintado de sprites en ensamblador

Publicado: Vie, 03 Ene 2014, 00:16
por antoniovillena
Ya tengo muy avanzado el engine. Lo que hago es detectar la máquina y en función de esta genero las rutinas de pintado. Hay 3 posibilidades:

Os dejo la demo para que la disfrutéis

Re: Experimentos pintado de sprites en ensamblador

Publicado: Vie, 03 Ene 2014, 11:05
por D_Skywalk
Está de PM, como sugerencia si yo quisiera hacer un juego exclusivo 128K, poner un define para que no haya detección y ahorrar bytes :?

La detección y hacerlo ultra compatible, me parece ¡Fantástico!
:wan: :wan: :wan:

Re: Experimentos pintado de sprites en ensamblador

Publicado: Sab, 04 Ene 2014, 01:18
por antoniovillena
Puede hacerse pero no tiene sentido. Primero porque los bytes que se ahorran son muy pocos y sólo nos ahorramos un poco de tiempo de carga en cinta. La rutina de detección y las otras 2 rutinas se desechan, o mejor dicho, la machaca el código del juego en cuestión.

Más adelante si la cosa prospera me gustaría meter niveles de forma transparente, de tal forma que un nivel suelto nunca supere los 48K y todos los niveles juntos se puedan empaquetar en 128K. Aunque aquí no se aprecie porque sólo he puesto el TAP, el engine ha evolucionado de tal forma que se encarga practicamente de todo el apartado gráfico. Por ejemplo hay un motor de tiles que permite hasta 256 tiles y estos pueden indexarse. La indexación funciona de la siguiente forma, si tenemos muchos tiles idénticos pero con distintos colores (por ejemplo las rocas en Phantomas 2), estos se codifican más eficientemente indexando los bitmaps. Si por el contrario tenemos muchos tiles distintos pero con los mismos atributos sería mejor aplicar un indexado de atributos. Finalmente existe un indexado mixto. Todo esto ya te digo de forma totalmente transparente, el GfxBu detecta los duplicados en los tiles y te los codifica de la forma que quieras (de entre las 4 maneras posibles).

Luego está el compresor de mapas que es el mismo que le he metido a la Churrera. Al contrario que SpLib la comunicación del juego con el engine no es a través de llamadas a subrutinas, sino a través de estructuras en la memoria. Por ejemplo hay una estructura entre $FE00 y $FE40 que maneja los sprites, indicando su posición X, Y, si está activado o no y el número de sprite a pintar. Los tiles se manejan con las posiciones $5b00, $5b01..$5b96 y $5bfe..$5bff. En la primera posición le decimos al engine que queremos posicionarnos en la pantalla X, una escritura en dicho byte provoca que se pinte toda la pantalla y se carguen en el array $5b01..$5b96 los índices de los tiles. Ahora bien, si quieres modificar los tiles de la pantalla actual, ya sea para animarlos o para abrir un cerrojo, esto se hace escribiendo directamente en $5b01..$5b96 y especificando el rectángulo de tiles a actualizar en $5bfe..$5bff

No te entretengo más. Si quieres puedes encargarte de la parte de alto nivel del engine. En principio he pensado en C pero puede ser cualquier lenguaje. El único requisito es que empiece en $8000 y acabe en una posición determinada por el tamaño de los elementos gráficos pero normalmente tendrás entre 24 y 30K para lo que es el juego en sí (descontando engine en ensamblador y elementos gráficos: sprites, tiles, mapa). Como no hay API no tendrías que enlazar ninguna librería, ah y otra cosa, el descompresor va incluido en el engine ensamblador, es una modificación del ZX7 que va hacia atrás y lleva el filtro RCS incorporado.

Re: Experimentos pintado de sprites en ensamblador

Publicado: Dom, 05 Ene 2014, 19:10
por D_Skywalk
Me parece alucinante :o

De hecho había cosas que había pensado yo, como eso que dices de tiles iguales pero con atributos diferentes, me parece perfecto :muaka:

Dime lo que tengo que hacer para hacer el api en C :dalefran: