Почему мой экран мигает, хотя у меня включена двойная буферизация? - PullRequest
0 голосов
/ 18 января 2019

Хорошо, я довольно новичок в графике c #, и я пытаюсь сделать что-то типа приключенческой игры сверху вниз.Проблема в том, что все, что отображается над мерцанием фона.Все это растровое изображение из файла PNG.Фон не мерцает, поэтому я не знаю, где я иду не так.Вот мой код:

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

namespace AITS
{
    public partial class Form1 : Form
    {
        Background background;
        Foreground foreground;
        Character player;
        Graphics g;

        public Form1()
        {
            InitializeComponent();
            Console.WriteLine(Environment.CurrentDirectory);
            background = new Background(Properties.Resources.background, Width, Height);
            foreground = new Foreground(100, Width);
            player = new Character();
            DoubleBuffered = true;


            Paint += DrawScreen;
            KeyDown += KeyPressed;
            Shown += Form1_Shown;

            g = CreateGraphics();

        }

        private void Form1_Shown(Object sender, EventArgs e)
        {
            gameLoop();
        }

        private void DrawScreen(object sender, PaintEventArgs args)
        {
                background.Draw(g);
                player.Draw(g);
                foreground.Update(Height, Width);
                foreground.Draw(g);
        }

        private void KeyPressed(object sender, KeyEventArgs e)
        {
            Console.WriteLine(e.KeyData.ToString());
        }

        public void gameLoop()
        {
            while (this.Created)
            {
                Invalidate();
                Refresh();
                Application.DoEvents();

            }   
        }
    }
}

РЕДАКТИРОВАТЬ: Хорошо, я нашел ответ, для тех, кто не может найти это, как я: g should = args.Graphics.НЕ используйте CreateGraphics ()!

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Хорошо, я нашел ответ для тех, кто не может найти это, как я: g should = args.Graphics. НЕ используйте CreateGraphics ()!

0 голосов
/ 18 января 2019

Экран мерцает, потому что форма сначала перерисовывает фон, а затем позволяет рисовать на нем.

Вы можете приостановить это поведение, переопределив WndProc:

private const int WM_ERASEBKGND = 20;        
protected override void WndProc(ref Message m)
{
    if (m.Msg == WM_ERASEBKGND)
    {
        m.Result = IntPtr.Zero;
    }
    else
    {
        base.WndProc(ref m);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...