• Miércoles 20 de Noviembre de 2024, 12:35

Autor Tema:  Re: clipper de backbuffer en modo windowed  (Leído 1401 veces)

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: clipper de backbuffer en modo windowed
« en: Lunes 8 de Septiembre de 2003, 16:35 »
0
Saludo nuevamente.

Estoy utilizando un clipper en una superficie offscreen, que utilizo de backbuffer, pero en modo windowed no me dibuja bien, se ve en pantalla como si se dibujara el clipper en vez de la superficie, porque se empieza a dibujar desde mas alla de el inicio de pantalla, pero lo que queda sin dibujar me muestra basura.

Alguien sabe que puede estar sucediendo?

Es posible dibujar una superficie con clippero sobre otra con clipper?

De no ser asi alguien sabe algun metodo para evitar errores al dibujar fuera de de una superficie fuera de la ppal.?

Gracias de antemano.

Juank
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
clipper de backbuffer en modo windowed
« Respuesta #1 en: Martes 14 de Octubre de 2003, 23:21 »
0
Bueno resulta que el clipper esta diseñado para trabajar en una superficie principal, no por su funcion de clipper como tal sino por los metodos y optimizaciones que implementa.

Asi que decidi no manejar ningun Clipper para las superficies no principales, y he diseñado una pequeña rutina que recorta el rectangulo correspondiente a las dimensiones de un frame de un sprite, de acuerdo a las dimensiones de la pantalla:

 
Código: Text
  1.  
  2.    /// <summary>
  3.    /// Recorta un rectangulo de un AnimateSprite y recalcula la
  4.    /// coordenada inisial de dibujo para adecuarlos a los
  5.    /// limites de resolucion de pantalla actuales, se debe usar como ultimo
  6.    /// paso antes del blitting.
  7.    /// </summary>
  8.    /// <param name="currentDestination">
  9.    /// Se modifica por referencia, se recalculan las coordenadas
  10.    /// para que se adecuen a los limites de resolucion de pantalla
  11.    /// actuales y al rectangulo de dibujo recalculado.
  12.    /// </param>
  13.    /// <param name="spriteRect">
  14.    /// Se modifica por referencia, se recalculan los cuatro
  15.    /// puntos del rectangulo para lea solo el area de superficie
  16.    /// que sera bliteada a otra superficie posteriormente
  17.    /// </param>
  18.    /// <returns>
  19.    /// Retorna true si el rectangulo resultante es visible en pantalla,
  20.    /// y false si el rectangulo no sera visible en pantalla.    
  21.    /// </returns>
  22.    private bool SpriteClipper(ref Point currentDestination, ref Rectangle spriteRect)
  23.    {
  24.       if( (currentDestination.X + spriteRect.Width) <= 0 || currentDestination.X > ancho || (currentDestination.Y + spriteRect.Height) < 0 || currentDestination.Y > alto)
  25.          return false;
  26.  
  27.       #region Clipear en X
  28.       if(currentDestination.X < 0)
  29.       {
  30.          spriteRect.X =  spriteRect.X - currentDestination.X ;
  31.          spriteRect.Width = spriteRect.Width + currentDestination.X;
  32.          
  33.          if(spriteRect.X >= spriteRect.Right)
  34.             spriteRect.X = spriteRect.Right -1;
  35.          if(spriteRect.X < 0)
  36.             spriteRect.X = 0;
  37.          if(spriteRect.Width < 1)
  38.             spriteRect.Width = 1;
  39.    
  40.          currentDestination.X = 0;
  41.       }
  42.  
  43.       if((currentDestination.X + spriteRect.Width) > ancho)
  44.       {
  45.          spriteRect.Width-= currentDestination.X + spriteRect.Width - ancho;
  46.          if(spriteRect.Width <= 0)
  47.             spriteRect.Width = 1;
  48.          
  49.          if(currentDestination.X >= ancho)
  50.                 currentDestination.X = ancho - spriteRect.Width;
  51.       }
  52.       #endregion
  53.       #region Clipear en Y
  54.       if(currentDestination.Y < 0)
  55.       {
  56.          spriteRect.Y =  spriteRect.Y - currentDestination.Y ;
  57.          spriteRect.Height = spriteRect.Height + currentDestination.Y;
  58.          
  59.          if(spriteRect.Y >= spriteRect.Bottom)
  60.             spriteRect.Y = spriteRect.Bottom -1;
  61.          if(spriteRect.Y < 0)
  62.             spriteRect.Y = 0;
  63.          if(spriteRect.Height < 1)
  64.             spriteRect.Height = 1;
  65.    
  66.          currentDestination.Y = 0;
  67.       }
  68.  
  69.       if(currentDestination.Y > (alto - spriteRect.Height))
  70.       {
  71.          spriteRect.Height -= currentDestination.Y + spriteRect.Height - alto;
  72.          if(spriteRect.Height <= 0)
  73.             spriteRect.Height = 1;
  74.          
  75.          if(currentDestination.Y >= alto)
  76.             currentDestination.Y = alto - spriteRect.Height;      
  77.       }
  78.       #endregion
  79.       return true;
  80.    }
  81.  
  82.  

Lo unico raro aqui es la clase AnimateSprite, que es una calse que diseñe para leer mi propio formato grafico desde un archivo, esta clse separa la imagen como bitmap y adicionalmente carga un colleccion con las coordenadas x, y, ancho y alto correspondientes a cada frame que exista en el bitmap

Es algo enrredado de explicar pero si ven lo unico que necesita de cada animateSprite son las coordenadas de cada rectangulo, para modificarlas antes de proceder a dibujar.

De esta manera se corrige el error al dibujar fuera de la superficie, porque ya no se dibuja nada por fuer de la superficie, simplemente se recorta y se utiliza solo lo que se ve en pantalla.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io