/* by SplinterGU */
import "mod_draw";
import "mod_mouse";
import "mod_key";
import "mod_rand";
import "mod_video";
import "mod_map";
import "mod_proc";
private
grafico_base;
grafico_bujero;
const
bpp=16;
cols=320;
rows=240;
private
i;
lastx=-1;
lasty=-1;
currx=-1;
curry=-1;
begin
graph_mode=bpp;
scale_mode=scale_hq2x;
set_mode(cols,rows,16);
grafico_base=new_map(2,2,bpp);
drawing_map(0,0);
drawing_alpha(255);
drawing_stipple(0ffffffffh);
for(i=0;i<10;i++)
drawing_color(rgb(rand(1,255),rand(1,255),rand(1,255)));
draw_line(rand(0,cols),rand(0,rows),rand(0,cols),rand(0,rows));
end
for(i=0;i<10;i++)
drawing_color(rgb(rand(1,255),rand(1,255),rand(1,255)));
draw_circle(rand(0,cols),rand(0,rows),rand(0,rows));
end
drawing_color(rgb(96,96,96));
drawing_map(0,grafico_base);
draw_box(0,0,2,2);
mouse.graph=grafico_base;
repeat
currx=mouse.x;
curry=mouse.y;
if ( mouse.left )
if (!exists(type rellenar))
rellenar(0,mouse.x,mouse.y,rgb(255,0,0),255);
end
end
if ( mouse.right )
if (!exists(type rellenar))
rellenar(0,mouse.x,mouse.y,rgb(0,0,0),255);
end
end
frame;
until(key(_esc))
end
//--------------------------------------------------------------//
//Funcion rellenar
FUNCTION rellenar(INT mapa,xa,ya,ColorA,INT alfa);
PRIVATE
INT ColorAnt;
int lx, rx;
int flx, frx;
int fup, fdn;
int gwide, gheight;
int i;
BEGIN
ColorAnt = map_get_pixel(0,mapa,xa,ya);
IF (ColorAnt==ColorA) RETURN 0; END
gwide = graphic_info(0,mapa,g_wide);
gheight = graphic_info(0,mapa,g_height);
lx = xa;
rx = xa;
flx = false;
frx = false;
fup = false;
fdn = false;
map_put_pixel(0,mapa, xa, ya, ColorA);
while(flx == false || frx == false)
if ( flx == false )
if ( lx > 0 && map_get_pixel(0, mapa, lx-1, ya) == ColorAnt )
lx--;
map_put_pixel(0,mapa, lx, ya, ColorA);
else
flx = true;
end
end
if ( frx == false )
if ( rx < gwide && map_get_pixel(0, mapa, rx+1, ya) == ColorAnt )
rx++;
map_put_pixel(0,mapa, rx, ya, ColorA);
else
frx = true;
end
end
end
for (i=lx;i<=rx;i++)
if ( map_get_pixel(0, mapa, i, ya-1) == ColorAnt )
if (fup == false)
fup = true;
rellenar(mapa,i,ya-1,ColorA,alfa);
end
else
fup = false;
end
if ( map_get_pixel(0, mapa, i, ya+1) == ColorAnt )
if (fdn == false)
fdn = true;
rellenar(mapa,i,ya+1,ColorA,alfa);
end
else
fdn = false;
end
end
RETURN 0;
END
muchas gracias :)
karma++
Este Splinter nos suelta 100 lineas de código sin tan sólo una palabra "humana" xD
¿Deduzco que es para repintar un color de fondo de un sprite y así por ejemplo dejar como transparente el colorcito de fondo, verdad?
Interesante...
jajaja... y como dedujiste eso? lo probaste?
Lo he probado ahora mismo, todavía no le saco utilidad para mis proyectos pero seguro que alguien sí, parece interesante y muy rápido, thanks.
lo puse para uno de los proyectos del concurso... que tenia una funcion de paint que no iba del todo bien.
esta funcion esta basada en un codigo original que hizo un viejo conocido de la comunidad (que no recuerdo el nick, el autor del IDE Perla Negra, maldita vejez!) y que yo reescribi para corregirla y hacerla funcionar... y la usaba para el editor grafico integrado en el IDE.
¿Y por qué no meterlo como código C nativo en un módulo?
mas que por que no, yo me pregunto por que si?
Es demasiado simple el relleno de sólo un color, pero se me había ocurrido que en un scroll con un cielo de color plano se podría simular un atardecer con el rellenado :D
Aunque puede tener su aplicación yo no lo veo algo imprescindible para un módulo... Antes veo prioritario la entrada de datos por teclado (¿Cuántas veces lo he dicho?) xD
es un proceso consumidor, no sirve para lo que vos queres hacer, mas que nada es para cosas pre-procesada o para hacer algun programa de dibujo basico.
Gracias, Splinter. ¿La subes tú al wiki o la subo yo? :).
nunca he usado la wiki... puedes hacerlo tu...