2013-11-12 2 views
1

Каждый раз, когда я пытаюсь добавить новую строку или переместить весло в этой игре, экран мерцает.Как сохранить анимацию от мерцания в программировании на C#?

Как заставить экран мерцать, когда я перемещаю весло или добавляю линию?

using System; 

using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

namespace WindowsFormsApplication2 
{ 
public partial class GameTest : Form 
{ 
    int dx=3, dy=3, i =500, o = 100; 

    int rex = 400, rey = 450 ; 
     double c =0; 


    public GameTest() 
    { 

     InitializeComponent(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     Graphics g = this.CreateGraphics(); 
     Invalidate(); 
    } 

    private void Form1_KeyDown(object sender, KeyEventArgs e) 
    { 
     Graphics g = this.CreateGraphics(); 
     if (e.KeyCode == Keys.Left) 
     { 

      //Graphics g = this.CreateGraphics(); 


      Invalidate(); 
      Brush black = new SolidBrush(Color.White); 
      g.FillRectangle(black, rex, rey, 200, 20); 

      rex -= 40; 
      Brush red = new SolidBrush(Color.Green); 
      g.FillRectangle(red, rex, rey, 200, 20); 




     } 
     if (e.KeyCode == Keys.Right) 
     { 


      //Graphics g = this.CreateGraphics(); 



      Brush white = new SolidBrush(Color.White); 
      g.FillRectangle(white, rex, rey, 200, 20); 

      rex += 40; 
      Brush red = new SolidBrush(Color.Green); 
      g.FillRectangle(red, rex, rey, 200, 20); 

     } 
    } 



    private void Form1_Paint(object sender, PaintEventArgs e) 
    { 
     DoubleBuffered = false; 

     Graphics g = this.CreateGraphics(); 
     // Bitmap bmp1 = new Bitmap("G:\c#\Bouncing ball\Pic.jpg"); 
     //TextureBrush tb2 = new TextureBrush(bmp1); 

     Brush green = new SolidBrush(Color.Green); 
      g.FillRectangle(green, rex, rey, 200, 20); 

      Graphics b= this.CreateGraphics(); 

      Brush red = new SolidBrush(Color.Red); 

      b.FillEllipse(red, i, o, 20, 20); 



     Pen p = new Pen(Color.Black, 10); 
     // 
      g.DrawLine(p, 1000, 480,0,480); 
      g.DrawLine(p, 1000, 485, 1000, 0); 

     g .DrawLine(p, 0,480, 0, 0); 
    } 


    private void timer1_Tick(object sender, EventArgs e) 
    { 
     DoubleBuffered = false; 
     // int dx=3, dy=3, i = 300, o = 50; 

     i += dx; 


     if (i < 0) 
     { 
      dx = -dx; 
     } 

     else if (i + 50 > 1000) 
     { 
      dx = -dx; 
     } 



     o += dy; 

     if ((o +20>= rey) &&(i+20<=rex+200)&&(i+20>=rex)) 
     { 
      //int rex = 400, rey = 450; RECTANGLE 
      // int dx=3, dy=3, i(x) = 500, o(y) = 100; 

      dy =-dy; 
      //c++; 
      //label1.Text = c.ToString(); 
     } 


      // Misgeret\\ 
      if (o < 0) 
      { 
       dy = -dy; 
      } 
      // Misgeret\\ 
      else if (o + 50 > 600) 
      { 
       dy = -dy; 
      } 
      this.Invalidate(); 



    } 

    private void label1_Click(object sender, EventArgs e) 
    { 
     label1.Text = c.ToString(); 
    } 
} 
} 
+3

Почему вы используете этот 'DoubleBuffered = ложь;'? –

+4

winforms не поддерживает анимацию и не является подходящей платформой для разработки игр, ни для чего-либо еще, о чем я могу думать. Используйте 'WPF' для пользовательских интерфейсов Windows и' XNA' для разработки игр на C# или просто 'C++' DirectX hardcore для серьезных игр. –

+2

Вы создаете *** много *** одноразовых предметов и неправильно обрабатываете их. Вы будете получать ошибки OutOfMemoryException, если вы позволите своей программе работать какое-то время. Вы действительно не должны создавать графические объекты вообще и выполнять всю свою работу, используя свойство графики, переданное в события «Paint». –

ответ

3

Я заметил, что вы устанавливаете DoubleBuffered в false в нескольких областях вашей программы. Это определенно не помогает, поскольку вся причина использовать двойную буферизацию - предотвратить мерцание.

Другое дело, что вы создаете контексты графики и рисуете в нескольких местах вашего приложения. Попробуйте реорганизовать свой код только для рисования в обработчике событий OnPaint() формы и не создавать новый контекст графики. Используйте тот, который указан в PaintEventArgs события OnPaint().

private void Form1_Paint(object sender, PaintEventArgs e) 
{ 
    Graphics g = e.Graphics; 

    using(Brush green = new SolidBrush(Color.Green)) 
    { 
     g.FillRectangle(green, rex, rey, 200, 20); 
    } 

    // .. etc, etc..   
} 

Затем, когда вам нужно форму, чтобы быть перекрашены вам просто нужно вызвать метод Invalidate(), чтобы сказать GDI, который должен быть перекрашен ваша форма, или часть его,. Это, в свою очередь, вызовет событие Paint и вызовет вызов OnPaint().

Как примечание @HighCore в комментариях, WinForms определенно не является подходящей основой для создания игры. Для игр попробуйте инфраструктуру XNA или одну из нескольких открытых исходных кодов, доступных в Интернете, таких как Unity

UPDATE

для предотвращения мерцания вы можете использовать автоматическую двойную буферизацию для вашей формы. Это может быть включено в виде конструктора, после вызова InitializeComponent(), используя вызов SetStyle:

SetStyle(ControlStyles.AllPaintingInWmPaint 
     | ControlStyles.UserPaint 
     | ControlStyles.DoubleBuffer , true); 
+1

Do ** NOT ** dispose 'e.Graphics', удаляйте только графический объект, если вы его создали, переданный как свойство другого объекта ('PaintEventArgs'), вы должны позволить родителям его распоряжаться (однако вы действительно ** должны ** избавляться от созданного вами объекта' Brush'). –

+0

@ScottChamberlain, вы правы .. обновил ответ! –

+0

ya Я сделал это ложным, потому что сначала он был правдивым, и он начал мерцать еще больше – user2985089

Смежные вопросы