Estoy tratando de implementar el siguiente método: void Ball :: DrawOn (Graphics g);Doble buffering C#
El método debe dibujar todas las ubicaciones previas (almacenadas en una cola) de la bola y finalmente la ubicación actual. No sé si eso importa, pero imprimo las ubicaciones anteriores usando g.DrawEllipse (...) y la ubicación actual usando g.FillEllipse (...).
La cuestión es que, como se podría imaginar, hay que hacer un gran esfuerzo y, por lo tanto, la pantalla comienza a parpadear mucho. Había buscado una forma de duplicar el búfer, pero todo lo que pude encontrar es estas 2 formas:
1) System.Windows.Forms.Control.DoubleBuffered = true;
2) SetStyle (ControlStyles.DoubleBuffer | ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint, true);
al intentar utilizar el primero, aparece un error que explica que en este método, la propiedad DoubleBuffered es inaccesible debido a su nivel de protección. Aunque no puedo entender cómo usar el método SetStyle.
¿Es posible en absoluto a la memoria intermedia doble, mientras que todo el acceso que tengo es que el Objeto de Gráficos consigo como entrada en el método?
Gracias de antemano,
Editar: que había creado la siguiente clase
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));
}
}
}
}
y la pelota drawOn se ve así:
new BufferedBall(this).DrawOn(g);
es eso ¿lo que quisiste decir? porque todavía está parpadeando?
Bueno, el modo SetStyle() es correcto, y lo estás haciendo correctamente. AFAIK, la propiedad DoubleBuffered no se debe usar (se prefiere SetStyle), pero siempre se puede subclasificar el Control/Formulario/lo que sea y usarlo allí (está protegido). – sunside