SlideShare una empresa de Scribd logo
1 de 20
Programación 2

 Unidad 03 – Entorno Visual
Logro 3 – Entorno Visual
    Unidad
Al finalizar la unidad, el alumno utiliza controles
predefinidos por el lenguaje, componentes gráficos,
buffers, imágenes y Sprites, de manera precisa y
eficaz, en el diseño y construcción de Programas
Orientados a Objetos de entorno visual con interfaz
profesional y agradable para el usuario.
Buffer
Parpadeo

   Cuando hacemos una aplicación que tiene
    muchos dibujos o animaciones, es muy
    probable que se muestre un ligero parpadeo
    en los elementos dando la impresión de que
    no el dibujo no es continuo.

   Esto se debe a que el dibujo se está
    mostrando en todas sus etapas de
    construcción en lugar de simplemente
    mostrar el resultado final.
Parpadeo - Explicación
   Imaginemos que queremos mostrar en pantalla
    100 rectángulos en distintas posiciones:

   En el timer colocaríamos el siguiente código:

       Graphics ^g = this->CreateGraphics();
       g->Clear(Color::White);
       for (int i=0; i<100; i++)
       {
         if (i % 2 == 0)
           g->FillRectangle(Brushes::Red, i*2, i*2, 50, 50);
         else
           g->FillRectangle(Brushes::Lime, i*2, i*2, 50, 50);
       }
       delete g;
Parpadeo – Explicación

   El código mostrado mostraría los 100 rectángulos,
    sin embargo no se mostrarían de una forma limpia
    sino que aparecería un pequeño parpadeo.

   Este parpadeo se debe a que cada vez que se llama
    al método FillRectangle, no solo se está pintando el
    rectángulo sino que se está mostrando en pantalla,
    por lo que se nos presentan 100 imágenes distintas
    en un periodo muy corto dándonos así un efecto de
    parpadeo.
Parpadeo – Explicación

        En realidad se nos están mostrando todas
         estas imágenes en un tiempo muy corto:
              1       2        3         4         5          6




• Estas son solo las primeras 6 imágenes que se nos muestran antes de que
  obtengamos el resultado con los 100 rectángulos. (Falta mostrar 94
  imágenes).

• Y esto es tan solo la primera pasada. Cuando estamos dentro de un timer
  este procedimiento se repetirá muchas veces. Tenga en cuenta que en la
  segunda pasada del timer, en lugar de solamente mostrarnos 200
  rectángulos nos está mostrando más de 10,000 rectángulos.
Como evitar el parpadeo

   Para evitar el parpadeo, es necesario crear
    un Buffer de canvas. Es decir, un canvas que
    no se muestre en pantalla pero que ofrezca
    la misma funcionalidad.
   Una vez creado este canvas invisible
    podemos dibujar lo que queramos sobre él
    sin temor a que se muestre en pantalla.
   Una vez terminado todo el dibujo podemos
    mostrarlo de forma completa en una sola
    pasada.
El Buffer
                                        Buffer


                    Creamos un buffer
                     del tamaño del
                          original

                                            Dibujamos todo
                                            en el buffer

Pasamos el Buffer con los
100 rectángulos al canvas
  visible del formulario
 haciendo que los 100 se
  muestren 1 sola vez.
Como crear el Buffer
// Creamos los graficos del formulario
Graphics ^g = this->CreateGraphics();

// Guardamos las dimensiones para facil acceso
int gWidth = (int)g->VisibleClipBounds.Width;
int gHeight = (int)g->VisibleClipBounds.Height;

// Reservamos un espacio para poner el Buffer
BufferedGraphicsContext ^espacioBuffer = BufferedGraphicsManager::Current;

// Colocamos el tamaño máximo del Buffer
// el +1 es para evitar errores de memoria.
espacioBuffer->MaximumBuffer = System::Drawing::Size( gWidth + 1, gHeight + 1 );

// Creamos un canvas dentro del espacio del buffer utilizando el canvas
// del formulario
BufferedGraphics ^buffer = espacioBuffer->Allocate( g, Drawing::Rectangle(0, 0, gWidth, gHeight));

// A partir de aquí todo los dibujos se deben realizar en el Canvas del Buffer
// buffer->Graphics
buffer->Graphics->Clear(Color::White);
for (int i=0; i<100; i++)
     buffer->Graphics->FillRectangle((i % 2 == 0) ? Brushes::Red : Brushes::Lime, i*2, i*2, 50, 50);

// Pasamos el buffer terminado al canvas visible
buffer->Render(g);

// Limpiamos la memoria reservada
delete buffer;
delete espacioBuffer;
delete g;
Método Alternativo - Buffer
                                    Imagen
                      Creamos una
                         imagen




                                        Dibujamos todo
                                        en la imagen

  Pintamos la imagen
completa en el canvas del
      formulario
Método Alternativo - Buffer

   Otra forma de evitar el parpadeo es simular el
    uso de un buffer con una imagen.
   Cabe resaltar que este método no es un
    buffer pero para efectos del curso nos
    ofrece la misma funcionalidad.
   Funciona más lento que un buffer pero
    imperceptible para el tipo de programas a
    realizar en el curso.
Método Alternativo - Buffer
//crear un canvas   
Graphics ^canvas = this->CreateGraphics();
//Asegurarse que la ventana no esta minimizada
if(canvas->VisibleClipBounds.Width>0 && canvas->VisibleClipBounds.Height >0)
{
              // crear una imagen
              Bitmap ^imagen = gcnew Bitmap (canvas->VisibleClipBounds.Width,canvas->VisibleClipBounds.Height);
              //crear un canvas para pintar en la imagen
              Graphics ^CanvasImagen = Graphics::FromImage(imagen);

            // todo se pinta ahora en el canvas de la imagen 
            CanvasImagen->Clear(Color::Black);
            for ( int i =0; i <100;i++)
                              CanvasImagen->FillRectangle((i % 2 == 0) ? Brushes::Red : Brushes::Lime, i*2, i*2, 50, 50);

            // este seria el "render" pintar la imagen en pantalla
            canvas->DrawImage(imagen,0,0);
            delete CanvasImagen;
            delete imagen;
}
delete canvas;
Sprites
Sprites

   Un sprite, es una imagen que está
    dividida en secciones formando una
    secuencia de movimiento.
   Si pasamos rapidamente por cada una
    de las secciones del sprite podemos
    ver que se genera una animación.
Sprites - Dimensiones

           Un sprite tiene las siguientes dimensiones:
Indice Imagen:     0          1            2         3


                                                            Alto del Sprite



                  Ancho     Ancho        Ancho      Ancho
                 imagen    imagen       imagen     imagen
                             Ancho del Sprite

  Ancho Imagen = Ancho del Sprite / # imagenes
  Imagen X1 = Ancho Imagen * Indice Imagen
  Imagen X2 = Ancho Imagen * (Indice Imagen + 1)
Sprites – Método de dibujo

   Debemos tener una variable que almacene el
    índice de la imagen a mostrar.

   El índice deberá ir avanzando en cada
    iteración del timer en 1 de forma cíclica: 0, 1,
    2, 3, 0, 1, 2, 3 …

   En cada iteración del timer se deberá mostrar
    la imagen de acuerdo al índice.
Ejemplo del evento Timer Tick

   Para este caso asumiremos que en nuestro formulario se ha declarado
    una variable int indice; y se ha inicializado con 0.
// El pictureBox contiene al Sprite y está en SizeMode = AutoSize
int anchoImagen = pictureBox1->Width / 4;
int altoImagen = pictureBox1->Height;

buffer->Graphics->Clear(Color::White);

// Declaramos un rectangulo con las dimensiones del pedazo del sprite a utilizar
Drawing::Rectangle porcionAUsar = Drawing::Rectangle(anchoImagen * indice,
                                                      0,
                                                      anchoImagen,
                                                      altoImagen);
// Dibujamos la imagen en la posicion 50, 50
buffer->Graphics->DrawImage(pictureBox1->Image, 50, 50, porcionAUsar, GraphicsUnit::Pixel);

// Aumentamos el indice
indice++;
if (indice >= 4)
    indice = 0;
Transparencia

   El único problema con este método es que
    pinta el fondo blanco de la imagen.

   Para eliminar este fondo necesitamos crear
    una imagen que tenga como fondo un color
    que no esté presente en la imagen:
Ejemplo del evento Timer Tick
           con transparencia
// El pictureBox contiene al Sprite y está en SizeMode = AutoSize
int anchoImagen = pictureBox1->Width / 4;
int altoImagen = pictureBox1->Height;
buffer->Graphics->Clear(Color::White);

// Creamos una imagen de tipo bitmap para generar la transparencia
Bitmap^ imgTransparente = gcnew Bitmap( pictureBox1->Image );

// Le aplicamos transparencia tomando como referencia el pixel de la
// esquina superior izquierda
imgTransparente->MakeTransparent( imgTransparente->GetPixel( 1, 1 ) );

// Declaramos un rectangulo con las dimensiones del pedazo del sprite a utilizar
Drawing::Rectangle porcionAUsar = Drawing::Rectangle(anchoImagen * indice,
                                                           0,
                                                           anchoImagen,
                                                           altoImagen);

// Dibujamos la imagen en la posicion 50, 50
buffer->Graphics->DrawImage(imgTransparente, 50, 50, porcionAUsar, GraphicsUnit::Pixel);

// Aumentamos el indice
indice++;
if (indice >= 4)
    indice = 0;

// Limpiamos la memoria
delete imgTransparente;

Más contenido relacionado

La actualidad más candente

Tutorial 1 3 d max vray -abr2013
Tutorial 1 3 d max   vray -abr2013Tutorial 1 3 d max   vray -abr2013
Tutorial 1 3 d max vray -abr2013Guillermo De Leon
 
Programación de Videojuegos con Python y Pilas (X)
Programación de Videojuegos con Python y Pilas (X)Programación de Videojuegos con Python y Pilas (X)
Programación de Videojuegos con Python y Pilas (X)Fernando Salamero
 
Manual Básico de flash 8
Manual Básico de flash 8Manual Básico de flash 8
Manual Básico de flash 8liizethAzuara
 
17528334 manual-vray-espanol-completo
17528334 manual-vray-espanol-completo17528334 manual-vray-espanol-completo
17528334 manual-vray-espanol-completoOscar Monterrosa
 
Elementos de la interfaz de flash
Elementos de la interfaz de flashElementos de la interfaz de flash
Elementos de la interfaz de flashAlma G. N.
 
Animación y transición en PowePoint
Animación y transición en PowePointAnimación y transición en PowePoint
Animación y transición en PowePointJulian Andres Delgado
 
Perspectiva Digital
Perspectiva DigitalPerspectiva Digital
Perspectiva DigitalDimas Franco
 
Vray manual para interiores
Vray manual para interioresVray manual para interiores
Vray manual para interioresAdrian M.
 
Vray 2.4 Guia Descriptiva
Vray 2.4 Guia DescriptivaVray 2.4 Guia Descriptiva
Vray 2.4 Guia DescriptivaDimas Franco
 
Keyframe softwares de animacion 2 d y 3d
Keyframe softwares de animacion 2 d y 3dKeyframe softwares de animacion 2 d y 3d
Keyframe softwares de animacion 2 d y 3dDoménika Domenech
 
Programación de Videojuegos con Python y Pilas (V)
Programación de Videojuegos con Python y Pilas (V)Programación de Videojuegos con Python y Pilas (V)
Programación de Videojuegos con Python y Pilas (V)Fernando Salamero
 
Comandos y tema de 3 dmax y vray curso arqmodel
Comandos y tema de 3 dmax y vray curso arqmodelComandos y tema de 3 dmax y vray curso arqmodel
Comandos y tema de 3 dmax y vray curso arqmodelLizbeth Molina
 

La actualidad más candente (20)

Tutorial 1 3 d max vray -abr2013
Tutorial 1 3 d max   vray -abr2013Tutorial 1 3 d max   vray -abr2013
Tutorial 1 3 d max vray -abr2013
 
Programación de Videojuegos con Python y Pilas (X)
Programación de Videojuegos con Python y Pilas (X)Programación de Videojuegos con Python y Pilas (X)
Programación de Videojuegos con Python y Pilas (X)
 
Manual Básico de flash 8
Manual Básico de flash 8Manual Básico de flash 8
Manual Básico de flash 8
 
Entorno visual p1
Entorno visual p1Entorno visual p1
Entorno visual p1
 
Manual de-flash-cs6
Manual de-flash-cs6Manual de-flash-cs6
Manual de-flash-cs6
 
Introduccion Flash
 Introduccion Flash Introduccion Flash
Introduccion Flash
 
Vray14520
Vray14520Vray14520
Vray14520
 
17528334 manual-vray-espanol-completo
17528334 manual-vray-espanol-completo17528334 manual-vray-espanol-completo
17528334 manual-vray-espanol-completo
 
Elementos de la interfaz de flash
Elementos de la interfaz de flashElementos de la interfaz de flash
Elementos de la interfaz de flash
 
12 Gimp. Taller Practico
12 Gimp. Taller Practico12 Gimp. Taller Practico
12 Gimp. Taller Practico
 
Animación y transición en PowePoint
Animación y transición en PowePointAnimación y transición en PowePoint
Animación y transición en PowePoint
 
Perspectiva Digital
Perspectiva DigitalPerspectiva Digital
Perspectiva Digital
 
Vray manual para interiores
Vray manual para interioresVray manual para interiores
Vray manual para interiores
 
Vray 2.4 Guia Descriptiva
Vray 2.4 Guia DescriptivaVray 2.4 Guia Descriptiva
Vray 2.4 Guia Descriptiva
 
Gimp cuadernillo
Gimp cuadernilloGimp cuadernillo
Gimp cuadernillo
 
Gimp cuadernillo
Gimp cuadernilloGimp cuadernillo
Gimp cuadernillo
 
Gimp cuadernillo
Gimp cuadernilloGimp cuadernillo
Gimp cuadernillo
 
Keyframe softwares de animacion 2 d y 3d
Keyframe softwares de animacion 2 d y 3dKeyframe softwares de animacion 2 d y 3d
Keyframe softwares de animacion 2 d y 3d
 
Programación de Videojuegos con Python y Pilas (V)
Programación de Videojuegos con Python y Pilas (V)Programación de Videojuegos con Python y Pilas (V)
Programación de Videojuegos con Python y Pilas (V)
 
Comandos y tema de 3 dmax y vray curso arqmodel
Comandos y tema de 3 dmax y vray curso arqmodelComandos y tema de 3 dmax y vray curso arqmodel
Comandos y tema de 3 dmax y vray curso arqmodel
 

Destacado

La cançó del lladre
La cançó del lladreLa cançó del lladre
La cançó del lladreCarlesFerrer
 
Precisa De Um Pintor
Precisa De Um PintorPrecisa De Um Pintor
Precisa De Um PintorDiana Vladova
 
Atividades realizadas na Oficina de Excel
Atividades realizadas na Oficina de ExcelAtividades realizadas na Oficina de Excel
Atividades realizadas na Oficina de Excelsilsiane
 
Interior do computador
Interior do computadorInterior do computador
Interior do computadorguest2787392
 
Vamos Ser Realizadores De...
Vamos Ser Realizadores De...Vamos Ser Realizadores De...
Vamos Ser Realizadores De...OI Tavares
 
Plan de aula estadistica grado noveno p1 iecc 2015 v001 christian marin
Plan de aula estadistica grado noveno p1  iecc 2015 v001 christian marinPlan de aula estadistica grado noveno p1  iecc 2015 v001 christian marin
Plan de aula estadistica grado noveno p1 iecc 2015 v001 christian marinchristianmarin42
 
Paisajes Provincia Huelva
Paisajes Provincia HuelvaPaisajes Provincia Huelva
Paisajes Provincia HuelvaERFontenla
 
Como pueden los que no podian
Como pueden los que no podianComo pueden los que no podian
Como pueden los que no podianPaulina Rendon
 
Projecte d'ensenyament de la llengua d'acollida
Projecte d'ensenyament de la llengua d'acollidaProjecte d'ensenyament de la llengua d'acollida
Projecte d'ensenyament de la llengua d'acollidasocietatdigital
 
Sandpapir Nr. 37 1957
Sandpapir Nr. 37 1957Sandpapir Nr. 37 1957
Sandpapir Nr. 37 1957ispirix
 
Art journal presentacion
Art journal presentacionArt journal presentacion
Art journal presentacionnuriafasol
 
Juegos educativos exposición
Juegos educativos exposiciónJuegos educativos exposición
Juegos educativos exposiciónItzel Valdes
 
Simplicidade nos Testes de Usabilidade
Simplicidade nos Testes de UsabilidadeSimplicidade nos Testes de Usabilidade
Simplicidade nos Testes de UsabilidadeErika
 

Destacado (20)

La cançó del lladre
La cançó del lladreLa cançó del lladre
La cançó del lladre
 
UNIMINUTO
UNIMINUTOUNIMINUTO
UNIMINUTO
 
Precisa De Um Pintor
Precisa De Um PintorPrecisa De Um Pintor
Precisa De Um Pintor
 
Slides
SlidesSlides
Slides
 
Atividades realizadas na Oficina de Excel
Atividades realizadas na Oficina de ExcelAtividades realizadas na Oficina de Excel
Atividades realizadas na Oficina de Excel
 
Interior do computador
Interior do computadorInterior do computador
Interior do computador
 
Vamos Ser Realizadores De...
Vamos Ser Realizadores De...Vamos Ser Realizadores De...
Vamos Ser Realizadores De...
 
El Retiro
El RetiroEl Retiro
El Retiro
 
Plan de aula estadistica grado noveno p1 iecc 2015 v001 christian marin
Plan de aula estadistica grado noveno p1  iecc 2015 v001 christian marinPlan de aula estadistica grado noveno p1  iecc 2015 v001 christian marin
Plan de aula estadistica grado noveno p1 iecc 2015 v001 christian marin
 
Practica social del lenguaje
Practica social del lenguaje Practica social del lenguaje
Practica social del lenguaje
 
Paisajes Provincia Huelva
Paisajes Provincia HuelvaPaisajes Provincia Huelva
Paisajes Provincia Huelva
 
Sociales, I.E.S. La Escribana
Sociales, I.E.S. La EscribanaSociales, I.E.S. La Escribana
Sociales, I.E.S. La Escribana
 
La paradoja
La paradojaLa paradoja
La paradoja
 
Como pueden los que no podian
Como pueden los que no podianComo pueden los que no podian
Como pueden los que no podian
 
Projecte d'ensenyament de la llengua d'acollida
Projecte d'ensenyament de la llengua d'acollidaProjecte d'ensenyament de la llengua d'acollida
Projecte d'ensenyament de la llengua d'acollida
 
Sandpapir Nr. 37 1957
Sandpapir Nr. 37 1957Sandpapir Nr. 37 1957
Sandpapir Nr. 37 1957
 
Art journal presentacion
Art journal presentacionArt journal presentacion
Art journal presentacion
 
Juegos educativos exposición
Juegos educativos exposiciónJuegos educativos exposición
Juegos educativos exposición
 
Simplicidade nos Testes de Usabilidade
Simplicidade nos Testes de UsabilidadeSimplicidade nos Testes de Usabilidade
Simplicidade nos Testes de Usabilidade
 
Verdade absoluta
Verdade absolutaVerdade absoluta
Verdade absoluta
 

Similar a Entorno visual p2

Tutorial de com hacer un cinemagraph
Tutorial de com hacer un cinemagraphTutorial de com hacer un cinemagraph
Tutorial de com hacer un cinemagraphcoraleitor12
 
UNIDAD 3 tic_4_eso
UNIDAD 3 tic_4_esoUNIDAD 3 tic_4_eso
UNIDAD 3 tic_4_esoortizvilla
 
Xna game studio presentación 02
Xna game studio   presentación 02Xna game studio   presentación 02
Xna game studio presentación 02Juan Cardona
 
Tutorial de monkey_jam
Tutorial de monkey_jamTutorial de monkey_jam
Tutorial de monkey_jamETT técnico
 
E book en-pdf-tutorial-pixinsight-core-18-primera-toma-de-contacto
E book en-pdf-tutorial-pixinsight-core-18-primera-toma-de-contactoE book en-pdf-tutorial-pixinsight-core-18-primera-toma-de-contacto
E book en-pdf-tutorial-pixinsight-core-18-primera-toma-de-contactobarceloq
 
Material Capacitación Taller "Las TICs y el Arte"
Material Capacitación Taller "Las TICs y el Arte"Material Capacitación Taller "Las TICs y el Arte"
Material Capacitación Taller "Las TICs y el Arte"educaespcba
 
Utp pdi_2014-2 lab2
 Utp pdi_2014-2 lab2 Utp pdi_2014-2 lab2
Utp pdi_2014-2 lab2jcbp_peru
 
Artículo técnico sobre Synfig
Artículo técnico sobre SynfigArtículo técnico sobre Synfig
Artículo técnico sobre SynfigMery Quille
 
HTML Tour - Programación de Videojuegos HTML5
HTML Tour - Programación de Videojuegos HTML5HTML Tour - Programación de Videojuegos HTML5
HTML Tour - Programación de Videojuegos HTML5Plain Concepts
 

Similar a Entorno visual p2 (20)

Tutorial de com hacer un cinemagraph
Tutorial de com hacer un cinemagraphTutorial de com hacer un cinemagraph
Tutorial de com hacer un cinemagraph
 
UNIDAD 3 tic_4_eso
UNIDAD 3 tic_4_esoUNIDAD 3 tic_4_eso
UNIDAD 3 tic_4_eso
 
Xna game studio presentación 02
Xna game studio   presentación 02Xna game studio   presentación 02
Xna game studio presentación 02
 
Tutorial de monkey_jam
Tutorial de monkey_jamTutorial de monkey_jam
Tutorial de monkey_jam
 
Práctica 8
Práctica 8Práctica 8
Práctica 8
 
Tp 1 gimp
Tp 1 gimpTp 1 gimp
Tp 1 gimp
 
Canvas
CanvasCanvas
Canvas
 
E book en-pdf-tutorial-pixinsight-core-18-primera-toma-de-contacto
E book en-pdf-tutorial-pixinsight-core-18-primera-toma-de-contactoE book en-pdf-tutorial-pixinsight-core-18-primera-toma-de-contacto
E book en-pdf-tutorial-pixinsight-core-18-primera-toma-de-contacto
 
Material Capacitación Taller "Las TICs y el Arte"
Material Capacitación Taller "Las TICs y el Arte"Material Capacitación Taller "Las TICs y el Arte"
Material Capacitación Taller "Las TICs y el Arte"
 
Gis burga
Gis   burgaGis   burga
Gis burga
 
Utp pdi_2014-2 lab2
 Utp pdi_2014-2 lab2 Utp pdi_2014-2 lab2
Utp pdi_2014-2 lab2
 
Ex7
Ex7Ex7
Ex7
 
Ex7
Ex7Ex7
Ex7
 
Resumen
ResumenResumen
Resumen
 
Presentacion1001
Presentacion1001Presentacion1001
Presentacion1001
 
Presentacion1001
Presentacion1001Presentacion1001
Presentacion1001
 
Artículo técnico sobre Synfig
Artículo técnico sobre SynfigArtículo técnico sobre Synfig
Artículo técnico sobre Synfig
 
Applets.pdf
Applets.pdfApplets.pdf
Applets.pdf
 
HTML Tour - Programación de Videojuegos HTML5
HTML Tour - Programación de Videojuegos HTML5HTML Tour - Programación de Videojuegos HTML5
HTML Tour - Programación de Videojuegos HTML5
 
Tutorial de Java
Tutorial de JavaTutorial de Java
Tutorial de Java
 

Entorno visual p2

  • 1. Programación 2 Unidad 03 – Entorno Visual
  • 2. Logro 3 – Entorno Visual Unidad Al finalizar la unidad, el alumno utiliza controles predefinidos por el lenguaje, componentes gráficos, buffers, imágenes y Sprites, de manera precisa y eficaz, en el diseño y construcción de Programas Orientados a Objetos de entorno visual con interfaz profesional y agradable para el usuario.
  • 4. Parpadeo  Cuando hacemos una aplicación que tiene muchos dibujos o animaciones, es muy probable que se muestre un ligero parpadeo en los elementos dando la impresión de que no el dibujo no es continuo.  Esto se debe a que el dibujo se está mostrando en todas sus etapas de construcción en lugar de simplemente mostrar el resultado final.
  • 5. Parpadeo - Explicación  Imaginemos que queremos mostrar en pantalla 100 rectángulos en distintas posiciones:  En el timer colocaríamos el siguiente código: Graphics ^g = this->CreateGraphics(); g->Clear(Color::White); for (int i=0; i<100; i++) { if (i % 2 == 0) g->FillRectangle(Brushes::Red, i*2, i*2, 50, 50); else g->FillRectangle(Brushes::Lime, i*2, i*2, 50, 50); } delete g;
  • 6. Parpadeo – Explicación  El código mostrado mostraría los 100 rectángulos, sin embargo no se mostrarían de una forma limpia sino que aparecería un pequeño parpadeo.  Este parpadeo se debe a que cada vez que se llama al método FillRectangle, no solo se está pintando el rectángulo sino que se está mostrando en pantalla, por lo que se nos presentan 100 imágenes distintas en un periodo muy corto dándonos así un efecto de parpadeo.
  • 7. Parpadeo – Explicación  En realidad se nos están mostrando todas estas imágenes en un tiempo muy corto: 1 2 3 4 5 6 • Estas son solo las primeras 6 imágenes que se nos muestran antes de que obtengamos el resultado con los 100 rectángulos. (Falta mostrar 94 imágenes). • Y esto es tan solo la primera pasada. Cuando estamos dentro de un timer este procedimiento se repetirá muchas veces. Tenga en cuenta que en la segunda pasada del timer, en lugar de solamente mostrarnos 200 rectángulos nos está mostrando más de 10,000 rectángulos.
  • 8. Como evitar el parpadeo  Para evitar el parpadeo, es necesario crear un Buffer de canvas. Es decir, un canvas que no se muestre en pantalla pero que ofrezca la misma funcionalidad.  Una vez creado este canvas invisible podemos dibujar lo que queramos sobre él sin temor a que se muestre en pantalla.  Una vez terminado todo el dibujo podemos mostrarlo de forma completa en una sola pasada.
  • 9. El Buffer Buffer Creamos un buffer del tamaño del original Dibujamos todo en el buffer Pasamos el Buffer con los 100 rectángulos al canvas visible del formulario haciendo que los 100 se muestren 1 sola vez.
  • 10. Como crear el Buffer // Creamos los graficos del formulario Graphics ^g = this->CreateGraphics(); // Guardamos las dimensiones para facil acceso int gWidth = (int)g->VisibleClipBounds.Width; int gHeight = (int)g->VisibleClipBounds.Height; // Reservamos un espacio para poner el Buffer BufferedGraphicsContext ^espacioBuffer = BufferedGraphicsManager::Current; // Colocamos el tamaño máximo del Buffer // el +1 es para evitar errores de memoria. espacioBuffer->MaximumBuffer = System::Drawing::Size( gWidth + 1, gHeight + 1 ); // Creamos un canvas dentro del espacio del buffer utilizando el canvas // del formulario BufferedGraphics ^buffer = espacioBuffer->Allocate( g, Drawing::Rectangle(0, 0, gWidth, gHeight)); // A partir de aquí todo los dibujos se deben realizar en el Canvas del Buffer // buffer->Graphics buffer->Graphics->Clear(Color::White); for (int i=0; i<100; i++) buffer->Graphics->FillRectangle((i % 2 == 0) ? Brushes::Red : Brushes::Lime, i*2, i*2, 50, 50); // Pasamos el buffer terminado al canvas visible buffer->Render(g); // Limpiamos la memoria reservada delete buffer; delete espacioBuffer; delete g;
  • 11. Método Alternativo - Buffer Imagen Creamos una imagen Dibujamos todo en la imagen Pintamos la imagen completa en el canvas del formulario
  • 12. Método Alternativo - Buffer  Otra forma de evitar el parpadeo es simular el uso de un buffer con una imagen.  Cabe resaltar que este método no es un buffer pero para efectos del curso nos ofrece la misma funcionalidad.  Funciona más lento que un buffer pero imperceptible para el tipo de programas a realizar en el curso.
  • 13. Método Alternativo - Buffer //crear un canvas    Graphics ^canvas = this->CreateGraphics(); //Asegurarse que la ventana no esta minimizada if(canvas->VisibleClipBounds.Width>0 && canvas->VisibleClipBounds.Height >0) { // crear una imagen Bitmap ^imagen = gcnew Bitmap (canvas->VisibleClipBounds.Width,canvas->VisibleClipBounds.Height); //crear un canvas para pintar en la imagen Graphics ^CanvasImagen = Graphics::FromImage(imagen); // todo se pinta ahora en el canvas de la imagen  CanvasImagen->Clear(Color::Black); for ( int i =0; i <100;i++) CanvasImagen->FillRectangle((i % 2 == 0) ? Brushes::Red : Brushes::Lime, i*2, i*2, 50, 50); // este seria el "render" pintar la imagen en pantalla canvas->DrawImage(imagen,0,0); delete CanvasImagen; delete imagen; } delete canvas;
  • 15. Sprites  Un sprite, es una imagen que está dividida en secciones formando una secuencia de movimiento.  Si pasamos rapidamente por cada una de las secciones del sprite podemos ver que se genera una animación.
  • 16. Sprites - Dimensiones  Un sprite tiene las siguientes dimensiones: Indice Imagen: 0 1 2 3 Alto del Sprite Ancho Ancho Ancho Ancho imagen imagen imagen imagen Ancho del Sprite Ancho Imagen = Ancho del Sprite / # imagenes Imagen X1 = Ancho Imagen * Indice Imagen Imagen X2 = Ancho Imagen * (Indice Imagen + 1)
  • 17. Sprites – Método de dibujo  Debemos tener una variable que almacene el índice de la imagen a mostrar.  El índice deberá ir avanzando en cada iteración del timer en 1 de forma cíclica: 0, 1, 2, 3, 0, 1, 2, 3 …  En cada iteración del timer se deberá mostrar la imagen de acuerdo al índice.
  • 18. Ejemplo del evento Timer Tick  Para este caso asumiremos que en nuestro formulario se ha declarado una variable int indice; y se ha inicializado con 0. // El pictureBox contiene al Sprite y está en SizeMode = AutoSize int anchoImagen = pictureBox1->Width / 4; int altoImagen = pictureBox1->Height; buffer->Graphics->Clear(Color::White); // Declaramos un rectangulo con las dimensiones del pedazo del sprite a utilizar Drawing::Rectangle porcionAUsar = Drawing::Rectangle(anchoImagen * indice, 0, anchoImagen, altoImagen); // Dibujamos la imagen en la posicion 50, 50 buffer->Graphics->DrawImage(pictureBox1->Image, 50, 50, porcionAUsar, GraphicsUnit::Pixel); // Aumentamos el indice indice++; if (indice >= 4) indice = 0;
  • 19. Transparencia  El único problema con este método es que pinta el fondo blanco de la imagen.  Para eliminar este fondo necesitamos crear una imagen que tenga como fondo un color que no esté presente en la imagen:
  • 20. Ejemplo del evento Timer Tick con transparencia // El pictureBox contiene al Sprite y está en SizeMode = AutoSize int anchoImagen = pictureBox1->Width / 4; int altoImagen = pictureBox1->Height; buffer->Graphics->Clear(Color::White); // Creamos una imagen de tipo bitmap para generar la transparencia Bitmap^ imgTransparente = gcnew Bitmap( pictureBox1->Image ); // Le aplicamos transparencia tomando como referencia el pixel de la // esquina superior izquierda imgTransparente->MakeTransparent( imgTransparente->GetPixel( 1, 1 ) ); // Declaramos un rectangulo con las dimensiones del pedazo del sprite a utilizar Drawing::Rectangle porcionAUsar = Drawing::Rectangle(anchoImagen * indice, 0, anchoImagen, altoImagen); // Dibujamos la imagen en la posicion 50, 50 buffer->Graphics->DrawImage(imgTransparente, 50, 50, porcionAUsar, GraphicsUnit::Pixel); // Aumentamos el indice indice++; if (indice >= 4) indice = 0; // Limpiamos la memoria delete imgTransparente;