1

このゲームで新しい行を追加したり、パドルを動かそうとするたびに、画面がちらつきます。

パドルを動かしたり線を追加したりするときに画面がちらつかないようにするにはどうすればよいですか?

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();
    }
}
}
4

1 に答える 1

3

DoubleBufferedプログラムの複数の領域で false に設定していることに気付きました。ダブルバッファリングを使用する理由はちらつきを防ぐためであるため、これは間違いなく役に立ちません。

もう 1 つは、グラフィックス コンテキストを作成し、アプリケーション内の複数の場所で描画していることです。フォームのイベント ハンドラーのみを描画するようにコードをリファクタリングしOnPaint()、新しい Graphics コンテキストを作成しないようにしてください。イベント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 はゲームを作成するための適切なフレームワークではありません

アップデート

ちらつきを防ぐために、フォームに自動ダブルバッファリングを使用できます。InitializeComponent()これは、 への呼び出しの後に、 への呼び出しを使用して、フォーム コンストラクターで有効にすることができますSetStyle

 SetStyle( ControlStyles.AllPaintingInWmPaint
         | ControlStyles.UserPaint
         | ControlStyles.DoubleBuffer , true);
于 2013-11-12T21:27:35.373 に答える