Anterior | Índice | Siguiente
Capítulo 6: Simple efecto de FadeIn y FadeOut
Lenguaje: C#
Para: VS2003 / VS2005 / VS2008
Por Dark-N: hernaldog@gmail.com
Visita mi Blog


http://darknromhacking.com


Objetivo: hacer un sencillo efecto de aparición y desaparición de una figura usando la propiedad Alpha.

Lo primero es descargar estas 2 imagenes:



Estas imágenes las debes dejar en el directorio bin/Debug una vez compilado el proyecto.

Lo que haremos será cargar 2 imágenes, una que quedará fija (el triangulo) y otra que irá apareciendo de a poco y luego desaparecerá (cuadrado) en un ciclo.
Para manejar transparencias en SDL.Net está la propiedad Alpha que indica el grado de opacidad de una superficie (Surface). Este grado puede variar entre 0 (no se ve) y 255 (se ve complemente). Esto será muy útiles para hacer efectos mas delicados al monento de hacer desaparecer objetos de la pantalla.
Es recomendable usar imagenes PNG en vez de BMP o JPG, ya que soportan Canales Alpha y son relativemente más pequeñas.

La forma de usarlo en el código es:

srf_cuadrado = new Surface(@"mi imagen.PNG").Convert(mi superficie, true, false);
srf_cuadrado.Alpha = 0;
srf_cuadrado.AlphaBlending = true;
srf_cuadrado.TransparentColor = Color.White;

Vamos línea a línea:
srf_cuadrado = new Surface(@"mi imagen.PNG").Convert(superficie, true, false);
Cargamos una imagen y la convertimos de inmediato en el formato de video que usaremos esto es porque el archivo a cargar puede que no tenga el mismo formato (profundidad de pixels) como el de nuestra surface. Es más efeciente hacer esta conversión al principio una una vez, que esperar que en cada Blit la haga.

Los otros campos a definir son:
  • Hardware Surace: True - Creamos la nueva superficie en la Memoria de Video de la trajeta de video. Siempre debería en True.
  • Alpha Blending: False - No usaremos Alpha Blending en la superficie (por ahora).

    srf_cuadrado.Alpha = 0;
    0 = invisible, 255=totalmente visible

    srf_cuadrado.AlphaBlending = true;
    fuera de indicarle el valor de Alpha, debemos decirle al SDL explítamente que queremos usar Alpha en la superficie, para esto se deja este campo en true.

    srf_cuadrado.TransparentColor = Color.White;
    Le decimos que queremos dejar la superfice con el cuadrado azul, transparente el color blanco, esto es porque queremos poner una imagen sobre otra. En este caso el triangulo paracerá atrás del cuadrado. Una alternativa a Color.White es usar Color.FromArgb( 255, 255, 255 ).

    Creo que esto es lo único a destacar por ahora. Lo otro es conocido por uds.


    Código fuente de este capítulo (VS2003 + SDL.NET 4.0):

    /*
      Ejemplo usando SDL.NET 4.0 y VS 2003 con C#
      Muestra una figura que se aparece con el efecto "fade-in" y "fade-out"
      Esto se logra usando la propiedad Alpha de una Surface cargado con una imagen .PNG
      
      Alpha: es el grado de opacidad o transaparencia de una objeto, 0: no se 
      ve el objeto y 255: se ve completamente
      La propiedad Alpha está definida en bytes por lo que se puede escribir en 
      bytes (rango 0x00 a 0xFF) o en enteros (rango 0 a 255)
        
      Autor: Dark-N
      Fecha: 13-05-2009
    */
    
    using System;
    using SdlDotNet;
    using SdlDotNet.Sprites;
    using System.Drawing;
    
    namespace FadeInOut
    {
    
        public class FadeInOut
        {
            private static Surface srf_videoScreen;
            private static Surface srf_cuadrado, srf_triangulo;    
            private static int estadoBrillo = 0;
    
            private enum enumVisibilidad : int
            {
                MasVisible = 1,
                MenosVisible = 2
            }
    
            public static void Main()
            {
                srf_videoScreen = Video.SetVideoModeWindow(220, 200, 32);
                Video.WindowCaption = "Fade In y Fade Out";            
                Events.Fps = 25;
    
                CargaInicial();
    
                Events.Quit += new QuitEventHandler(Evento_Salir);
                Events.Tick += new TickEventHandler(Evento_Tick);
                Events.KeyboardDown +=new KeyboardEventHandler(TecladoManejador);
                Events.KeyboardUp +=new KeyboardEventHandler(TecladoManejador);    
                Events.Run();
            }
    
            static void CargaInicial()
            {
                srf_cuadrado = new Surface( @"Cuadrado.PNG").Convert(srf_videoScreen, true, false);
                srf_cuadrado.Alpha = 0; //0-invisible, 255-completamente visible
                srf_cuadrado.AlphaBlending = true;
                srf_cuadrado.TransparentColor = Color.White;
    
                srf_triangulo = new Surface( @"Triangulo.PNG").Convert(srf_videoScreen, true, false);
                srf_triangulo.TransparentColor = Color.White;
    
                estadoBrillo = (int) enumVisibilidad.MasVisible;
            }
    
            private static void Evento_Salir(object sender, SdlDotNet.QuitEventArgs e)
            {
                Events.QuitApplication();
            }
    
    
            private static void TecladoManejador( object sender, KeyboardEventArgs args )
            {
                if (args.Key == Key.Escape)
                    Events.QuitApplication();
            }
    
            private static void Evento_Tick( object sender, TickEventArgs args )
            {        
                srf_videoScreen.Fill(Color.White);
    
                if (srf_cuadrado.Alpha <= 0)
                    estadoBrillo = (int) enumVisibilidad.MasVisible;
    
                if (srf_cuadrado.Alpha >= 255)
                    estadoBrillo = (int) enumVisibilidad.MenosVisible;
     
                if (estadoBrillo == (int) enumVisibilidad.MasVisible)
                    srf_cuadrado.Alpha += 0x05;
                else
                    srf_cuadrado.Alpha -= 0x05;            
    
                srf_videoScreen.Blit(srf_cuadrado, new Point( 0, 0 ));
                srf_videoScreen.Blit(srf_triangulo, new Point( 20, 20 )); //el triangulo se ve por encima del cuadrado
                srf_videoScreen.Update();
            }
        }
    }
    




    Código fuente para VS 2005/2008. Antes recuerda:
  • Agregar las referencias: SDL.Net 6.0 y System.Drawing.
  • En las propiedades del Proyecto, en Output Type dejarlo como Windows Application
  • Copiar las imagenes que coloqué arriba en la carpeta bin/Debug del proyecto.

    Código fuente VS 2008 + SDL.NET 6.0:

    //Archivo: HolaMundo.cs
    //Autor: Dark-N
    //fecha: 25-05-2009
    
    using System;
    using System.Collections.Generic; //para eventos y otras cosas
    using System.Drawing; //colores
    
    using SdlDotNet.Graphics; //para sprites y surfaces
    using SdlDotNet.Core; //Eventos
    using SdlDotNet.Input; //keyborad
    
    namespace FadeInOut
    {
        public class Figura
        {
            private static Surface srf_videoScreen;
            private static Surface srf_cuadrado, srf_triangulo;    
            private static int estadoBrillo = 0;
    
            private enum enumVisibilidad : int
            {
                MasVisible = 1,
                MenosVisible = 2
            }
    
            public static void Main()
            {
                srf_videoScreen = Video.SetVideoMode(220, 200, false, false, false, true);
                Video.WindowCaption = "Fade In y Fade Out";
                SdlDotNet.Core.Events.Fps = 25; //25 veces se llamará el tick por segundo
                
                CargaInicial();
    	    
                SdlDotNet.Core.Events.KeyboardDown += new EventHandler < KeyboardEventArgs >(Evento_Teclado);
                SdlDotNet.Core.Events.Tick += new EventHandler < TickEventArgs >(Evento_Tick);
                SdlDotNet.Core.Events.Quit += new EventHandler < QuitEventArgs >(Evento_Salir);
                Events.Run();
            }
            
            static void CargaInicial()
            {
                srf_cuadrado = new Surface(@"Cuadrado.PNG").Convert(srf_videoScreen, true, false);
                srf_cuadrado.Alpha = 0; //0-invisible, 255-completamente visible
                srf_cuadrado.AlphaBlending = true;
                srf_cuadrado.TransparentColor = Color.White;
    
                srf_triangulo = new Surface(@"Triangulo.PNG").Convert(srf_videoScreen, true, false);
                srf_triangulo.Transparent = true;
                srf_triangulo.TransparentColor = Color.White;            
               
                estadoBrillo = (int)enumVisibilidad.MasVisible;
            }
    
            private static void Evento_Salir(object sender, QuitEventArgs e)
            {
                Events.QuitApplication();
            }
    
            private static void Evento_Teclado(object sender, KeyboardEventArgs e)
            {
                if (e.Key == Key.Escape)
                    Events.QuitApplication(); 
            }
    
            private static void Evento_Tick(object sender, TickEventArgs args)
            {
                srf_videoScreen.Fill(Color.White);
    
                if (srf_cuadrado.Alpha <= 0)
                    estadoBrillo = (int)enumVisibilidad.MasVisible;
    
                if (srf_cuadrado.Alpha >= 255)
                    estadoBrillo = (int)enumVisibilidad.MenosVisible;
    
                if (estadoBrillo == (int)enumVisibilidad.MasVisible)
                    srf_cuadrado.Alpha += 0x05;
                else
                    srf_cuadrado.Alpha -= 0x05;
    
                srf_videoScreen.Blit(srf_cuadrado, new Point(0, 0));            
                srf_videoScreen.Blit(srf_triangulo, new Point(20, 20)); //el triangulo se ve por encima del cuadrado
                srf_videoScreen.Update();
            }
        }
    }
    

    Una vez codificado, tanto en VS2003 o VS2005/2008, si al compilar no arroja errores, debe aparecerte algo como esto:



    Bajar proyecto para VS 2003 desde aquí.

    Bajar proyecto para VS 2008 desde aquí.


    Anterior | Índice | Siguiente
    Volver a Página Principal

    blog comments powered by Disqus
    2003 - 2018    La Web de Dark-N