/// <summary>
/// Recorta un rectangulo de un AnimateSprite y recalcula la
/// coordenada inisial de dibujo para adecuarlos a los
/// limites de resolucion de pantalla actuales, se debe usar como ultimo
/// paso antes del blitting.
/// </summary>
/// <param name="currentDestination">
/// Se modifica por referencia, se recalculan las coordenadas
/// para que se adecuen a los limites de resolucion de pantalla
/// actuales y al rectangulo de dibujo recalculado.
/// </param>
/// <param name="spriteRect">
/// Se modifica por referencia, se recalculan los cuatro
/// puntos del rectangulo para lea solo el area de superficie
/// que sera bliteada a otra superficie posteriormente
/// </param>
/// <returns>
/// Retorna true si el rectangulo resultante es visible en pantalla,
/// y false si el rectangulo no sera visible en pantalla.
/// </returns>
private bool SpriteClipper(ref Point currentDestination, ref Rectangle spriteRect)
{
if( (currentDestination.X + spriteRect.Width) <= 0 || currentDestination.X > ancho || (currentDestination.Y + spriteRect.Height) < 0 || currentDestination.Y > alto)
return false;
#region Clipear en X
if(currentDestination.X < 0)
{
spriteRect.X = spriteRect.X - currentDestination.X ;
spriteRect.Width = spriteRect.Width + currentDestination.X;
if(spriteRect.X >= spriteRect.Right)
spriteRect.X = spriteRect.Right -1;
if(spriteRect.X < 0)
spriteRect.X = 0;
if(spriteRect.Width < 1)
spriteRect.Width = 1;
currentDestination.X = 0;
}
if((currentDestination.X + spriteRect.Width) > ancho)
{
spriteRect.Width-= currentDestination.X + spriteRect.Width - ancho;
if(spriteRect.Width <= 0)
spriteRect.Width = 1;
if(currentDestination.X >= ancho)
currentDestination.X = ancho - spriteRect.Width;
}
#endregion
#region Clipear en Y
if(currentDestination.Y < 0)
{
spriteRect.Y = spriteRect.Y - currentDestination.Y ;
spriteRect.Height = spriteRect.Height + currentDestination.Y;
if(spriteRect.Y >= spriteRect.Bottom)
spriteRect.Y = spriteRect.Bottom -1;
if(spriteRect.Y < 0)
spriteRect.Y = 0;
if(spriteRect.Height < 1)
spriteRect.Height = 1;
currentDestination.Y = 0;
}
if(currentDestination.Y > (alto - spriteRect.Height))
{
spriteRect.Height -= currentDestination.Y + spriteRect.Height - alto;
if(spriteRect.Height <= 0)
spriteRect.Height = 1;
if(currentDestination.Y >= alto)
currentDestination.Y = alto - spriteRect.Height;
}
#endregion
return true;
}