Kit Z88DK Radastan para ZXUno - 0.3c

Software para o relacionado con el core ZX Spectrum / Software for or related to the ZX Spectrum core
Avatar de Usuario
Hark0
Mensajes: 683
Registrado: 27 Sep 2015, 00:31
Ubicación: Cornellà de Llobregat - BCN
Contactar:

Re: Kit Z88DK Radastan para ZXUno - 0.3c

Mensaje por Hark0 » 16 Nov 2016, 13:46

Radastan escribió:Agradezco las optimizaciones y las mejoras, a ver si puedo centrarme en mejorar las rutinas (sobre todo las de sprites transparentes) y que trabajen con la pantalla principal o la shadow como una opción más.
:maestro: por favor, que como ya me comentaste van muuuuuuy lentas.


Para el tema de shadow, yo he añadido un parámetro a las rutinas de pintado... y en ese parámetro le paso la dirección del buffer que quiero pintar :mrgreen:
http://www.zxuno.com
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA.

Avatar de Usuario
Radastan
Mensajes: 389
Registrado: 05 Oct 2015, 14:39

Re: Kit Z88DK Radastan para ZXUno - 0.3c

Mensaje por Radastan » 17 Nov 2016, 22:38

Pues pasa tu librería modificada, copón.

Avatar de Usuario
Hark0
Mensajes: 683
Registrado: 27 Sep 2015, 00:31
Ubicación: Cornellà de Llobregat - BCN
Contactar:

Re: Kit Z88DK Radastan para ZXUno - 0.3c

Mensaje por Hark0 » 18 Nov 2016, 08:04

Es la idea, dejame que la limpie un poco... que ahora mismo tengo bastante basura en el source.

Mi idea es hacer un juego simple en modo radastaniano y adjuntar el source y las librerías.

;)
http://www.zxuno.com
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA.

jsmolina
Mensajes: 1
Registrado: 02 Sep 2018, 08:56

Re: Kit Z88DK Radastan para ZXUno - 0.3c

Mensaje por jsmolina » 02 Sep 2018, 10:24

Hola radastan,

gracias por el curro que te pegaste con el curso, me animé a hacer un juego, y empecé con esto:
https://github.com/jsmolina/speccy-misifu
http://zx-dev-mia-remakes.proboards.com ... cat-demake

El tema es que no había pensado lo difícil que se me iba a hacer el tema del redibujado los fondos, así que ahora mismo tengo dos opciones:

1) intentar adaptar tu función put_msprite_x10 al tamaño de 'misifu' (32x16). Por ahora sin mucho éxito. Quizá haya que exportar de alguna forma especial con SevenUP? (;Sort Priorities:Interleave, Mask, ...)

2) Intentar usar SP1, pero parece un poco infernal tener que dividir cada sprite en columnas de 8, y me está saliendo un churro patatero.
Imagen

VS
Imagen


Me está matando un poco que no hay una documentación clara para el tema de sprites, y claro son horas de try and error. :teclando..:

Qué me recomiendas?

Avatar de Usuario
Radastan
Mensajes: 389
Registrado: 05 Oct 2015, 14:39

Re: Kit Z88DK Radastan para ZXUno - 0.3c

Mensaje por Radastan » 03 Sep 2018, 15:30

¿Y porqué no usas put_sprite_32x16? Pero en tu caso lo mismo te viene mejor dos de 16x16, porque así es más sencillo hacer:

put_partial1h_sprite_x16
put_partial2h_sprite_x16
put_partial1v_sprite_x16
put_partial2v_sprite_x16


Con eso restauras el fondo al mover, sólo tienes que hacer un tileset de 16x16 para los fondos.


Por ejemplo, este es el código que uso en Mag the Magician para mover al personaje, que es de 16x16, sin que borre el fondo.

Código: Seleccionar todo

signed int borra_prota()
{
	signed int r1,r2,r3,r4;
	unsigned char xx,yy, mr1, mr2, mr3, mr4;
	xx=x&1;
	yy=y&1;
	r1=sala2+((x-6)/2)+(((y-4)/2)*10);
	r2=sala2+((x-6)/2)+1+(((y-4)/2)*10);
	r3=sala2+((x-6)/2)+((((y-4)/2)+1)*10);
	r4=sala2+((x-6)/2)+1+((((y-4)/2)+1)*10);
	mr1=mapa[r1];
	mr2=mapa[r2];
	mr3=mapa[r3];
	mr4=mapa[r4];
	if (xx)
	{
		if (yy)
		{
			if (mr1<48) put_sprite_x16(tiles+(mr1*36),x-1,y-1);
			else put_sprite_x16(tiles,x-1,y-1);
			if (mr2<48) put_sprite_x16(tiles+(mr2*36),x+1,y-1);	
			else put_sprite_x16(tiles,x+1,y-1);
			if (mr3<48) put_sprite_x16(tiles+(mr3*36),x-1,y+1);
			else put_sprite_x16(tiles,x-1,y+1);
			if (mr4<48) put_sprite_x16(tiles+(mr4*36),x+1,y+1);
			else put_sprite_x16(tiles,x+1,y+1);
		}
		else
		{
			if (mr1<48) put_sprite_x16(tiles+(mr1*36),x-1,y);
			else put_sprite_x16(tiles,x-1,y);
			if (mr2<48) put_sprite_x16(tiles+(mr2*36),x+1,y);	
			else put_sprite_x16(tiles,x+1,y);
		}		
	}
	else
	{
		if (yy)
		{
			if (mr1<48) put_sprite_x16(tiles+(mr1*36),x,y-1);
			else put_sprite_x16(tiles,x,y-1);
			if (mr3<48) put_sprite_x16(tiles+(mr3*36),x,y+1);
			else put_sprite_x16(tiles,x,y+1);
		}
		else
		{
			if (mr1<48) put_sprite_x16(tiles+(mr1*36),x,y);
			else put_sprite_x16(tiles,x,y);		
		}		
	}
}

signed int mueve_prota ()
{
	unsigned char z,mx,my;
	z=0;
	mx=x;
	my=y;
		if (((port_in(64510)&1)==0 || (port_in(63486)&8)==0) && y>0 && pantalla[x+((y-1)*32)]<7 && pantalla[x+1+((y-1)*32)]<7) // Q
		{
			z=1;
			--my;
			arriba_o_abajo=1;
		}
		if (((port_in(65022)&1)==0 || (port_in(63486)&4)==0) && y<22 && pantalla[x+((y+2)*32)]<7 && pantalla[x+1+((y+2)*32)]<7) // A
		{
			z=1;
			++my;
			arriba_o_abajo=0;
		}
		if (((port_in(57342)&1)==0 || (port_in(63486)&2)==0) && x<30 && pantalla[x+2+(my*32)]<7 && pantalla[x+2+((my+1)*32)]<7 && my>3 && my<19) // P
		{
			z=1;
			++mx;
			izquierda=0;
		}
		if (((port_in(57342)&2)==0 || (port_in(63486)&1)==0) && x>0 && pantalla[x-1+(my*32)]<7 && pantalla[x-1+((my+1)*32)]<7 && my>3 && my<19) // O
		{
			z=1;
			--mx;
			izquierda=1;
		}
		// Cambiamos de pantalla si corresponde
		if (mx==25) // Derecha
		{
			x=6;
			mx=6;
			++sala;
			dibuja_mapa(sala,6,4,20,80); // sala,x,y,ancho caracteres,tiles por sala
			ux=x;
			uy=my;
		}
		if (mx==5) // Izquierda
		{
			x=24;
			mx=24;
			--sala;
			dibuja_mapa(sala,6,4,20,80); // sala,x,y,ancho caracteres,tiles por sala
			ux=x;
			uy=my;
		}
		if (my==3) // Arriba
		{
			y=18;
			my=18;
			sala=sala-7;
			dibuja_mapa(sala,6,4,20,80); // sala,x,y,ancho caracteres,tiles por sala
			ux=mx;
			uy=y;
		}
		if (my==19) // Abajo
		{
			y=4;
			my=4;
			sala=sala+7;
			dibuja_mapa(sala,6,4,20,80); // sala,x,y,ancho caracteres,tiles por sala
			ux=mx;
			uy=y;
		}
		// Imprimimos el personaje
		wait_int(); // Así evitamos parpadeo al mover
		if (z)
		{
			borra_prota();
			x=mx;
			y=my;
			if (frame==0)
			{
				dibuja_prota();
				frame=1;
				sonido_andar1();
			}
			else
			{
				if (izquierda==0) put_sprite_x16 (sprite_prota_derecha2, x, y);
				else put_sprite_x16 (sprite_prota_izquierda2, x, y);
				frame=0;
				sonido_andar2();
			}
			z=0;
		}
}

Tiles es el puntero al tileset de 16x16.
Mapa ya sabes lo que es, contiene una matriz con todo el mapa según el tileset empleado.

Responder