Я сделал несколько изменений в классе Ball
для управления List<Color>
, чтобы можно было добавить больше цветов во время выполнения, некоторые свойства по умолчанию и поддержку IDisposable
.
Также улучшено качество рендеринга с использованием Graphics.SmoothingMode , установленным на AntiAlias
и Graphics.CompositingQuality , установленным на HighQuality
.
public class Ball : IDisposable
{
private SolidBrush brush = null;
private int PrivateState = 0;
public Ball()
: this(new Point(40, 40)) { }
public Ball(Point InitialPosition)
{
this.FillColorList();
this.Centre = InitialPosition;
this.Radius = 40;
this.brush = new SolidBrush(this.Colors[this.PrivateState]);
}
public Point Centre { get; set; }
public int State {
get { return this.PrivateState; }
set { this.PrivateState = (value < this.Colors.Count) ? value : 0; }
}
public int Radius { get; set; }
public List<Color> Colors { get; set; }
private void FillColorList()
{
this.Colors = new List<Color>() { Color.White, Color.Green, Color.Blue, Color.Red };
}
public void Draw(Graphics g)
{
this.brush.Color = this.Colors[this.PrivateState];
g.SmoothingMode = SmoothingMode.AntiAlias;
g.CompositingQuality = CompositingQuality.HighQuality;
g.FillEllipse(brush, Centre.X - Radius, Centre.Y - Radius, 2 * Radius, 2 * Radius);
}
public void Move(Point NewCentre) => this.Centre = NewCentre;
public void Dispose()
{
if (this.brush != null)
this.brush.Dispose();
}
}
Ваш Ball
объект по-прежнему является значением свойства, но вы можете использовать вместо него список, чтобы одновременно можно было управлять несколькими объектами.
Form
настройки:
(обратите внимание, что события Paint()
и FormClosing()
зарегистрированы в конструкторе Form
, поэтому убедитесь, что они не зарегистрированы в другом месте, если они не используются по каким-либо другим причинам).
public Form1()
{
InitializeComponent();
ball = new Ball(new Point(250, 250));
ball.State = 1; // <- Will draw a green ball
this.Paint += (s, e) => { ball.Draw(e.Graphics); };
this.FormClosing += (s, e) => { ball.Dispose(); };
}
public Ball ball { get; set; }
Если вы хотите переместить объект Ball
, установите новую позицию и вызовите this.Invalidate()
, чтобы вызвать событие Form
Paint()
:
ball.Colors.Add(Color.Orange);
ball.State = this.ball.Colors.Count - 1; // <- Will draw an orange ball
ball.Radius = [new Radius];
ball.Move(new Point([X], [Y]));
this.Invalidate();