private void OnPaint(object sender, PaintEventArgs args) { var tintedBrush = new SolidBrush(Color.FromArgb(100, 0, 0, 0)); if (State == null) { return; } args.Graphics.InterpolationMode = InterpolationMode.NearestNeighbor; args.Graphics.CompositingMode = CompositingMode.SourceOver; args.Graphics.SmoothingMode = SmoothingMode.None; args.Graphics.PixelOffsetMode = PixelOffsetMode.HighSpeed; args.Graphics.CompositingQuality = CompositingQuality.HighSpeed; var playerVisible = State.Player.VisiblePoints; var tiles = State.CurrentFloor.Tiles; foreach (var point in playerVisible) { if (Viewport.ContainsTile(point)) { Rectangle dest = Viewport.TranslatePoint(point); var source = spriteRects[tiles[point].SpriteId]; args.Graphics.DrawImage(Sprites, dest, source, GraphicsUnit.Pixel); } } foreach (var pair in State.CurrentFloor.Entities) { if (playerVisible.Contains(pair.Key) && Viewport.ContainsTile(pair.Key)) { Rectangle dest = Viewport.TranslatePoint(pair.Key); var source = spriteRects[pair.Value.SpriteId]; args.Graphics.DrawImage(Sprites, dest, source, GraphicsUnit.Pixel); } } var previouslySeen = State.Player.PreviouslySeen; foreach (var point in previouslySeen) { if (Viewport.ContainsTile(point)) { Rectangle dest = Viewport.TranslatePoint(point); var source = spriteRects[tiles[point].SpriteId]; args.Graphics.DrawImage(Sprites, dest, source, GraphicsUnit.Pixel); args.Graphics.FillRectangle(tintedBrush, dest); } } tintedBrush.Dispose(); }