[CODE] funcion de pintado (fill)

Started by SplinterGU, January 26, 2010, 05:32:48 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

SplinterGU


/* 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

Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Prg

en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)

Windgate

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...
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

SplinterGU

jajaja... y como dedujiste eso? lo probaste?
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Windgate

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.
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

SplinterGU

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.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

osk

¿Y por qué no meterlo como código C nativo en un módulo?

SplinterGU

mas que por que no, yo me pregunto por que si?
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Windgate

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
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

SplinterGU

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.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

josebita

Gracias, Splinter. ¿La subes tú al wiki o la subo yo? :).

SplinterGU

nunca he usado la wiki... puedes hacerlo tu...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2