Tôi đang cố thực hiện phương pháp sau: void Ball :: DrawOn (Graphics g);Đệm đôi C#
Phương pháp nên vẽ tất cả các vị trí trước đó (được lưu trữ trong hàng đợi) của quả bóng và cuối cùng là vị trí hiện tại. Tôi không biết nếu có vấn đề, nhưng tôi in các địa điểm trước đó bằng cách sử dụng g.DrawEllipse (...) và vị trí hiện tại bằng cách sử dụng g.FillEllipse (...).
Câu hỏi đặt ra là, như bạn có thể tưởng tượng có rất nhiều bản vẽ cần thực hiện và do đó màn hình bắt đầu nhấp nháy nhiều. Tôi đã tìm kiếm một cách để tăng gấp đôi bộ đệm, nhưng tất cả những gì tôi có thể tìm thấy là 2 cách sau:
1) System.Windows.Forms.Control.DoubleBuffered = true;
2) SetStyle (ControlStyles.DoubleBuffer | ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint, true);
trong khi cố gắng sử dụng giá trị đầu tiên, tôi nhận được lỗi giải thích rằng từ trong phương thức này, Thuộc tính DoubleBuffered không thể truy cập được do mức độ bảo vệ của nó. Trong khi tôi không thể tìm cách sử dụng phương thức SetStyle.
Hoàn toàn có thể tăng gấp đôi bộ đệm trong khi tất cả quyền truy cập Tôi có là đối tượng đồ họa tôi nhận làm đầu vào trong phương pháp không?
Cảm ơn trước,
Edit: tôi đã tạo ra lớp sau
namespace doubleBuffer
{
class BufferedBall : System.Windows.Forms.Form{
private Ball ball;
public BufferedBall(Ball ball)
{
this.ball = ball;
}
public void DrawOn(Graphics g){
this.DoubleBuffered = true;
int num = 0;
Rectangle drawArea1 = new Rectangle(5, 35, 30, 100);
LinearGradientBrush linearBrush1 =
new LinearGradientBrush(drawArea1, Color.Green, Color.Orange, LinearGradientMode.Horizontal);
Rectangle drawArea2 = new Rectangle(5, 35, 30, 100);
LinearGradientBrush linearBrush2 =
new LinearGradientBrush(drawArea2, Color.Black, Color.Red, LinearGradientMode.Vertical);
foreach (PointD point in ball.previousLocations)
{
Pen myPen1;
if (num % 3 == 0)
myPen1 = new Pen(Color.Yellow, 1F);
else if (num % 3 == 1)
myPen1 = new Pen(Color.Green, 2F);
else
myPen1 = new Pen(Color.Red, 3F);
num++;
myPen1.DashStyle = System.Drawing.Drawing2D.DashStyle.Solid;
myPen1.StartCap = System.Drawing.Drawing2D.LineCap.RoundAnchor;
myPen1.EndCap = System.Drawing.Drawing2D.LineCap.AnchorMask;
g.DrawEllipse(myPen1, (float)(point.X - ball.radius), (float)(point.Y + ball.radius), (float)(2 * ball.radius), (float)(2 * ball.radius));
}
if ((ball.Host.ElapsedTime * ball.Host.FPS * 10) % 2 == 0){
g.FillEllipse(linearBrush1, (float)(ball.Location.X - ball.radius), (float)(ball.Location.Y + ball.radius), (float)(2 * ball.radius), (float)(2 * ball.radius));
}else{
g.FillEllipse(linearBrush2, (float)(ball.Location.X - ball.radius), (float)(ball.Location.Y + ball.radius), (float)(2 * ball.radius), (float)(2 * ball.radius));
}
}
}
}
và bóng drawOn trông như thế này:
new BufferedBall(this).DrawOn(g);
Là Ý của bạn là gì? bởi vì nó vẫn còn nhấp nháy?
Vâng, cách SetStyle() là chính xác và bạn đang thực hiện chính xác. AFAIK, thuộc tính DoubleBuffered không được sử dụng (SetStyle được ưa thích), nhưng bạn luôn có thể phân lớp Control/Form/bất cứ điều gì và sử dụng nó ở đó (nó được bảo vệ). – sunside