Сравнительное объектно-ориентированное проектирование - 53 стр.

UptoLike

Составители: 

53
/// <remarks>
/// След спрайта изображается в виде пикселя измененного цвета в точке,
/// где находился центр спрайта на момент его перемещения.
/// </remarks>
public void PutTrace()
{
for (int i = Sprites.Count - 1; i >= 0; i--)
if (Sprites[i].Visible &&
Sprites[i].SpriteRect.Contains(center))
Sprites[i].Restore();
if (!((TracedSpriteList)Sprites).TraceMap[center.X - Sprites.ClientRect.Left]
[center.Y - Sprites.ClientRect.Top])
{
if (!traceColored)
using (Bitmap bitmap = new Bitmap(1, 1))
using (Graphics graphics = Graphics.FromImage(bitmap))
{
graphics.CopyFromScreen(Sprites.Parent.RectangleToScreen(
new Rectangle(center.X, center.Y, 1, 1)).Location,
new Point(), bitmap.Size);
Color clr = bitmap.GetPixel(0, 0);
using (Brush brush = new SolidBrush(
Color.FromArgb(0xff ^ clr.R, 0xff ^ clr.G, 0xff ^ clr.B)))
Sprites.Canvas.FillRectangle(brush, center.X, center.Y, 1, 1);
}
else
using (Brush brush = new SolidBrush(traceColor))
Sprites.Canvas.FillRectangle(brush, center.X, center.Y, 1, 1);
((TracedSpriteList)Sprites).TraceMap[center.X - Sprites.ClientRect.Left]
[center.Y - Sprites.ClientRect.Top] = true;
tracePoints.Add(new Point(center.X, center.Y));
}
foreach (TracedSprite sprite in Sprites)
if (sprite.Visible && sprite.SpriteRect.Contains(center))
sprite.Paint();
}
/// <summary>
/// Очищает коллекцию точек следа спрайта.
/// </summary>
~TracedSprite()
{
if (TracePoints != null && TracePoints.Count > 0) TracePoints.Clear();
}
}
/// <summary>
/// Спрайт в форме заполненного эллипса, заданного цвета и градиента.
/// </summary>