Página 4 de 6

Re: Pintando sprites de 16x16 en ensamblador

Publicado: Lun, 09 Dic 2013, 23:43
por radastan
$this->bbcode_second_pass_quote('angel', 'H')as pensado en sprites de 16x24 u otras combinaciones no cuadradas? :D

EDIT: esto sin ejemplos para ver no mola na :lol:


Si, he pensado en el clásico 32x16 (muy típico en decorados).

Así como ejemplo de lo que puede hacer con cuatro instrucciones...

Re: Pintando sprites de 16x16 en ensamblador

Publicado: Lun, 09 Dic 2013, 23:57
por angel
Cojonudo! pero me refería a sprites. Por ejemplo, para hacer uno estilo helmet:

Image

Sprites de 16x24 :D

Re: Pintando sprites de 16x16 en ensamblador

Publicado: Mar, 10 Dic 2013, 00:01
por radastan
Es que realmente un sprite y un tile no tienen distinción. La diferencia de un sprite es que se mueve, pero la rutina de impresión es la misma, lo único que cambia es que se añaden dos rutinas más para recoger y reponer el fondo (en caso de haber uno y que se quiera mantener).

Pero si, tomo nota del de 16x24 y también uno de 24x32.

A ver si animo a la gente a poner personajes grandes y a color en pantalla.

EDITADO: Ala, ya están metidas las dos. :jias:

Re: Pintando sprites de 16x16 en ensamblador

Publicado: Mar, 10 Dic 2013, 00:15
por antoniovillena
Sí que tienen distinción, hay 2 matices que los diferencian:
-El tile nunca va enmascarado, es decir un tile (azulejo) es siempre rectangular y no tiene contorno.
-El tile tiene restringidas sus coordenadas x e y, de tal forma que sólo puede ocupar una posición en la rejilla de tiles, sin posibilidad de solaparse con otros tiles.

Es decir, un sprite tiene mucha más libertad, y por tanto es más "complejo" de dibujar. Lo que pasa es que si te pones a ponerle condiciones al sprite como se la has puesto (sin máscara y con movimiento de carácter, al final tienes "casi" un tile. Digo casi porque puedes tener como coordenada del sprite cualquiera de los 768 carácteres, sin embargo en un tile (por ejemplo si hablamos de 16x16) ya serían la cuarta parte de posibles posiciones.

Por cierto hay instrucciones en el código que no hacen nada, te las marco con asterisco.

$this->bbcode_second_pass_code('', '
add a,32
ld e,a
* ld a,d
* adc a,0
push de
ldi
ldi
ldi
pop de
ld a,e
add a,32
ld e,a
* ld a,d
* adc a,0
ldi
ldi
')

Re: Pintando sprites de 16x16 en ensamblador

Publicado: Mar, 10 Dic 2013, 00:21
por radastan
$this->bbcode_second_pass_quote('antoniovillena', '
')Por cierto hay instrucciones en el código que no hacen nada, te las marco con asterisco.


NOOOOOOORL!!!!! No me digas eso Antonio, que se me cae un mito. Esas instrucciones son fundamentales. ADC, macho, ADC, suma cero ¡Y EL ACARREO!.

Y si, un sprite puede tener máscara y lo que quieras, pero a la hora de imprimir... es la misma rutina que se emplea en un tile. Lo que les diferencia es el tratamiento, pero a la hora de imprimir son iguales si no hay máscara.

Re: Pintando sprites de 16x16 en ensamblador

Publicado: Mar, 10 Dic 2013, 00:32
por antoniovillena
$this->bbcode_second_pass_quote('radastan', '
')NOOOOOOORL!!!!! No me digas eso Antonio, que se me cae un mito. Esas instrucciones son fundamentales. ADC, macho, ADC, suma cero ¡Y EL ACARREO!.


Vale, te hace una suma muy bonita pero, ¿de qué te sirve calcularla si un poco más abajo machacas el contenido de A?

$this->bbcode_second_pass_quote('radastan', '
')Y si, un sprite puede tener máscara y lo que quieras, pero a la hora de imprimir... es la misma rutina que se emplea en un tile. Lo que les diferencia es el tratamiento, pero a la hora de imprimir son iguales si no hay máscara.


Son iguales si no hay máscara y las coordenadas a pintar son múltiplos del tamaño de un tile. Si el tamaño de un tile es 16x16, se puede dar el caso de que con tu rutina imprimas un sprite en las coordenadas (8, 24), este sprite no sería un tile porque se sale de la rejilla de tiles. Que puedas usar la misma rutina para pintar los tiles y los sprites no significa que sean lo mismo, es sólo algo conceptual.

Re: Pintando sprites de 16x16 en ensamblador

Publicado: Mar, 10 Dic 2013, 08:30
por radastan
$this->bbcode_second_pass_quote('antoniovillena', '')$this->bbcode_second_pass_quote('radastan', '
')NOOOOOOORL!!!!! No me digas eso Antonio, que se me cae un mito. Esas instrucciones son fundamentales. ADC, macho, ADC, suma cero ¡Y EL ACARREO!.


Vale, te hace una suma muy bonita pero, ¿de qué te sirve calcularla si un poco más abajo machacas el contenido de A?


Porque acabas de encontrar un bug, debería de volcar A en D antes del push. Es que si no en determinados casos si sumo 32 a DE el resultado no es correcto.

Aunque claro, eso sólo pasa si da la casualidad que se imprime una fila del sprite entre dos tercios de la pantalla, cosa que en baja resolución no va a pasar nunca, por lo que efectivamente se podría quitar esa parte del código y hacer aún más rápida la rutina.

Donde si tengo que tener cuidado es en la parte de atributos, porque es lineal del tirón, pero en la parte de pixels puedo prescindir de D en la suma de 32.

Re: Pintando sprites de 16x16 en ensamblador

Publicado: Mar, 10 Dic 2013, 09:09
por na_th_an
$this->bbcode_second_pass_quote('radastan', 'E')s que realmente un sprite y un tile no tienen distinción. La diferencia de un sprite es que se mueve, pero la rutina de impresión es la misma, lo único que cambia es que se añaden dos rutinas más para recoger y reponer el fondo (en caso de haber uno y que se quiera mantener).

Pero si, tomo nota del de 16x24 y también uno de 24x32.

A ver si animo a la gente a poner personajes grandes y a color en pantalla.

EDITADO: Ala, ya están metidas las dos. :jias:


Genial :D

En nuestro viejo motor, sí había distinción entre tiles y sprites. En los sprites había dos cosas que podían o no tomarse en cuenta: una era que los caracteres a "0" no se imprimían, viéndose el fondo en vez del caracter correspondiente. Así, si el sprite tenía caracteres completamente vacíos, se disimulaba un poco el marco negro. Otra era que el paper del fondo podía prevalecer sobre el paper del sprite, o que el sprite sólo definiese "INK" y simplemente tomase el "PAPER" que hubiese en el fondo, lo que a veces también ayudaba a enmascarar la falta de máscara, por decirlo de algún modo. Esto lo usamos en fourspriter, por ejemplo.

Aparte de eso, el sprite necesita un método para restaurar el fondo. Con un sencillo buffer donde almacenarlo basta.

Por eso cuando hemos hecho cosas así (la subacolib, por ejemplo) hemos automatizado todo el manejo de sprites. El usuario sólo se tiene que encargar de poner sus valores en una estructura de sprites (como en las máquinas con sprites HW) y es el motor quien se encarga de todo (restaurar fondo, tomar nuevo fondo, pintar sprite) en el momento justo para que no haya parpadeos (en el caso de Subaco, los juegos se fijan a 25fps, se espera hasta el borde inferior, y se trabaja en el tiempo en el que la ULA está pintando ambos bordes).

Re: Pintando sprites de 16x16 en ensamblador

Publicado: Mar, 10 Dic 2013, 09:30
por radastan
Es que mi idea es muy sencilla: un par de funciones para recoger y restaurar el fondo. Es decir, algo en plan:

get_background_x16 (x,y,puntero);
put_background_x16 (x,y,puntero);

Sólo tienes que definir un espacio de memoria para cada sprite que quieras mover, donde se almacenará el fondo, y usar esas dos funciones entre la que imprime el sprite. Tendré que hacer subversiones para cada tamaño, al igual que las rutinas de sprites, pero es que la librería va a ocupar una "mierda" en tamaño gracias a que es en ensamblador y no hay dependencias.

Evidentemente para un curso de Z88DK no voy a hacer vilguerías de detectar caracteres en negro, transparencia de color de fondo, etc. Se trata de dar unas cuantas rutinas para que hacer juegos sea una pollada, a las malas que otro coja el relevo y mejore mi librería o se cree la suya propia. Lo que yo quiero es enseñar a manejarse con el Z88DK y que puedan salir juegos diferentes a los de la churrera (este motor si permite un juego como Out Run, por ejemplo).

La gran pega es la sincronización, porque no la hay a la hora de pintar, pero siempre puedo enseñar en el curso que cosas deben hacerse para evitar ese mal de la mejor forma posible (o por lo menos minimizarlo).

Re: Pintando sprites de 16x16 en ensamblador

Publicado: Mar, 10 Dic 2013, 09:58
por radastan
Bueno, ya he re-optimizado las rutinas, ahora van otro pelín más rápidas (esto va sobrado).

Voy a realizar un test a ver que pasa en movimiento.