मैं निम्नलिखित विधि को लागू करने की कोशिश कर रहा हूं: शून्य बॉल :: DrawOn (ग्राफिक्स जी);डबल बफरिंग सी #
विधि को गेंद के सभी पिछले स्थानों (एक कतार में संग्रहीत) और आखिरकार वर्तमान स्थान को आकर्षित करना चाहिए। मुझे नहीं पता कि यह मायने रखता है, लेकिन मैं g.DrawEllipse (...) और g.FillEllipse (...) का उपयोग कर वर्तमान स्थान का उपयोग कर पिछले स्थानों को मुद्रित करता हूं।
सवाल यह है कि, जैसा कि आप कल्पना कर सकते हैं कि बहुत सारे ड्राइंग किए जा रहे हैं और इस तरह डिस्प्ले ज्यादा झिलमिलाहट शुरू हो जाता है। मैंने डबल बफर करने के लिए एक रास्ता खोजा था, लेकिन मुझे यह सब मिल सकता है:
1) System.Windows.Forms.Control.DoubleBuffered = true;
2) सेट स्टाइल (कंट्रोल स्टाइल। डबलबफर | कंट्रोलस्टाइल.उसरपेन्ट | कंट्रोलस्टाइल। ऑलपैंटिंगइन डब्लूएमपीेंट, सच);
पहले उपयोग करने का प्रयास करते समय, मुझे यह समझने में त्रुटि मिलती है कि इस विधि से संपत्ति डबलबफर्ड अपने सुरक्षा स्तर के कारण पहुंच योग्य नहीं है। जबकि मैं सेट स्टाइल विधि का उपयोग कैसे नहीं कर सकता।
यह जबकि सभी पहुँच मेरे पास करने के लिए ग्राफिक्स वस्तु मैं विधि में इनपुट के रूप में मिलता है संभव सब पर डबल बफर करने के लिए है?
अग्रिम धन्यवाद,
संपादित करें: मैं बनाया था निम्नलिखित वर्ग
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));
}
}
}
}
और गेंद drawOn इस तरह दिखता है:
new BufferedBall(this).DrawOn(g);
कि है अपका क्या मतलब था? क्योंकि यह अभी भी झटकेदार है?
ठीक है, SetStyle() तरीका सही है, और आप इसे सही कर रहे हैं। AFAIK, DoubleBuffered संपत्ति का उपयोग नहीं किया जाना चाहिए (SetStyle को प्राथमिकता दी जाती है), लेकिन आप हमेशा नियंत्रण/फॉर्म/जो कुछ भी इसका उपयोग कर सकते हैं और इसका उपयोग कर सकते हैं (यह संरक्षित है)। – sunside