¿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.